Bug 1437004 - Vendored Rust dependencies;r?froydnj draft
authorDavid Teller <dteller@mozilla.com>
Wed, 04 Apr 2018 14:14:26 +0200
changeset 777850 6a5a780276eea8db4592e846b1dace4dd9a927e3
parent 777744 6826688772807b9903c278a5d6b50c32f1561b32
child 777851 057da8c4199f92c52d4e950d9142a18a2a83d54b
push id105306
push userdteller@mozilla.com
push dateThu, 05 Apr 2018 12:07:57 +0000
reviewersfroydnj
bugs1437004
milestone61.0a1
Bug 1437004 - Vendored Rust dependencies;r?froydnj MozReview-Commit-ID: Grf1bKIx2iT
Cargo.lock
Cargo.toml
third_party/rust/Inflector/.cargo-checksum.json
third_party/rust/Inflector/CHANGELOG.md
third_party/rust/Inflector/CONTRIBUTING.md
third_party/rust/Inflector/Cargo.toml
third_party/rust/Inflector/LICENSE.md
third_party/rust/Inflector/PULL_REQUEST_TEMPLATE.md
third_party/rust/Inflector/README.md
third_party/rust/Inflector/benchmark
third_party/rust/Inflector/src/cases/camelcase/mod.rs
third_party/rust/Inflector/src/cases/case/mod.rs
third_party/rust/Inflector/src/cases/classcase/mod.rs
third_party/rust/Inflector/src/cases/kebabcase/mod.rs
third_party/rust/Inflector/src/cases/mod.rs
third_party/rust/Inflector/src/cases/pascalcase/mod.rs
third_party/rust/Inflector/src/cases/screamingsnakecase/mod.rs
third_party/rust/Inflector/src/cases/sentencecase/mod.rs
third_party/rust/Inflector/src/cases/snakecase/mod.rs
third_party/rust/Inflector/src/cases/tablecase/mod.rs
third_party/rust/Inflector/src/cases/titlecase/mod.rs
third_party/rust/Inflector/src/cases/traincase/mod.rs
third_party/rust/Inflector/src/lib.rs
third_party/rust/Inflector/src/numbers/deordinalize/mod.rs
third_party/rust/Inflector/src/numbers/mod.rs
third_party/rust/Inflector/src/numbers/ordinalize/mod.rs
third_party/rust/Inflector/src/string/constants/mod.rs
third_party/rust/Inflector/src/string/deconstantize/mod.rs
third_party/rust/Inflector/src/string/demodulize/mod.rs
third_party/rust/Inflector/src/string/mod.rs
third_party/rust/Inflector/src/string/pluralize/mod.rs
third_party/rust/Inflector/src/string/singularize/mod.rs
third_party/rust/Inflector/src/suffix/foreignkey/mod.rs
third_party/rust/Inflector/src/suffix/mod.rs
third_party/rust/Inflector/tests/lib.rs
third_party/rust/Inflector/travis-after-success.sh
third_party/rust/ascii-canvas/.cargo-checksum.json
third_party/rust/ascii-canvas/Cargo.toml
third_party/rust/ascii-canvas/LICENSE-APACHE
third_party/rust/ascii-canvas/LICENSE-MIT
third_party/rust/ascii-canvas/README.md
third_party/rust/ascii-canvas/src/lib.rs
third_party/rust/ascii-canvas/src/row.rs
third_party/rust/ascii-canvas/src/style.rs
third_party/rust/ascii-canvas/src/test.rs
third_party/rust/atty-0.1.2/.cargo-checksum.json
third_party/rust/atty-0.1.2/.travis.yml
third_party/rust/atty-0.1.2/CHANGELOG.md
third_party/rust/atty-0.1.2/Cargo.toml
third_party/rust/atty-0.1.2/LICENSE
third_party/rust/atty-0.1.2/README.md
third_party/rust/atty-0.1.2/appveyor.yml
third_party/rust/atty-0.1.2/src/lib.rs
third_party/rust/binjs_meta/.cargo-checksum.json
third_party/rust/binjs_meta/Cargo.toml
third_party/rust/binjs_meta/README.md
third_party/rust/binjs_meta/examples/generate_spidermonkey.rs
third_party/rust/binjs_meta/src/export.rs
third_party/rust/binjs_meta/src/import.rs
third_party/rust/binjs_meta/src/lib.rs
third_party/rust/binjs_meta/src/spec.rs
third_party/rust/binjs_meta/src/util.rs
third_party/rust/bit-set/.cargo-checksum.json
third_party/rust/bit-set/.travis.yml
third_party/rust/bit-set/Cargo.toml
third_party/rust/bit-set/LICENSE-APACHE
third_party/rust/bit-set/LICENSE-MIT
third_party/rust/bit-set/README.md
third_party/rust/bit-set/deploy-docs.sh
third_party/rust/bit-set/src/lib.rs
third_party/rust/bit-vec/.cargo-checksum.json
third_party/rust/bit-vec/.travis.yml
third_party/rust/bit-vec/Cargo.toml
third_party/rust/bit-vec/LICENSE-APACHE
third_party/rust/bit-vec/LICENSE-MIT
third_party/rust/bit-vec/README.md
third_party/rust/bit-vec/benches/extern.rs
third_party/rust/bit-vec/crusader.sh
third_party/rust/bit-vec/deploy-docs.sh
third_party/rust/bit-vec/src/bench.rs
third_party/rust/bit-vec/src/lib.rs
third_party/rust/diff/.cargo-checksum.json
third_party/rust/diff/.travis.yml
third_party/rust/diff/Cargo.toml
third_party/rust/diff/LICENSE-APACHE
third_party/rust/diff/LICENSE-MIT
third_party/rust/diff/README.md
third_party/rust/diff/benches/benches.rs
third_party/rust/diff/examples/simple.rs
third_party/rust/diff/src/lib.rs
third_party/rust/diff/tests/tests.rs
third_party/rust/docopt/.cargo-checksum.json
third_party/rust/docopt/.travis.yml
third_party/rust/docopt/COPYING
third_party/rust/docopt/Cargo.toml
third_party/rust/docopt/LICENSE-MIT
third_party/rust/docopt/Makefile
third_party/rust/docopt/README.md
third_party/rust/docopt/UNLICENSE
third_party/rust/docopt/completions/docopt-wordlist.bash
third_party/rust/docopt/ctags.rust
third_party/rust/docopt/examples/cargo.rs
third_party/rust/docopt/examples/cp.rs
third_party/rust/docopt/examples/decode.rs
third_party/rust/docopt/examples/hashmap.rs
third_party/rust/docopt/examples/optional_command.rs
third_party/rust/docopt/examples/verbose_multiple.rs
third_party/rust/docopt/scripts/mk-testcases
third_party/rust/docopt/session.vim
third_party/rust/docopt/src/dopt.rs
third_party/rust/docopt/src/lib.rs
third_party/rust/docopt/src/parse.rs
third_party/rust/docopt/src/synonym.rs
third_party/rust/docopt/src/test/mod.rs
third_party/rust/docopt/src/test/suggestions.rs
third_party/rust/docopt/src/test/testcases.docopt
third_party/rust/docopt/src/test/testcases.rs
third_party/rust/docopt/src/wordlist.rs
third_party/rust/ena/.cargo-checksum.json
third_party/rust/ena/.travis.yml
third_party/rust/ena/Cargo.toml
third_party/rust/ena/LICENSE-APACHE
third_party/rust/ena/LICENSE-MIT
third_party/rust/ena/README.md
third_party/rust/ena/measurements.txt
third_party/rust/ena/src/bitvec.rs
third_party/rust/ena/src/cc/mod.rs
third_party/rust/ena/src/cc/test.rs
third_party/rust/ena/src/constraint/mod.rs
third_party/rust/ena/src/constraint/test.rs
third_party/rust/ena/src/debug.rs
third_party/rust/ena/src/graph/mod.rs
third_party/rust/ena/src/graph/tests.rs
third_party/rust/ena/src/lib.rs
third_party/rust/ena/src/snapshot_vec.rs
third_party/rust/ena/src/unify/mod.rs
third_party/rust/ena/src/unify/tests.rs
third_party/rust/fixedbitset/.cargo-checksum.json
third_party/rust/fixedbitset/.travis.yml
third_party/rust/fixedbitset/Cargo.toml
third_party/rust/fixedbitset/LICENSE-APACHE
third_party/rust/fixedbitset/LICENSE-MIT
third_party/rust/fixedbitset/README.rst
third_party/rust/fixedbitset/benches/benches.rs
third_party/rust/fixedbitset/src/lib.rs
third_party/rust/fixedbitset/src/range.rs
third_party/rust/itertools-0.6.5/.cargo-checksum.json
third_party/rust/itertools-0.6.5/.travis.yml
third_party/rust/itertools-0.6.5/Cargo.toml
third_party/rust/itertools-0.6.5/LICENSE-APACHE
third_party/rust/itertools-0.6.5/LICENSE-MIT
third_party/rust/itertools-0.6.5/Makefile
third_party/rust/itertools-0.6.5/README.rst
third_party/rust/itertools-0.6.5/benches/bench1.rs
third_party/rust/itertools-0.6.5/benches/extra/mod.rs
third_party/rust/itertools-0.6.5/benches/extra/zipslices.rs
third_party/rust/itertools-0.6.5/benches/tuple_combinations.rs
third_party/rust/itertools-0.6.5/benches/tuples.rs
third_party/rust/itertools-0.6.5/custom.css
third_party/rust/itertools-0.6.5/examples/iris.data
third_party/rust/itertools-0.6.5/examples/iris.rs
third_party/rust/itertools-0.6.5/src/adaptors/mod.rs
third_party/rust/itertools-0.6.5/src/adaptors/multipeek.rs
third_party/rust/itertools-0.6.5/src/concat_impl.rs
third_party/rust/itertools-0.6.5/src/cons_tuples_impl.rs
third_party/rust/itertools-0.6.5/src/diff.rs
third_party/rust/itertools-0.6.5/src/format.rs
third_party/rust/itertools-0.6.5/src/free.rs
third_party/rust/itertools-0.6.5/src/groupbylazy.rs
third_party/rust/itertools-0.6.5/src/impl_macros.rs
third_party/rust/itertools-0.6.5/src/intersperse.rs
third_party/rust/itertools-0.6.5/src/kmerge_impl.rs
third_party/rust/itertools-0.6.5/src/lib.rs
third_party/rust/itertools-0.6.5/src/minmax.rs
third_party/rust/itertools-0.6.5/src/pad_tail.rs
third_party/rust/itertools-0.6.5/src/peeking_take_while.rs
third_party/rust/itertools-0.6.5/src/process_results_impl.rs
third_party/rust/itertools-0.6.5/src/rciter_impl.rs
third_party/rust/itertools-0.6.5/src/repeatn.rs
third_party/rust/itertools-0.6.5/src/size_hint.rs
third_party/rust/itertools-0.6.5/src/sources.rs
third_party/rust/itertools-0.6.5/src/tee.rs
third_party/rust/itertools-0.6.5/src/tuple_impl.rs
third_party/rust/itertools-0.6.5/src/with_position.rs
third_party/rust/itertools-0.6.5/src/zip_eq_impl.rs
third_party/rust/itertools-0.6.5/src/zip_longest.rs
third_party/rust/itertools-0.6.5/src/ziptuple.rs
third_party/rust/itertools-0.6.5/tests/peeking_take_while.rs
third_party/rust/itertools-0.6.5/tests/quick.rs
third_party/rust/itertools-0.6.5/tests/tests.rs
third_party/rust/itertools-0.6.5/tests/tuples.rs
third_party/rust/itertools-0.6.5/tests/zip.rs
third_party/rust/lalrpop-intern/.cargo-checksum.json
third_party/rust/lalrpop-intern/Cargo.toml
third_party/rust/lalrpop-intern/src/lib.rs
third_party/rust/lalrpop-intern/src/test.rs
third_party/rust/lalrpop-snap/.cargo-checksum.json
third_party/rust/lalrpop-snap/Cargo.toml
third_party/rust/lalrpop-snap/src/api/mod.rs
third_party/rust/lalrpop-snap/src/build/action.rs
third_party/rust/lalrpop-snap/src/build/fake_term.rs
third_party/rust/lalrpop-snap/src/build/mod.rs
third_party/rust/lalrpop-snap/src/collections/map.rs
third_party/rust/lalrpop-snap/src/collections/mod.rs
third_party/rust/lalrpop-snap/src/collections/multimap.rs
third_party/rust/lalrpop-snap/src/collections/set.rs
third_party/rust/lalrpop-snap/src/file_text.rs
third_party/rust/lalrpop-snap/src/generate.rs
third_party/rust/lalrpop-snap/src/grammar/consts.rs
third_party/rust/lalrpop-snap/src/grammar/mod.rs
third_party/rust/lalrpop-snap/src/grammar/parse_tree.rs
third_party/rust/lalrpop-snap/src/grammar/pattern.rs
third_party/rust/lalrpop-snap/src/grammar/repr.rs
third_party/rust/lalrpop-snap/src/grammar/token/mod.rs
third_party/rust/lalrpop-snap/src/grammar/token/test.rs
third_party/rust/lalrpop-snap/src/kernel_set.rs
third_party/rust/lalrpop-snap/src/lexer/dfa/interpret.rs
third_party/rust/lalrpop-snap/src/lexer/dfa/mod.rs
third_party/rust/lalrpop-snap/src/lexer/dfa/overlap.rs
third_party/rust/lalrpop-snap/src/lexer/dfa/test.rs
third_party/rust/lalrpop-snap/src/lexer/intern_token/mod.rs
third_party/rust/lalrpop-snap/src/lexer/mod.rs
third_party/rust/lalrpop-snap/src/lexer/nfa/interpret.rs
third_party/rust/lalrpop-snap/src/lexer/nfa/mod.rs
third_party/rust/lalrpop-snap/src/lexer/nfa/test.rs
third_party/rust/lalrpop-snap/src/lexer/re/mod.rs
third_party/rust/lalrpop-snap/src/lexer/re/test.rs
third_party/rust/lalrpop-snap/src/lib.rs
third_party/rust/lalrpop-snap/src/log.rs
third_party/rust/lalrpop-snap/src/lr1/build/mod.rs
third_party/rust/lalrpop-snap/src/lr1/build/test.rs
third_party/rust/lalrpop-snap/src/lr1/build_lalr/mod.rs
third_party/rust/lalrpop-snap/src/lr1/build_lalr/test.rs
third_party/rust/lalrpop-snap/src/lr1/codegen/ascent.rs
third_party/rust/lalrpop-snap/src/lr1/codegen/base.rs
third_party/rust/lalrpop-snap/src/lr1/codegen/mod.rs
third_party/rust/lalrpop-snap/src/lr1/codegen/parse_table.rs
third_party/rust/lalrpop-snap/src/lr1/codegen/test_all.rs
third_party/rust/lalrpop-snap/src/lr1/core/mod.rs
third_party/rust/lalrpop-snap/src/lr1/error/mod.rs
third_party/rust/lalrpop-snap/src/lr1/error/test.rs
third_party/rust/lalrpop-snap/src/lr1/example/mod.rs
third_party/rust/lalrpop-snap/src/lr1/example/test.rs
third_party/rust/lalrpop-snap/src/lr1/first/mod.rs
third_party/rust/lalrpop-snap/src/lr1/first/test.rs
third_party/rust/lalrpop-snap/src/lr1/interpret.rs
third_party/rust/lalrpop-snap/src/lr1/item.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/README.md
third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/merge.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/mod.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/state_set.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/lane/mod.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/mod.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/table/context_set/mod.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/table/context_set/test.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/table/mod.rs
third_party/rust/lalrpop-snap/src/lr1/lane_table/test.rs
third_party/rust/lalrpop-snap/src/lr1/lookahead.rs
third_party/rust/lalrpop-snap/src/lr1/mod.rs
third_party/rust/lalrpop-snap/src/lr1/report/mod.rs
third_party/rust/lalrpop-snap/src/lr1/state_graph.rs
third_party/rust/lalrpop-snap/src/lr1/tls.rs
third_party/rust/lalrpop-snap/src/lr1/trace/mod.rs
third_party/rust/lalrpop-snap/src/lr1/trace/reduce/mod.rs
third_party/rust/lalrpop-snap/src/lr1/trace/reduce/test.rs
third_party/rust/lalrpop-snap/src/lr1/trace/shift/mod.rs
third_party/rust/lalrpop-snap/src/lr1/trace/shift/test.rs
third_party/rust/lalrpop-snap/src/lr1/trace/trace_graph/mod.rs
third_party/rust/lalrpop-snap/src/lr1/trace/trace_graph/test.rs
third_party/rust/lalrpop-snap/src/message/builder.rs
third_party/rust/lalrpop-snap/src/message/horiz.rs
third_party/rust/lalrpop-snap/src/message/indent.rs
third_party/rust/lalrpop-snap/src/message/message.rs
third_party/rust/lalrpop-snap/src/message/mod.rs
third_party/rust/lalrpop-snap/src/message/styled.rs
third_party/rust/lalrpop-snap/src/message/test.rs
third_party/rust/lalrpop-snap/src/message/text.rs
third_party/rust/lalrpop-snap/src/message/vert.rs
third_party/rust/lalrpop-snap/src/message/wrap.rs
third_party/rust/lalrpop-snap/src/normalize/inline/graph/mod.rs
third_party/rust/lalrpop-snap/src/normalize/inline/graph/test.rs
third_party/rust/lalrpop-snap/src/normalize/inline/mod.rs
third_party/rust/lalrpop-snap/src/normalize/inline/test.rs
third_party/rust/lalrpop-snap/src/normalize/lower/mod.rs
third_party/rust/lalrpop-snap/src/normalize/macro_expand/mod.rs
third_party/rust/lalrpop-snap/src/normalize/macro_expand/test.rs
third_party/rust/lalrpop-snap/src/normalize/mod.rs
third_party/rust/lalrpop-snap/src/normalize/norm_util.rs
third_party/rust/lalrpop-snap/src/normalize/prevalidate/mod.rs
third_party/rust/lalrpop-snap/src/normalize/prevalidate/test.rs
third_party/rust/lalrpop-snap/src/normalize/resolve/mod.rs
third_party/rust/lalrpop-snap/src/normalize/resolve/test.rs
third_party/rust/lalrpop-snap/src/normalize/token_check/mod.rs
third_party/rust/lalrpop-snap/src/normalize/token_check/test.rs
third_party/rust/lalrpop-snap/src/normalize/tyinfer/mod.rs
third_party/rust/lalrpop-snap/src/normalize/tyinfer/test.rs
third_party/rust/lalrpop-snap/src/parser/lrgrammar.rs
third_party/rust/lalrpop-snap/src/parser/mod.rs
third_party/rust/lalrpop-snap/src/parser/test.rs
third_party/rust/lalrpop-snap/src/rust/mod.rs
third_party/rust/lalrpop-snap/src/session.rs
third_party/rust/lalrpop-snap/src/test_util.rs
third_party/rust/lalrpop-snap/src/tls/mod.rs
third_party/rust/lalrpop-snap/src/tok/mod.rs
third_party/rust/lalrpop-snap/src/tok/test.rs
third_party/rust/lalrpop-snap/src/util.rs
third_party/rust/lalrpop-util/.cargo-checksum.json
third_party/rust/lalrpop-util/Cargo.toml
third_party/rust/lalrpop-util/src/lib.rs
third_party/rust/lalrpop/.cargo-checksum.json
third_party/rust/lalrpop/Cargo.toml
third_party/rust/lalrpop/build.rs
third_party/rust/lalrpop/src/api/mod.rs
third_party/rust/lalrpop/src/build/action.rs
third_party/rust/lalrpop/src/build/fake_term.rs
third_party/rust/lalrpop/src/build/mod.rs
third_party/rust/lalrpop/src/collections/map.rs
third_party/rust/lalrpop/src/collections/mod.rs
third_party/rust/lalrpop/src/collections/multimap.rs
third_party/rust/lalrpop/src/collections/set.rs
third_party/rust/lalrpop/src/file_text.rs
third_party/rust/lalrpop/src/generate.rs
third_party/rust/lalrpop/src/grammar/consts.rs
third_party/rust/lalrpop/src/grammar/mod.rs
third_party/rust/lalrpop/src/grammar/parse_tree.rs
third_party/rust/lalrpop/src/grammar/pattern.rs
third_party/rust/lalrpop/src/grammar/repr.rs
third_party/rust/lalrpop/src/grammar/token/mod.rs
third_party/rust/lalrpop/src/grammar/token/test.rs
third_party/rust/lalrpop/src/kernel_set.rs
third_party/rust/lalrpop/src/lexer/dfa/interpret.rs
third_party/rust/lalrpop/src/lexer/dfa/mod.rs
third_party/rust/lalrpop/src/lexer/dfa/overlap.rs
third_party/rust/lalrpop/src/lexer/dfa/test.rs
third_party/rust/lalrpop/src/lexer/intern_token/mod.rs
third_party/rust/lalrpop/src/lexer/mod.rs
third_party/rust/lalrpop/src/lexer/nfa/interpret.rs
third_party/rust/lalrpop/src/lexer/nfa/mod.rs
third_party/rust/lalrpop/src/lexer/nfa/test.rs
third_party/rust/lalrpop/src/lexer/re/mod.rs
third_party/rust/lalrpop/src/lexer/re/test.rs
third_party/rust/lalrpop/src/lib.rs
third_party/rust/lalrpop/src/log.rs
third_party/rust/lalrpop/src/lr1/build/mod.rs
third_party/rust/lalrpop/src/lr1/build/test.rs
third_party/rust/lalrpop/src/lr1/build_lalr/mod.rs
third_party/rust/lalrpop/src/lr1/build_lalr/test.rs
third_party/rust/lalrpop/src/lr1/codegen/ascent.rs
third_party/rust/lalrpop/src/lr1/codegen/base.rs
third_party/rust/lalrpop/src/lr1/codegen/mod.rs
third_party/rust/lalrpop/src/lr1/codegen/parse_table.rs
third_party/rust/lalrpop/src/lr1/codegen/test_all.rs
third_party/rust/lalrpop/src/lr1/core/mod.rs
third_party/rust/lalrpop/src/lr1/error/mod.rs
third_party/rust/lalrpop/src/lr1/error/test.rs
third_party/rust/lalrpop/src/lr1/example/mod.rs
third_party/rust/lalrpop/src/lr1/example/test.rs
third_party/rust/lalrpop/src/lr1/first/mod.rs
third_party/rust/lalrpop/src/lr1/first/test.rs
third_party/rust/lalrpop/src/lr1/interpret.rs
third_party/rust/lalrpop/src/lr1/item.rs
third_party/rust/lalrpop/src/lr1/lane_table/README.md
third_party/rust/lalrpop/src/lr1/lane_table/construct/merge.rs
third_party/rust/lalrpop/src/lr1/lane_table/construct/mod.rs
third_party/rust/lalrpop/src/lr1/lane_table/construct/state_set.rs
third_party/rust/lalrpop/src/lr1/lane_table/lane/mod.rs
third_party/rust/lalrpop/src/lr1/lane_table/mod.rs
third_party/rust/lalrpop/src/lr1/lane_table/table/context_set/mod.rs
third_party/rust/lalrpop/src/lr1/lane_table/table/context_set/test.rs
third_party/rust/lalrpop/src/lr1/lane_table/table/mod.rs
third_party/rust/lalrpop/src/lr1/lane_table/test.rs
third_party/rust/lalrpop/src/lr1/lookahead.rs
third_party/rust/lalrpop/src/lr1/mod.rs
third_party/rust/lalrpop/src/lr1/report/mod.rs
third_party/rust/lalrpop/src/lr1/state_graph.rs
third_party/rust/lalrpop/src/lr1/tls.rs
third_party/rust/lalrpop/src/lr1/trace/mod.rs
third_party/rust/lalrpop/src/lr1/trace/reduce/mod.rs
third_party/rust/lalrpop/src/lr1/trace/reduce/test.rs
third_party/rust/lalrpop/src/lr1/trace/shift/mod.rs
third_party/rust/lalrpop/src/lr1/trace/shift/test.rs
third_party/rust/lalrpop/src/lr1/trace/trace_graph/mod.rs
third_party/rust/lalrpop/src/lr1/trace/trace_graph/test.rs
third_party/rust/lalrpop/src/main.rs
third_party/rust/lalrpop/src/message/builder.rs
third_party/rust/lalrpop/src/message/horiz.rs
third_party/rust/lalrpop/src/message/indent.rs
third_party/rust/lalrpop/src/message/message.rs
third_party/rust/lalrpop/src/message/mod.rs
third_party/rust/lalrpop/src/message/styled.rs
third_party/rust/lalrpop/src/message/test.rs
third_party/rust/lalrpop/src/message/text.rs
third_party/rust/lalrpop/src/message/vert.rs
third_party/rust/lalrpop/src/message/wrap.rs
third_party/rust/lalrpop/src/normalize/inline/graph/mod.rs
third_party/rust/lalrpop/src/normalize/inline/graph/test.rs
third_party/rust/lalrpop/src/normalize/inline/mod.rs
third_party/rust/lalrpop/src/normalize/inline/test.rs
third_party/rust/lalrpop/src/normalize/lower/mod.rs
third_party/rust/lalrpop/src/normalize/macro_expand/mod.rs
third_party/rust/lalrpop/src/normalize/macro_expand/test.rs
third_party/rust/lalrpop/src/normalize/mod.rs
third_party/rust/lalrpop/src/normalize/norm_util.rs
third_party/rust/lalrpop/src/normalize/prevalidate/mod.rs
third_party/rust/lalrpop/src/normalize/prevalidate/test.rs
third_party/rust/lalrpop/src/normalize/resolve/mod.rs
third_party/rust/lalrpop/src/normalize/resolve/test.rs
third_party/rust/lalrpop/src/normalize/token_check/mod.rs
third_party/rust/lalrpop/src/normalize/token_check/test.rs
third_party/rust/lalrpop/src/normalize/tyinfer/mod.rs
third_party/rust/lalrpop/src/normalize/tyinfer/test.rs
third_party/rust/lalrpop/src/parser/lrgrammar.lalrpop
third_party/rust/lalrpop/src/parser/lrgrammar.rs
third_party/rust/lalrpop/src/parser/mod.rs
third_party/rust/lalrpop/src/parser/test.rs
third_party/rust/lalrpop/src/rust/mod.rs
third_party/rust/lalrpop/src/session.rs
third_party/rust/lalrpop/src/test_util.rs
third_party/rust/lalrpop/src/tls/mod.rs
third_party/rust/lalrpop/src/tok/mod.rs
third_party/rust/lalrpop/src/tok/test.rs
third_party/rust/lalrpop/src/util.rs
third_party/rust/linked-hash-map/.cargo-checksum.json
third_party/rust/linked-hash-map/.travis.yml
third_party/rust/linked-hash-map/Cargo.toml
third_party/rust/linked-hash-map/LICENSE-APACHE
third_party/rust/linked-hash-map/LICENSE-MIT
third_party/rust/linked-hash-map/README.md
third_party/rust/linked-hash-map/deploy-docs.sh
third_party/rust/linked-hash-map/src/heapsize.rs
third_party/rust/linked-hash-map/src/lib.rs
third_party/rust/linked-hash-map/src/serde.rs
third_party/rust/linked-hash-map/tests/heapsize.rs
third_party/rust/linked-hash-map/tests/serde.rs
third_party/rust/linked-hash-map/tests/test.rs
third_party/rust/ordermap/.cargo-checksum.json
third_party/rust/ordermap/.travis.yml
third_party/rust/ordermap/Cargo.toml
third_party/rust/ordermap/LICENSE-APACHE
third_party/rust/ordermap/LICENSE-MIT
third_party/rust/ordermap/README.rst
third_party/rust/ordermap/benches/bench.rs
third_party/rust/ordermap/benches/faststring.rs
third_party/rust/ordermap/src/equivalent.rs
third_party/rust/ordermap/src/lib.rs
third_party/rust/ordermap/src/macros.rs
third_party/rust/ordermap/src/mutable_keys.rs
third_party/rust/ordermap/src/serde.rs
third_party/rust/ordermap/src/set.rs
third_party/rust/ordermap/src/util.rs
third_party/rust/ordermap/tests/equivalent_trait.rs
third_party/rust/ordermap/tests/quick.rs
third_party/rust/ordermap/tests/serde.rs
third_party/rust/ordermap/tests/tests.rs
third_party/rust/petgraph/.cargo-checksum.json
third_party/rust/petgraph/.travis.yml
third_party/rust/petgraph/Cargo.toml
third_party/rust/petgraph/LICENSE-APACHE
third_party/rust/petgraph/LICENSE-MIT
third_party/rust/petgraph/Makefile
third_party/rust/petgraph/README.rst
third_party/rust/petgraph/benches/iso.rs
third_party/rust/petgraph/benches/ograph.rs
third_party/rust/petgraph/benches/stable_graph.rs
third_party/rust/petgraph/custom.css
third_party/rust/petgraph/graph-example.dot
third_party/rust/petgraph/src/algo/dominators.rs
third_party/rust/petgraph/src/algo/mod.rs
third_party/rust/petgraph/src/astar.rs
third_party/rust/petgraph/src/csr.rs
third_party/rust/petgraph/src/data.rs
third_party/rust/petgraph/src/dijkstra.rs
third_party/rust/petgraph/src/dot.rs
third_party/rust/petgraph/src/generate.rs
third_party/rust/petgraph/src/graph_impl/frozen.rs
third_party/rust/petgraph/src/graph_impl/mod.rs
third_party/rust/petgraph/src/graph_impl/serialization.rs
third_party/rust/petgraph/src/graph_impl/stable_graph/mod.rs
third_party/rust/petgraph/src/graph_impl/stable_graph/serialization.rs
third_party/rust/petgraph/src/graphmap.rs
third_party/rust/petgraph/src/isomorphism.rs
third_party/rust/petgraph/src/iter_format.rs
third_party/rust/petgraph/src/iter_utils.rs
third_party/rust/petgraph/src/lib.rs
third_party/rust/petgraph/src/macros.rs
third_party/rust/petgraph/src/prelude.rs
third_party/rust/petgraph/src/quickcheck.rs
third_party/rust/petgraph/src/scored.rs
third_party/rust/petgraph/src/serde_utils.rs
third_party/rust/petgraph/src/traits_graph.rs
third_party/rust/petgraph/src/unionfind.rs
third_party/rust/petgraph/src/util.rs
third_party/rust/petgraph/src/visit/dfsvisit.rs
third_party/rust/petgraph/src/visit/filter.rs
third_party/rust/petgraph/src/visit/macros.rs
third_party/rust/petgraph/src/visit/mod.rs
third_party/rust/petgraph/src/visit/reversed.rs
third_party/rust/petgraph/src/visit/traversal.rs
third_party/rust/petgraph/tests/graph.rs
third_party/rust/petgraph/tests/graphmap.rs
third_party/rust/petgraph/tests/iso.rs
third_party/rust/petgraph/tests/quickcheck.rs
third_party/rust/petgraph/tests/stable_graph.rs
third_party/rust/petgraph/tests/unionfind.rs
third_party/rust/petgraph/tests/utils/mod.rs
third_party/rust/petgraph/tests/utils/qc.rs
third_party/rust/string_cache/.cargo-checksum.json
third_party/rust/string_cache/.travis.yml
third_party/rust/string_cache/Cargo.toml
third_party/rust/string_cache/LICENSE-APACHE
third_party/rust/string_cache/LICENSE-MIT
third_party/rust/string_cache/README.md
third_party/rust/string_cache/build.rs
third_party/rust/string_cache/src/atom.rs
third_party/rust/string_cache/src/bench.rs
third_party/rust/string_cache/src/event.rs
third_party/rust/string_cache/src/lib.rs
third_party/rust/string_cache_codegen/.cargo-checksum.json
third_party/rust/string_cache_codegen/Cargo.toml
third_party/rust/string_cache_codegen/lib.rs
third_party/rust/string_cache_shared/.cargo-checksum.json
third_party/rust/string_cache_shared/Cargo.toml
third_party/rust/string_cache_shared/lib.rs
third_party/rust/term/.cargo-checksum.json
third_party/rust/term/.travis.yml
third_party/rust/term/Cargo.toml
third_party/rust/term/LICENSE-APACHE
third_party/rust/term/LICENSE-MIT
third_party/rust/term/README.md
third_party/rust/term/appveyor.yml
third_party/rust/term/rustfmt.toml
third_party/rust/term/scripts/id_rsa.enc
third_party/rust/term/scripts/travis-doc-upload.cfg
third_party/rust/term/src/lib.rs
third_party/rust/term/src/terminfo/mod.rs
third_party/rust/term/src/terminfo/parm.rs
third_party/rust/term/src/terminfo/parser/compiled.rs
third_party/rust/term/src/terminfo/parser/names.rs
third_party/rust/term/src/terminfo/searcher.rs
third_party/rust/term/src/win.rs
third_party/rust/term/tests/data/dumb
third_party/rust/term/tests/data/linux
third_party/rust/term/tests/data/linux-16color
third_party/rust/term/tests/data/linux-basic
third_party/rust/term/tests/data/linux-c
third_party/rust/term/tests/data/linux-c-nc
third_party/rust/term/tests/data/linux-koi8
third_party/rust/term/tests/data/linux-koi8r
third_party/rust/term/tests/data/linux-lat
third_party/rust/term/tests/data/linux-m
third_party/rust/term/tests/data/linux-nic
third_party/rust/term/tests/data/linux-vt
third_party/rust/term/tests/data/linux2.2
third_party/rust/term/tests/data/linux2.6
third_party/rust/term/tests/data/linux2.6.26
third_party/rust/term/tests/data/linux3.0
third_party/rust/term/tests/data/rxvt
third_party/rust/term/tests/data/rxvt-16color
third_party/rust/term/tests/data/rxvt-256color
third_party/rust/term/tests/data/rxvt-88color
third_party/rust/term/tests/data/rxvt-basic
third_party/rust/term/tests/data/rxvt-color
third_party/rust/term/tests/data/rxvt-cygwin
third_party/rust/term/tests/data/rxvt-cygwin-native
third_party/rust/term/tests/data/rxvt-xpm
third_party/rust/term/tests/data/screen
third_party/rust/term/tests/data/screen-256color
third_party/rust/term/tests/data/xterm
third_party/rust/term/tests/data/xterm-256color
third_party/rust/term/tests/terminfo.rs
third_party/rust/webidl/.cargo-checksum.json
third_party/rust/webidl/.travis.yml
third_party/rust/webidl/Cargo.toml
third_party/rust/webidl/LICENSE
third_party/rust/webidl/README.md
third_party/rust/webidl/RELEASES.md
third_party/rust/webidl/build.rs
third_party/rust/webidl/clippy.toml
third_party/rust/webidl/src/lexer/mod.rs
third_party/rust/webidl/src/lexer/token.rs
third_party/rust/webidl/src/lib.rs
third_party/rust/webidl/src/parser/ast.rs
third_party/rust/webidl/src/parser/grammar.lalrpop
third_party/rust/webidl/src/parser/mod.rs
third_party/rust/webidl/src/parser/visitor/mod.rs
third_party/rust/webidl/src/parser/visitor/pretty_print.rs
third_party/rust/webidl/tests/parse_test.rs
third_party/rust/webidl/tests/pretty_print_test.rs
third_party/rust/yaml-rust/.cargo-checksum.json
third_party/rust/yaml-rust/.travis.yml
third_party/rust/yaml-rust/Cargo.toml
third_party/rust/yaml-rust/LICENSE-APACHE
third_party/rust/yaml-rust/LICENSE-MIT
third_party/rust/yaml-rust/README.md
third_party/rust/yaml-rust/appveyor.yml
third_party/rust/yaml-rust/examples/dump_yaml.rs
third_party/rust/yaml-rust/src/emitter.rs
third_party/rust/yaml-rust/src/lib.rs
third_party/rust/yaml-rust/src/parser.rs
third_party/rust/yaml-rust/src/scanner.rs
third_party/rust/yaml-rust/src/yaml.rs
third_party/rust/yaml-rust/tests/quickcheck.rs
third_party/rust/yaml-rust/tests/spec_test.rs
third_party/rust/yaml-rust/tests/spec_test.rs.inc
third_party/rust/yaml-rust/tests/specexamples.rs.inc
third_party/rust/yaml-rust/tests/specs/cpp2rust.rb
third_party/rust/yaml-rust/tests/specs/handler_spec_test.cpp
third_party/rust/yaml-rust/tests/specs/libyaml_fail-01.yaml
third_party/rust/yaml-rust/tests/specs/libyaml_fail-02.yaml
third_party/rust/yaml-rust/tests/specs/libyaml_fail-03.yaml
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,8 +1,17 @@
+[[package]]
+name = "Inflector"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "adler32"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "aho-corasick"
 version = "0.6.3"
@@ -29,22 +38,40 @@ dependencies = [
 name = "arrayvec"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "ascii-canvas"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "atomic_refcell"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atty"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "atty"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -136,16 +163,53 @@ dependencies = [
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "binjs_meta"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "Inflector 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "webidl 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "binsource"
+version = "0.1.0"
+dependencies = [
+ "binjs_meta 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "webidl 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "bitflags"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bitflags"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -483,16 +547,33 @@ dependencies = [
 name = "debug_unreachable"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "diff"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "docopt"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)",
+ "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "dtoa"
 version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "dtoa-short"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -515,16 +596,21 @@ dependencies = [
 ]
 
 [[package]]
 name = "either"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "ena"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "encoding_c"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -556,16 +642,17 @@ dependencies = [
 [[package]]
 name = "env_logger"
 version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "error-chain"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -582,16 +669,21 @@ dependencies = [
 name = "fallible"
 version = "0.0.1"
 dependencies = [
  "hashglobe 0.1.0",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "fixedbitset"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "flate2"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -841,16 +933,24 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "itertools"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "itertools"
 version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "itoa"
@@ -887,16 +987,71 @@ dependencies = [
 ]
 
 [[package]]
 name = "khronos_api"
 version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "lalrpop"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "atty 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ena 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lalrpop-snap 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lalrpop-util 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "petgraph 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)",
+ "string_cache 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lalrpop-intern"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "lalrpop-snap"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "atty 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ena 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lalrpop-intern 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lalrpop-util 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "petgraph 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "string_cache 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lalrpop-util"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "language-tags"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -944,16 +1099,21 @@ source = "registry+https://github.com/ru
 dependencies = [
  "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "linked-hash-map"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "log"
 version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1264,16 +1424,21 @@ name = "ordered-float"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "ordermap"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "owning_ref"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1303,16 +1468,25 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "percent-encoding"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "petgraph"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "fixedbitset 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "phf"
 version = "0.7.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1638,16 +1812,46 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "stable_deref_trait"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "string_cache"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "string_cache_codegen 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "string_cache_shared"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "strsim"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "style"
 version = "0.0.1"
 dependencies = [
@@ -1785,16 +1989,25 @@ dependencies = [
 name = "tempdir"
 version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "term"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "term_size"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -2044,16 +2257,25 @@ dependencies = [
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "webidl"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lalrpop 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lalrpop-util 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "webrender"
 version = "0.57.0"
 dependencies = [
  "app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2205,39 +2427,53 @@ name = "xpcom_macros"
 version = "0.1.0"
 dependencies = [
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "yaml-rust"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "zip"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bzip2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "msdos_time 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "podio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
+"checksum Inflector 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1b33cd9b653730fc539c53c7b3c672d2f47108fa20c6df571fa5817178f5a14c"
 "checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45"
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
 "checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
 "checksum app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29069a9b483f7780aebb55dafb360c6225eefdc1f98c8d336a65148fd10c37b1"
 "checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2"
+"checksum ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b385d69402821a1c254533a011a312531cbcc0e3e24f19bbb4747a5a2daf37e2"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
+"checksum atty 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0fd4c0631f06448cc45a6bbb3b710ebb7ff8ccb96a0800c994afe23a70d5df2"
 "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
 "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bda13183df33055cbb84b847becce220d392df502ebe7a4a78d7021771ed94d0"
 "checksum bindgen 0.33.2 (registry+https://github.com/rust-lang/crates.io-index)" = "603ed8d8392ace9581e834e26bd09799bf1e989a79bd1aedbb893e72962bdc6e"
+"checksum binjs_meta 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9fcfc86eecb125147e907529a5f1ac7978f6f26d20a52b82a7e053da5faefbc3"
+"checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
+"checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
 "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8380105befe91099e6f69206164072c05bc92427ff6aa8a5171388317346dd75"
 "checksum build_const 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e90dc84f5e62d2ebe7676b83c22d33b6db8bd27340fb6ffbff0a364efa0cb9c9"
 "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
 "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6"
 "checksum bzip2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3eafc42c44e0d827de6b1c131175098fe7fb53b8ce8a47e65cb3ea94688be24"
@@ -2267,26 +2503,30 @@ dependencies = [
 "checksum cubeb 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a3502aafa1bf95c524f65d2ba46d8741700c6a8a9543ea52c6da3d8b69a2896"
 "checksum cubeb-backend 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdcac95519416d9ec814db2dc40e6293e7da25b906023d93f48b87f0587ab138"
 "checksum cubeb-core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37f7b20f757a4e4b6aa28863236551bff77682dc6db192eba15af615492b5445"
 "checksum cubeb-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "653b9e245d35dbe2a2da7c4586275cee75ff656ddeb02d4a73b4afdfa6d67502"
 "checksum darling 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3effd06d4057f275cb7858889f4952920bab78dd8ff0f6e7dfe0c8d2e67ed89"
 "checksum darling_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "167dd3e235c2f1da16a635c282630452cdf49191eb05711de1bcd1d3d5068c00"
 "checksum darling_macro 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c53edaba455f6073a10c27c72440860eb3f60444f8c8660a391032eeae744d82"
 "checksum debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3"
+"checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
+"checksum docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"
 "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
 "checksum dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "068d4026697c1a18f0b0bb8cfcad1b0c151b90d8edb9bf4c235ad68128920d1d"
 "checksum dwrote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b26e30aaa6bf31ec830db15fec14ed04f0f2ecfcc486ecfce88c55d3389b237f"
 "checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"
+"checksum ena 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cabe5a5078ac8c506d3e4430763b1ba9b609b1286913e7d08e581d1c2de9b7e5"
 "checksum encoding_c 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "93ec52324ca72f423237a413ca0e1c60654c8b3d0934fcd5fd888508dfcc4ba7"
 "checksum encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98fd0f24d1fb71a4a6b9330c8ca04cbd4e7cc5d846b54ca74ff376bc7c9f798d"
 "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"
 "checksum env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0561146661ae44c579e993456bc76d11ce1e0c7d745e57b2fa7146b6e49fa2ad"
 "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
 "checksum euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "adfe67a9343519c1449d208da5998c6de582de698f7a39c4ac82ffba23d131a5"
+"checksum fixedbitset 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "85cb8fec437468d86dc7c83ca7cfc933341d561873275f22dd5eedefa63a6478"
 "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909"
 "checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"
 "checksum foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ebc04f19019fff1f2d627b5581574ead502f80c48c88900575a46e0840fe5d0"
 "checksum freetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "398b8a11884898184d55aca9806f002b3cf68f0e860e0cbb4586f834ee39b0e7"
 "checksum fs2 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ab76cfd2aaa59b7bf6688ad9ba15bbae64bff97f04ea02144cfd3443e5c2866"
 "checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159"
 "checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82"
 "checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7"
@@ -2298,28 +2538,34 @@ dependencies = [
 "checksum gleam 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "959c818d9bbe9f7b7db55dce0bc44673c4da4f4ee122536c40550f984c3b8017"
 "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
 "checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07"
 "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
 "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2"
 "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
 "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
 "checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
+"checksum itertools 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3f2be4da1690a039e9ae5fd575f706a63ad5a2120f161b1d653c9da3930dd21"
 "checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
 "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
 "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
 "checksum khronos_api 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867c645cfeb8a7fec503731679eac03ac11b7105aa5a71cb8f8ee5271636add"
+"checksum lalrpop 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88035943c3cfbb897a499a556212b2b053574f32b4238b71b61625bc470f80aa"
+"checksum lalrpop-intern 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4fd87be4a815fd373e02773983940f0d75fb26fde8c098e9e45f7af03154c0"
+"checksum lalrpop-snap 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f244285324e4e33d486910b66fd3b7cb37e2072c5bf63319f506fe99ed72650"
+"checksum lalrpop-util 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "de408fd50dea8ad7a77107144983a25c7fdabf5f8faf707a6e020d68874ed06c"
 "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
 "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
 "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
 "checksum libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff"
 "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
 "checksum libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe"
 "checksum libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd64ef8ee652185674455c1d450b83cbc8ad895625d543b5324d923f82e4d8"
+"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"
 "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
 "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2"
 "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
 "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46f3c7359028b31999287dae4e5047ddfe90a23b7dca2282ce759b491080c99b"
 "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
 "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
 "checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398"
@@ -2335,21 +2581,23 @@ dependencies = [
 "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
 "checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
 "checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
 "checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"
 "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
 "checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
+"checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 "checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd"
 "checksum parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6c677d78851950b3aec390e681a411f78cc250cba277d4f578758a377f727970"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
+"checksum petgraph 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "7a7e5234c228fbfa874c86a77f685886127f82e0aef602ad1d48333fcac6ad61"
 "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc"
 "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f"
 "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03"
 "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum plane-split 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "69c557e11e3a1533bc969fa596e5011e1d9f76dd61cd102ef942c9f8654b17a2"
 "checksum podio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e5422a1ee1bc57cc47ae717b0137314258138f38fd5f3cea083f43a9725383a0"
 "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
@@ -2378,22 +2626,26 @@ dependencies = [
 "checksum serde_derive 1.0.35 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)" = "<none>"
 "checksum serde_derive_internals 0.22.1 (git+https://github.com/servo/serde?branch=deserialize_from_enums5)" = "<none>"
 "checksum simd 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd0805c7363ab51a829a1511ad24b6ed0349feaa756c4bc2f977f9f496e6673"
 "checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84"
 "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23"
 "checksum smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "79b776f00dfe01df905fa3b2eaa1659522e99e3fc4a7b1334171622205c4bdcf"
 "checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9"
 "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
+"checksum string_cache 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39cb4173bcbd1319da31faa5468a7e3870683d7a237150b0b0aaafd546f6ad12"
+"checksum string_cache_codegen 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "479cde50c3539481f33906a387f2bd17c8e87cb848c35b6021d41fb81ff9b4d7"
+"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
 "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
 "checksum syn 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9e1c669ed757c0ebd04337f6a5bb972d05e0c08fe2540dd3ee3dd9e4daf1604c"
 "checksum synom 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "27e31aa4b09b9f4cb12dff3c30ba503e17b1a624413d764d32dab76e3920e5bc"
 "checksum synstructure 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "010366096045d8250555904c58da03377289e7f4b2ce7a5b1027e2b532f41000"
 "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"
+"checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1"
 "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
 "checksum termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83"
 "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
 "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
 "checksum thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf947d192a9be60ef5131cc7a4648886ba89d712f16700ebbf80c8a69d05d48f"
 "checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
 "checksum tokio-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "febd81b3e2ef615c6c8077347b33f3f3deec3d708ecd08194c9707b7a1eccfc9"
 "checksum tokio-io 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ab83e7adb5677e42e405fa4ceff75659d93c4d7d7dd22f52fcec59ee9f02af"
@@ -2414,19 +2666,21 @@ dependencies = [
 "checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2"
 "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
 "checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f"
 "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bb08f9e670fab86099470b97cd2b252d6527f0b3cc1401acdb595ffc9dd288ff"
+"checksum webidl 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc14e4b71f94b5bb4c6d696e3b3be4d2e9ee6750a60870ecae09ff7138a131a7"
 "checksum which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4be6cfa54dab45266e98b5d7be2f8ce959ddd49abd141a05d52dce4b07f803bb"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767"
 "checksum winreg 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9338067aba07889a38beaad4dbb77fa2e62e87c423b770824b3bdf412874bd2c"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2"
+"checksum yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57ab38ee1a4a266ed033496cf9af1828d8d6e6c1cfa5f643a2809effcae4d628"
 "checksum zip 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "10931e278527cea65682696481e6d840371d581079df529ebfee186e0eaad719"
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,16 +2,17 @@
 
 # These are the "root" crates, which we build and test as top-level targets.
 # Their transitive dependencies and dev-dependencies are included automatically
 # and do not need to be listed here. Their external dependencies are vendored
 # into `third_party/rust` by `mach vendor rust`.
 members = [
   "js/src",
   "js/rust",
+  "js/src/frontend/binsource", # Code generator.
   "testing/geckodriver",
   "toolkit/library/gtest/rust",
   "toolkit/library/rust/",
 ]
 
 # Excluded crates may be built as dependencies, but won't be considered members
 # of the workspace and their dev-dependencies won't be included.
 exclude = [
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"CHANGELOG.md":"e9a48682ad06315c67acdf9d9519ec60e483f487cfabcafebf30c18ecd553c19","CONTRIBUTING.md":"99a4db96609e44c91d9be8385e34cd213dc091e302d58d155056539045d17a8b","Cargo.toml":"1ba1b81c80a1b15f9bac208e924262b69962bf5d05452332fb32b301360f6693","LICENSE.md":"03d1bd5bfbee8d44651e7f57faf9e5b4eda4233f0d4eda36a716f2f0533d230b","PULL_REQUEST_TEMPLATE.md":"88b1581d41bbbfda51ac309ad7c3a735f65798f5b5148f1e6201a246719913c7","README.md":"d2e81724a70e14b60a2e8b680e9024838385ff51e302bb3f0879c526a6ae97f1","benchmark":"87cfbb14d1f7a3a38a9b02579199d04d87b15b078d3cf2094fd750aeb95c820a","src/cases/camelcase/mod.rs":"8e65fca78ea88acb32c0f214cafde39b849aef253253c3681e316f2559b26977","src/cases/case/mod.rs":"f3e1795f402cdfdecf3b255c3f7e42a9a6a8a0044802501574044e4a35d6081d","src/cases/classcase/mod.rs":"5b6b74530a2a693bf1ac89342f1b25f58f39336b1ee3242547c3d6ef468a878f","src/cases/kebabcase/mod.rs":"b317ebd42f22daab4b23bb4b83ce85f053d7088680d3a32eecbd13bd5331587a","src/cases/mod.rs":"e272853bcc1c5f6eb02594038febb9dcebb6eca8eac744d6e503db5082e585c6","src/cases/pascalcase/mod.rs":"a44feed6d8877fd8a31160076befe826960aa001d859587aef2dddc1aedc397b","src/cases/screamingsnakecase/mod.rs":"21582eb1ec2170d379bf3536c6ffb39b8bdc096efe2d493674458ee27b86e985","src/cases/sentencecase/mod.rs":"eb21d7d5bf0b23e1325d429dfdc149081d233a8b950c1fdfe04b4bebcc2c0ddb","src/cases/snakecase/mod.rs":"369739e37e700c028022f308aa78504873c10a5e88768f05249c1c8481b30c9d","src/cases/tablecase/mod.rs":"a6a50a397059d775a517d5dce6ba612b107919e209a9eb56871a5c1d42314664","src/cases/titlecase/mod.rs":"3f0dac5e5b434da9234d6c389f67bb2d3c8f138dc521fa29dbe3791f8eaf5341","src/cases/traincase/mod.rs":"4e2493d6594d3c505de293c69390b3f672c0fd4d35603ae1a1aae48166bc18c2","src/lib.rs":"6c5cf60f5c2f8778a3ad7638f37064527b8a86f164117d867b8b6532e2cc655e","src/numbers/deordinalize/mod.rs":"a6e0c00ab9c50f997b215762670ef1e7ac4cbdaa1380113fd625b8d59940e61c","src/numbers/mod.rs":"fed4e090f8b64a34ae64ddcb68d899cfa4dd8e8422a060be01a70dbdb71b85e0","src/numbers/ordinalize/mod.rs":"ce0d88977efaa50792e7311c0e0a73a3115928f9f7be77f914824c3d80eab66c","src/string/constants/mod.rs":"38de3d5060a5d224d28d184eab8af02203c65d74c1d380720c3260ea205f3e05","src/string/deconstantize/mod.rs":"c79f2170dc41bd6abb89a6e74fbdd87bf011f62cfe1f34d8886fda0724ade6fa","src/string/demodulize/mod.rs":"bbcb5314473e4ca02feee4903e31a332caaa912ed2cbca0f49c2fe411a826215","src/string/mod.rs":"570f7ea4dd646f2d633ddd67079db922cc2cadf916719fa19c2f59b4d522ee89","src/string/pluralize/mod.rs":"5f07fab8b5f4e7af546f1e907426724714b9b27af1ecb59a91e57dccd0833a6e","src/string/singularize/mod.rs":"9c2d833cbcdc1489013642de22578d51f558a31e8d2fea4536a27f8fa1114169","src/suffix/foreignkey/mod.rs":"e7ad9a9a0a21fcb53becb36306a15eedf67958e2da18ae928ae592177e70e7a3","src/suffix/mod.rs":"f6f99ce6fc8794d5411d91533b67be5d4a2bc5994317d32f405b2fa3c5ec660d","tests/lib.rs":"e1cfcea8a146291396ff72b0a2e84c2b9ddaa0103717442c4921c165a2ab470d","travis-after-success.sh":"ae0dfa332c9af427c728c42761a9813c9c6cb1748cc528a5bd38774a04850375"},"package":"1b33cd9b653730fc539c53c7b3c672d2f47108fa20c6df571fa5817178f5a14c"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/CHANGELOG.md
@@ -0,0 +1,392 @@
+# 0.11.2
+
+## Non-breaking changes:
+- Added class_cases and removed -- Thanks @Yoric
+  - Use pascal case
+- Updated lazy_static to 1.0.0
+
+# 0.11.1
+
+## Non-breaking changes:
+- Fixed an issue where words ending in e.g. "-ches", such as "witches"; that
+  would be singularized as "wit" instead of the expected "witch". -- Thanks nbaksalyar
+- Will be removing ascii import when current nightly goes stable.
+
+# 0.11.0
+
+## Breaking changes:
+- Made snake case deal correctly with special characters. Behaviour now follows
+  rails infector
+- Made camel case deal correctly with special characters. Behaviour now follows
+  rails infector
+
+## Non-breaking changes:
+- Removed magic macros for testing.
+- Added explicit tests for all cases.
+
+# 0.10.1
+
+## Non-breaking changes:
+- Added flags for unused macros. Any current macros with this flag with either
+  be moved or removed.
+
+# 0.10.0
+
+## Non-breaking changes:
+- Changed from `fold` to `for in` which resulted in a average 10-20% boost in
+  performance for all castings using the case module.
+
+## Fixes:
+- Fixed issue with snake case like strings where numbers were incorrectly
+  permitted to be next to a string e.g. `string1` was considered valid when it
+  should have been `string_1`. This has been corrected as part of the above
+  change.
+
+## Why is this not 0.9.1?
+- The change in this case are all on private API. This normally wouldn't cause a
+  breaking change as there are extensive tests wrapping all methods. This
+  however doesn't preclude an edge case that hasn't been considered. I've
+  deemed it safer to call this a 0.x.0 release for that reason.
+
+# 0.9.0
+
+## Breaking changes:
+- Changed type signature for all casting methods to use `&str`. This gives the
+  crate a >10% increase in performance in a majority of conversions. Although
+  most users only use:
+     `"my_string".to_camel_case()`
+  or
+    `"myString".to_string().to_snake_case()`
+  For those using the `to_camel_case("something".to_string())` this will be a
+  breaking change as the new syntax demands `to_camel_case("something")`.
+
+
+# 0.8.1
+
+## Fixes:
+
+- Fixed singularize issues with `/ies/`. Thanks @mthjones
+- Fixed issue with feature gates which may have caused downstream api
+  incompatibilities.
+
+# 0.8.0
+
+## New features:
+
+- Feature gated pluralize, singularize, class_case, table_case, demodulize, and
+  deconstantize. This can be activated by passing --features=lightweight. See
+  README
+
+
+## Possible breaking change:
+
+- Feature gated items are on by default, meaning that you'll get the full
+  version of the crate if you install as normal. See README if you want to use
+  the lightweight version.
+- Although the application still passes all tests, substantial portions of the
+  core of the conversion code have been method extracted and may have caused a
+  change for some people. Please file an issue if this is a problem for you.
+
+# 0.7.0
+
+## New features:
+
+- Added traits for various number types on ordinalize.
+
+## Possible breaking change:
+
+- Fixed issue with Boxes to Box which may cause breakages for some people
+
+## Non-breaking change:
+
+- Updated dependencies on `regex` and `lazy_static` to be the current latest
+- Changed the way that traits are implemented to use macros. Thus reducing
+  duplication issues seen previously for each type that wanted to implement
+  Inflector
+- More tests for conversion between different string formats
+- Better documentation for new users
+- Cleaned up documentation
+
+## Notes:
+- This is a pre-release for 1.0.0
+
+# 0.6.0
+
+## Breaking changes:
+
+- Removed lower and upper case. -- Use the built in [Rust implementations](https://doc.rust-lang.org/std/string/struct.String.html#method.to_uppercase)
+
+## Non-breaking change:
+
+- Removed lib definitions. -- Thanks @kanerogers
+
+# 0.5.1
+
+## Non-breaking change:
+
+- Refactored Title, Pascal, Train and Camel cases to be unified.
+
+# 0.5.0
+
+## New features:
+
+- Adds Train-Case thanks to @stpettersens
+
+## Fixes:
+
+- Fixes performance issues with Title Case
+
+# 0.4.0
+
+## Fixes:
+
+- Fixes issue where strings like `HTTPParty` becomes `h_t_t_p_party` instead of `http_party` as it should -- Thanks @cmsd2
+
+## New features:
+
+- Adds PascalCase
+
+## Benchmarks:
+```shell
+test cases::camelcase::tests::bench_camel0                      ... bench:         142 ns/iter (+/- 28)
+test cases::camelcase::tests::bench_camel1                      ... bench:         143 ns/iter (+/- 30)
+test cases::camelcase::tests::bench_camel2                      ... bench:         138 ns/iter (+/- 80)
+test cases::camelcase::tests::bench_is_camel                    ... bench:         171 ns/iter (+/- 103)
+test cases::classcase::tests::bench_class_case                  ... bench:       2,369 ns/iter (+/- 658)
+test cases::classcase::tests::bench_class_from_snake            ... bench:       2,378 ns/iter (+/- 914)
+test cases::classcase::tests::bench_is_class                    ... bench:       2,541 ns/iter (+/- 294)
+test cases::kebabcase::tests::bench_is_kebab                    ... bench:         180 ns/iter (+/- 35)
+test cases::kebabcase::tests::bench_kebab                       ... bench:         156 ns/iter (+/- 91)
+test cases::kebabcase::tests::bench_kebab_from_snake            ... bench:         248 ns/iter (+/- 143)
+test cases::lowercase::tests::bench_is_lower                    ... bench:         340 ns/iter (+/- 91)
+test cases::lowercase::tests::bench_lower                       ... bench:         301 ns/iter (+/- 124)
+test cases::pascalcase::tests::bench_is_pascal                  ... bench:         163 ns/iter (+/- 65)
+test cases::pascalcase::tests::bench_pascal0                    ... bench:         140 ns/iter (+/- 78)
+test cases::pascalcase::tests::bench_pascal1                    ... bench:         140 ns/iter (+/- 40)
+test cases::pascalcase::tests::bench_pascal2                    ... bench:         138 ns/iter (+/- 105)
+test cases::screamingsnakecase::tests::bench_is_screaming_snake ... bench:         193 ns/iter (+/- 27)
+test cases::screamingsnakecase::tests::bench_screaming_snake    ... bench:         161 ns/iter (+/- 84)
+test cases::sentencecase::tests::bench_is_sentence              ... bench:         394 ns/iter (+/- 85)
+test cases::sentencecase::tests::bench_sentence                 ... bench:         365 ns/iter (+/- 186)
+test cases::sentencecase::tests::bench_sentence_from_snake      ... bench:         333 ns/iter (+/- 178)
+test cases::snakecase::tests::bench_is_snake                    ... bench:         190 ns/iter (+/- 74)
+test cases::snakecase::tests::bench_snake_from_camel            ... bench:         155 ns/iter (+/- 44)
+test cases::snakecase::tests::bench_snake_from_snake            ... bench:         280 ns/iter (+/- 161)
+test cases::snakecase::tests::bench_snake_from_title            ... bench:         156 ns/iter (+/- 31)
+test cases::tablecase::tests::bench_is_table_case               ... bench:       2,388 ns/iter (+/- 431)
+test cases::tablecase::tests::bench_table_case                  ... bench:       2,240 ns/iter (+/- 446)
+test cases::titlecase::tests::bench_is_title                    ... bench:         786 ns/iter (+/- 135)
+test cases::titlecase::tests::bench_title                       ... bench:         826 ns/iter (+/- 278)
+test cases::titlecase::tests::bench_title_from_snake            ... bench:         723 ns/iter (+/- 256)
+test cases::uppercase::tests::bench_is_upper                    ... bench:         351 ns/iter (+/- 85)
+test cases::uppercase::tests::bench_upper                       ... bench:         332 ns/iter (+/- 48)
+```
+
+# 0.3.3
+
+## Fixes:
+
+- Fixes issue where camel case tests were not run
+- Fixes issue with camel case with numbers
+
+# 0.3.2
+
+## Fixes:
+
+- Fixes issue https://github.com/whatisinternet/inflector/issues/18
+- Fixes performance issues overall
+
+## Benchmarks:
+```shell
+test cases::camelcase::tests::bench_camel0                      ... bench:         139 ns/iter (+/- 40)
+test cases::camelcase::tests::bench_camel1                      ... bench:         138 ns/iter (+/- 31)
+test cases::camelcase::tests::bench_camel2                      ... bench:         138 ns/iter (+/- 41)
+test cases::camelcase::tests::bench_is_camel                    ... bench:         184 ns/iter (+/- 90)
+test cases::classcase::tests::bench_class_case                  ... bench:       2,383 ns/iter (+/- 557)
+test cases::classcase::tests::bench_class_from_snake            ... bench:       2,393 ns/iter (+/- 1,120)
+test cases::classcase::tests::bench_is_class                    ... bench:       2,443 ns/iter (+/- 1,060)
+test cases::kebabcase::tests::bench_is_kebab                    ... bench:         182 ns/iter (+/- 60)
+test cases::kebabcase::tests::bench_kebab                       ... bench:         161 ns/iter (+/- 98)
+test cases::kebabcase::tests::bench_kebab_from_snake            ... bench:         264 ns/iter (+/- 144)
+test cases::lowercase::tests::bench_is_lower                    ... bench:         358 ns/iter (+/- 154)
+test cases::lowercase::tests::bench_lower                       ... bench:         347 ns/iter (+/- 220)
+test cases::screamingsnakecase::tests::bench_is_screaming_snake ... bench:         194 ns/iter (+/- 35)
+test cases::screamingsnakecase::tests::bench_screaming_snake    ... bench:         173 ns/iter (+/- 97)
+test cases::sentencecase::tests::bench_is_sentence              ... bench:         377 ns/iter (+/- 83)
+test cases::sentencecase::tests::bench_sentence                 ... bench:         337 ns/iter (+/- 155)
+test cases::sentencecase::tests::bench_sentence_from_snake      ... bench:         370 ns/iter (+/- 176)
+test cases::snakecase::tests::bench_is_snake                    ... bench:         191 ns/iter (+/- 98)
+test cases::snakecase::tests::bench_snake_from_camel            ... bench:         156 ns/iter (+/- 25)
+test cases::snakecase::tests::bench_snake_from_snake            ... bench:         289 ns/iter (+/- 136)
+test cases::snakecase::tests::bench_snake_from_title            ... bench:         157 ns/iter (+/- 68)
+test cases::tablecase::tests::bench_is_table_case               ... bench:       2,253 ns/iter (+/- 978)
+test cases::tablecase::tests::bench_table_case                  ... bench:       2,227 ns/iter (+/- 704)
+test cases::titlecase::tests::bench_is_title                    ... bench:         787 ns/iter (+/- 362)
+test cases::titlecase::tests::bench_title                       ... bench:         826 ns/iter (+/- 317)
+test cases::titlecase::tests::bench_title_from_snake            ... bench:         747 ns/iter (+/- 230)
+test cases::uppercase::tests::bench_is_upper                    ... bench:         347 ns/iter (+/- 111)
+test cases::uppercase::tests::bench_upper                       ... bench:         328 ns/iter (+/- 42)
+```
+
+## OLD Benchmarks:
+```shell
+test cases::camelcase::tests::bench_camel                                         ... bench:       1,825 ns/iter (+/- 346)
+test cases::camelcase::tests::bench_camel_from_sname                              ... bench:       1,223 ns/iter (+/- 289)
+test cases::camelcase::tests::bench_is_camel                                      ... bench:      49,416 ns/iter (+/- 593)
+test cases::classcase::tests::bench_class_case                                    ... bench: 160,985,376 ns/iter (+/- 5,173,751)
+test cases::classcase::tests::bench_class_from_snake                              ... bench: 161,533,425 ns/iter (+/- 4,167,305)
+test cases::classcase::tests::bench_is_class                                      ... bench: 161,352,118 ns/iter (+/- 3,793,478)
+test cases::kebabcase::tests::bench_is_kebab                                      ... bench:         793 ns/iter (+/- 400)
+test cases::kebabcase::tests::bench_kebab                                         ... bench:         752 ns/iter (+/- 310)
+test cases::kebabcase::tests::bench_kebab_from_snake                              ... bench:         210 ns/iter (+/- 32)
+test cases::lowercase::tests::bench_is_lower                                      ... bench:         340 ns/iter (+/- 86)
+test cases::lowercase::tests::bench_lower                                         ... bench:         306 ns/iter (+/- 173)
+test cases::screamingsnakecase::tests::bench_is_screaming_snake                   ... bench:         635 ns/iter (+/- 210)
+test cases::screamingsnakecase::tests::bench_screaming_snake                      ... bench:         610 ns/iter (+/- 87)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_camel           ... bench:         961 ns/iter (+/- 579)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_class           ... bench:         894 ns/iter (+/- 352)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_kebab           ... bench:         877 ns/iter (+/- 571)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_screaming_snake ... bench:         584 ns/iter (+/- 304)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_sentence        ... bench:       1,123 ns/iter (+/- 630)
+test cases::screamingsnakecase::tests::bench_screaming_snake_from_upper_kebab     ... bench:         914 ns/iter (+/- 435)
+test cases::sentencecase::tests::bench_is_sentence                                ... bench:       2,714 ns/iter (+/- 796)
+test cases::sentencecase::tests::bench_sentence                                   ... bench:       2,678 ns/iter (+/- 1,357)
+test cases::sentencecase::tests::bench_sentence_from_snake                        ... bench:       2,100 ns/iter (+/- 1,046)
+test cases::snakecase::tests::bench_is_snake                                      ... bench:         626 ns/iter (+/- 191)
+test cases::snakecase::tests::bench_snake                                         ... bench:         581 ns/iter (+/- 298)
+test cases::snakecase::tests::bench_snake_from_camel                              ... bench:         882 ns/iter (+/- 328)
+test cases::snakecase::tests::bench_snake_from_class                              ... bench:         883 ns/iter (+/- 193)
+test cases::snakecase::tests::bench_snake_from_kebab                              ... bench:         922 ns/iter (+/- 360)
+test cases::snakecase::tests::bench_snake_from_sentence                           ... bench:       1,209 ns/iter (+/- 539)
+test cases::snakecase::tests::bench_snake_from_snake                              ... bench:         637 ns/iter (+/- 386)
+test cases::snakecase::tests::bench_snake_from_upper_kebab                        ... bench:         876 ns/iter (+/- 488)
+test cases::tablecase::tests::bench_is_table_case                                 ... bench:       5,784 ns/iter (+/- 1,129)
+test cases::tablecase::tests::bench_table_case                                    ... bench:       5,754 ns/iter (+/- 1,460)
+test cases::titlecase::tests::bench_is_title                                      ... bench:       2,847 ns/iter (+/- 1,553)
+test cases::titlecase::tests::bench_title                                         ... bench:       2,799 ns/iter (+/- 1,309)
+test cases::titlecase::tests::bench_title_from_snake                              ... bench:       2,202 ns/iter (+/- 697)
+test cases::uppercase::tests::bench_is_upper                                      ... bench:         357 ns/iter (+/- 55)
+test cases::uppercase::tests::bench_upper                                         ... bench:         311 ns/iter (+/- 135)
+```
+
+# 0.3.1
+
+## Fixes:
+
+- Fixes issue https://github.com/rust-lang/rust/pull/34660
+- Updates Regex to 0.1.73 for latest fixes
+
+# 0.3.0
+
+## Fixes:
+
+- Resolves issues with pluralize not always correctly pluralizing strings.
+  Thanks, @weiznich!
+- Resolves issues with silently failing test on table case
+- Replaces complex code used for is_*_case checks with simple conversion and
+  check equality.
+
+## Breaking changes:
+
+- Dropping support for Rust versions below stable
+
+# 0.2.1
+
+## Features:
+
+- Replaced custom implementation of lower and uppercase with Rust default
+
+## Breaking changes:
+
+- Rust 1.2 or greater required
+
+# 0.2.0
+
+## Features:
+
+- Added Pluralize
+- Added Singularize
+- Added Table case
+
+## Fixes:
+
+- Fixed doc tests to properly run as rust auto wraps doc tests in a function and
+  never ran the inner function that was defined.
+- Fixed documentation for kebab case
+- Fixed several failed tests for various cases which were mainly typos
+
+## Breaking changes:
+
+- Class case now singularizes strings and verifies that strings are
+  singularized. Those wishing for the old behaviour should remain on the 0.1.6
+  release.
+
+
+# 0.1.6
+
+## Features:
+
+- Added screaming snake case
+
+# 0.1.5
+
+## Fixes:
+
+- Refactored tests into doc tests.
+
+
+# 0.1.4
+
+## Features:
+
+- Significant performance improvement for casting strings between different case
+  types see #13.
+
+## Fixes:
+
+- Fixed performance issues with string casting.
+- Removed heavy reliance on Regex
+
+
+# 0.1.3
+
+## Fixes:
+
+- Refactored code to mostly pass through snake case then be converted to lower
+  the number of moving parts and reduce the complexity for adding a new casting
+  as only snake case would need to be modified to convert to most other cases.
+
+## Breaking changes:
+
+- This release is slow in contrast to other crates
+
+
+# 0.1.2
+
+## Fixes:
+
+- Documentation fixes
+- Added uppercase
+- Added lowercase
+- Added foreign key
+- Added sentence case
+- Added title case
+
+
+# 0.1.1
+
+## Features:
+- Adds support for foreign key
+- Adds demodulize
+- Adds deconstantize
+- Adds trait based usage
+
+
+# 0.1.0
+
+## Features:
+
+- Added support for camel case
+- Added support for class case
+- Added support for kebab case
+- Added support for snake case
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+# Thank you! :heart:
+
+This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## Getting started
+- If you don't have rust installed: Install [rustup](https://www.rustup.rs/)
+- For normal development on `master` run on stable
+  - `rustup toolchain install stable`
+  - `rustup default stable`
+
+- For development with benchmarks run nightly
+  - `rustup toolchain install nightly`
+  - `rustup default nightly`
+
+## Git/GitHub steps
+1. Fork it ( https://github.com/whatisinternet/inflector/fork )
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Add test for the new feature (conversions to all different casts MUST also
+   pass)
+4. Write some code to pass the tests
+5. Commit your changes (`git commit -am 'Add some feature'`)
+6. Push to the branch (`git push origin my-new-feature`)
+7. Create a new Pull Request
+
+### Running the tests
+- `cargo test`
+
+### Running the benchmarks
+- `cargo bench --features=unstable`
+
+## Is this an issues?
+
+- Please ensure you fill out an [issue](https://github.com/whatisinternet/inflector/issues)
+- Be available for questions.
+
+## Are you submitting documentation?
+
+- Awesome!
+- Has everything been run through spell check?
+
+## Are you submitting code?
+
+- Have you added doc tests and do they pass?
+- Do all other tests pass?
+- Have you added trait tests? (If applicable)
+- Have you filled out the pull request template?
+
+
+## Adding a trait
+Traits are now both easy to add and easy to test. Just follow the next steps:
+
+### Adding the trait
+- `src/lib.rs`
+- Add the function signature to the Inflector trait
+```rust
+//...
+use string::singularize::to_singular;
+//...
+pub trait Inflector { // Or InflectorNumbers
+    //...
+    fn your_trait(&self) -> [return_type];
+    //...
+}
+```
+- Add the function name an return type to either `implement_string_for` or
+   `implement_number_for`
+```rust
+  your_trait => [return_type]
+```
+- Add a benchmark following the current convention
+
+### Add the trait tests
+- `tests/lib.rs`
+- Add your trait following the current convention and the test will be
+   automatically generated
+
+Thank you for your help! :heart:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/Cargo.toml
@@ -0,0 +1,42 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "Inflector"
+version = "0.11.2"
+authors = ["Josh Teeter<joshteeter@gmail.com>"]
+exclude = [".travis.yml", ".gitignore"]
+description = "Adds String based inflections for Rust. Snake, kebab, camel, sentence, class, title and table cases as well as ordinalize, deordinalize, demodulize, foreign key, and pluralize/singularize are supported as both traits and pure functions acting on String types.\n"
+homepage = "https://github.com/whatisinternet/inflector"
+documentation = "https://docs.rs/Inflector"
+readme = "README.md"
+keywords = ["pluralize", "Inflector", "camel", "snake", "inflection"]
+categories = ["text-processing", "value-formatting"]
+license = "BSD-2-Clause"
+repository = "https://github.com/whatisinternet/inflector"
+
+[lib]
+name = "inflector"
+[dependencies.lazy_static]
+version = "1.0.0"
+optional = true
+
+[dependencies.regex]
+version = "0.2"
+optional = true
+
+[features]
+default = ["heavyweight"]
+heavyweight = ["regex", "lazy_static"]
+unstable = []
+[badges.travis-ci]
+repository = "whatisinternet/Inflector"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/LICENSE.md
@@ -0,0 +1,22 @@
+Copyright 2017 Josh Teeter
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,7 @@
+# What it does:
+
+
+# Why it does it:
+
+
+# Related issues:
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/README.md
@@ -0,0 +1,136 @@
+# Rust Inflector
+
+
+[![Build Status](https://travis-ci.org/whatisinternet/inflector.svg?branch=master)](https://travis-ci.org/whatisinternet/Inflector) [![codecov](https://codecov.io/gh/whatisinternet/Inflector/branch/master/graph/badge.svg)](https://codecov.io/gh/whatisinternet/inflector) [![Crates.io](https://img.shields.io/crates/v/inflector.svg)](https://crates.io/crates/inflector)
+
+
+Adds String based inflections for Rust. Snake, kebab, train, camel,
+sentence, class, and title cases as well as ordinalize,
+deordinalize, demodulize, deconstantize, foreign key, table case, and pluralize/singularize are supported as both traits and pure functions
+acting on &str and String types.
+
+-----
+## Documentation:
+
+Documentation can be found here at the README or via rust docs below.
+
+[Rust docs with examples](https://docs.rs/Inflector)
+
+-----
+
+## Installation:
+
+### As a [crate](http://crates.io)
+
+```toml
+[dependencies]
+Inflector = "*"
+```
+
+### Compile yourself:
+
+1. Install [Rust and cargo](http://doc.crates.io/)
+2. git clone https://github.com/whatisinternet/Inflector
+3. Library: cd inflector && cargo build --release --lib
+4. You can find the library in target/release
+
+## Usage / Example:
+
+```rust
+...
+// to use methods like String.to_lower_case();
+extern crate inflector;
+use inflector::Inflector;
+...
+fn main() {
+...
+  let camel_case_string: String = "some_string".to_camel_case();
+...
+}
+
+```
+
+Or
+
+```rust
+...
+// to use methods like to_snake_case(&str);
+extern crate inflector;
+
+// use inflector::cases::classcase::to_class_case;
+// use inflector::cases::classcase::is_class_case;
+
+// use inflector::cases::camelcase::to_camel_case;
+// use inflector::cases::camelcase::is_camel_case;
+
+// use inflector::cases::pascalcase::to_pascal_case;
+// use inflector::cases::pascalcase::is_pascal_case;
+
+// use inflector::cases::screamingsnakecase::to_screamingsnake_case;
+// use inflector::cases::screamingsnakecase::is_screamingsnake_case;
+
+// use inflector::cases::snakecase::to_snake_case;
+// use inflector::cases::snakecase::is_snake_case;
+
+// use inflector::cases::kebabcase::to_kebab_case;
+// use inflector::cases::kebabcase::is_kebab_case;
+
+// use inflector::cases::traincase::to_train_case;
+// use inflector::cases::traincase::is_train_case;
+
+// use inflector::cases::sentencecase::to_sentence_case;
+// use inflector::cases::sentencecase::is_sentence_case;
+
+// use inflector::cases::titlecase::to_title_case;
+// use inflector::cases::titlecase::is_title_case;
+
+// use inflector::cases::tablecase::to_table_case;
+// use inflector::cases::tablecase::is_table_case;
+
+// use inflector::numbers::ordinalize::ordinalize;
+// use inflector::numbers::deordinalize::deordinalize;
+
+// use inflector::suffix::foreignkey::to_foreign_key;
+// use inflector::suffix::foreignkey::is_foreign_key;
+
+// use inflector::string::demodulize::demodulize;
+// use inflector::string::deconstantize::deconstantize;
+
+// use inflector::string::pluralize::to_plural;
+// use inflector::string::singularize::to_singular;
+...
+fn main() {
+...
+  let camel_case_string: String = to_camel_case("some_string");
+...
+}
+
+```
+
+## Advanced installation and usage:
+
+If the project doesn't require singularize, pluralize, class, table, demodulize,
+deconstantize. Then in your `cargo.toml` you may wish to specify:
+
+```toml
+[dependencies.Inflector]
+version = "*"
+default-features = false
+```
+
+Or
+
+```toml
+Inflector = {version="*", default-features=false}
+
+```
+
+To test this crate locally with features off try:
+
+```shell
+cargo test --no-default-features
+```
+
+## [Contributing](CONTRIBUTING.md)
+
+This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
new file mode 100755
--- /dev/null
+++ b/third_party/rust/Inflector/benchmark
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
+
+cargo clean && \
+cargo bench --features=unstable>variable &&\
+git stash && \
+git checkout master && \
+cargo clean && \
+cargo bench --features=unstable>control &&\
+cargo benchcmp control variable --variance --threshold 10 &&\
+git checkout $branch &&\
+git stash apply
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/camelcase/mod.rs
@@ -0,0 +1,370 @@
+#![deny(warnings)]
+use cases::case::*;
+
+/// Converts a `&str` to camelCase `String`
+///
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "FooBar3";
+///     let expected_string: String = "fooBar3".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::to_camel_case;
+///     let mock_string: &str = "Foo-Bar";
+///     let expected_string: String = "fooBar".to_string();
+///     let asserted_string: String = to_camel_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_camel_case(non_camelized_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: false,
+        last_char: ' ',
+        first_word: false,
+        injectable_char: ' ',
+        has_seperator: false,
+        inverted: false,
+    };
+    to_case_camel_like(&non_camelized_string, options)
+}
+
+/// Determines if a `&str` is camelCase bool``
+///
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "Foo";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "foo";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "fooBarIsAReallyReally3LongString";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::camelcase::is_camel_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_camel_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+pub fn is_camel_case(test_string: &str) -> bool {
+    to_camel_case(&test_string.clone()) == test_string
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_camel0(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "Foo bar";
+            super::to_camel_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_camel1(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "foo_bar";
+            super::to_camel_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_camel2(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "fooBar";
+            super::to_camel_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_is_camel(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string: &str = "Foo bar";
+            super::is_camel_case(test_string)
+        });
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_camel_case;
+    use ::is_camel_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "fooBar".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "robertCMartin".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "randomTextWithBadChars".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "trailingBadChars".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "leadingBadChars".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "wrappedInBadChars".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "hasASign".to_owned();
+        assert_eq!(to_camel_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_camel_case(&convertable_string), false)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/case/mod.rs
@@ -0,0 +1,303 @@
+#![deny(warnings)]
+#[allow(unknown_lints)]
+#[allow(unused_imports)]
+use std::ascii::*;
+
+pub struct CamelOptions {
+    pub new_word: bool,
+    pub last_char: char,
+    pub first_word: bool,
+    pub injectable_char: char,
+    pub has_seperator: bool,
+    pub inverted: bool,
+}
+
+pub fn to_case_snake_like(convertable_string: &str, replace_with: &str, case: &str) -> String {
+    let mut first_character: bool = true;
+    let mut result: String = String::with_capacity(convertable_string.len() * 2);
+    for char_with_index in trim_right(convertable_string).char_indices() {
+        if char_is_seperator(&char_with_index.1) {
+            if !first_character {
+                first_character = true;
+                result.push(replace_with.chars().nth(0).unwrap_or('_'));
+            }
+        } else if requires_seperator(char_with_index, first_character, &convertable_string) {
+            first_character = false;
+            result = snake_like_with_seperator(result, replace_with, &char_with_index.1, case)
+        } else {
+            first_character = false;
+            result = snake_like_no_seperator(result, &char_with_index.1, case)
+        }
+    }
+    result
+}
+
+pub fn to_case_camel_like(convertable_string: &str, camel_options: CamelOptions) -> String {
+    let mut new_word: bool = camel_options.new_word;
+    let mut first_word: bool = camel_options.first_word;
+    let mut last_char: char = camel_options.last_char;
+    let mut found_real_char: bool = false;
+    let mut result: String = String::with_capacity(convertable_string.len() * 2);
+    for character in trim_right(convertable_string).chars() {
+        if char_is_seperator(&character) && found_real_char {
+            new_word = true;
+        } else if !found_real_char && is_not_alphanumeric(character) {
+            continue;
+        } else if character.is_numeric() {
+            found_real_char = true;
+            new_word = true;
+            result.push(character);
+        } else if last_char_lower_current_is_upper_or_new_word(new_word, last_char, character) {
+            found_real_char = true;
+            new_word = false;
+            result = append_on_new_word(result, first_word, character, &camel_options);
+            first_word = false;
+        } else {
+            found_real_char = true;
+            last_char = character;
+            result.push(character.to_ascii_lowercase());
+        }
+    }
+    result
+}
+
+#[inline]
+fn append_on_new_word(mut result: String, first_word: bool, character: char, camel_options: &CamelOptions) -> String {
+    if not_first_word_and_has_seperator(first_word, camel_options.has_seperator) {
+        result.push(camel_options.injectable_char);
+    }
+    if first_word_or_not_inverted(first_word, camel_options.inverted) {
+        result.push(character.to_ascii_uppercase());
+    } else {
+        result.push(character.to_ascii_lowercase());
+    }
+    result
+}
+
+fn not_first_word_and_has_seperator(first_word: bool, has_seperator: bool) -> bool {
+    has_seperator && !first_word
+}
+
+fn first_word_or_not_inverted(first_word: bool, inverted: bool) -> bool {
+    !inverted || first_word
+}
+
+
+fn last_char_lower_current_is_upper_or_new_word(new_word: bool, last_char: char, character: char) -> bool{
+    new_word ||
+        ((last_char.is_lowercase() && character.is_uppercase()) &&
+         (last_char != ' '))
+}
+
+fn char_is_seperator(character: &char) -> bool {
+    is_not_alphanumeric(*character)
+}
+
+fn trim_right(convertable_string: &str) -> &str {
+    convertable_string.trim_right_matches(is_not_alphanumeric)
+}
+
+fn is_not_alphanumeric(character: char) -> bool {
+    !character.is_alphanumeric()
+}
+
+#[inline]
+fn requires_seperator(char_with_index: (usize, char), first_character: bool, convertable_string: &str) -> bool {
+    !first_character &&
+        char_is_uppercase(char_with_index.1) &&
+            next_or_previous_char_is_lowercase(convertable_string, char_with_index.0)
+}
+
+#[inline]
+fn snake_like_no_seperator(mut accumlator: String, current_char: &char, case: &str) -> String {
+    if case == "lower" {
+        accumlator.push(current_char.to_ascii_lowercase());
+        accumlator
+    } else {
+        accumlator.push(current_char.to_ascii_uppercase());
+        accumlator
+    }
+}
+
+#[inline]
+fn snake_like_with_seperator(mut accumlator: String, replace_with: &str, current_char: &char, case: &str) -> String {
+    if case == "lower" {
+        accumlator.push(replace_with.chars().nth(0).unwrap_or('_'));
+        accumlator.push(current_char.to_ascii_lowercase());
+        accumlator
+    } else {
+        accumlator.push(replace_with.chars().nth(0).unwrap_or('_'));
+        accumlator.push(current_char.to_ascii_uppercase());
+        accumlator
+    }
+}
+
+fn next_or_previous_char_is_lowercase(convertable_string: &str, char_with_index: usize) -> bool {
+    convertable_string.chars().nth(char_with_index + 1).unwrap_or('A').is_lowercase() ||
+        convertable_string.chars().nth(char_with_index - 1).unwrap_or('A').is_lowercase()
+}
+
+fn char_is_uppercase(test_char: char) -> bool {
+    test_char == test_char.to_ascii_uppercase()
+}
+
+#[test]
+fn test_trim_bad_chars() {
+    assert_eq!("abc", trim_right("abc----^"))
+}
+
+#[test]
+fn test_trim_bad_chars_when_none_are_bad() {
+    assert_eq!("abc", trim_right("abc"))
+}
+
+#[test]
+fn test_is_not_alphanumeric_on_is_alphanumeric() {
+    assert!(!is_not_alphanumeric('a'))
+}
+
+#[test]
+fn test_is_not_alphanumeric_on_is_not_alphanumeric() {
+    assert!(is_not_alphanumeric('_'))
+}
+
+
+#[test]
+fn test_char_is_uppercase_when_it_is() {
+    assert_eq!(char_is_uppercase('A'), true)
+}
+
+#[test]
+fn test_char_is_uppercase_when_it_is_not() {
+    assert_eq!(char_is_uppercase('a'), false)
+}
+
+#[test]
+fn test_next_or_previous_char_is_lowercase_true() {
+    assert_eq!(next_or_previous_char_is_lowercase("TestWWW", 3), true)
+}
+
+#[test]
+fn test_next_or_previous_char_is_lowercase_false() {
+    assert_eq!(next_or_previous_char_is_lowercase("TestWWW", 5), false)
+}
+
+#[test]
+fn snake_like_with_seperator_lowers() {
+    assert_eq!(snake_like_with_seperator("".to_owned(), "^", &'c', "lower"), "^c".to_string())
+}
+
+#[test]
+fn snake_like_with_seperator_upper() {
+    assert_eq!(snake_like_with_seperator("".to_owned(), "^", &'c', "upper"), "^C".to_string())
+}
+
+#[test]
+fn snake_like_no_seperator_lower() {
+    assert_eq!(snake_like_no_seperator("".to_owned(), &'C', "lower"), "c".to_string())
+}
+
+#[test]
+fn snake_like_no_seperator_upper() {
+    assert_eq!(snake_like_no_seperator("".to_owned(), &'c', "upper"), "C".to_string())
+}
+
+#[test]
+fn requires_seperator_upper_not_first_wrap_is_safe_current_upper() {
+    assert_eq!(requires_seperator((2, 'C'), false, "test"), true)
+}
+
+#[test]
+fn requires_seperator_upper_not_first_wrap_is_safe_current_lower() {
+    assert_eq!(requires_seperator((2, 'c'), false, "test"), false)
+}
+
+#[test]
+fn requires_seperator_upper_first_wrap_is_safe_current_upper() {
+    assert_eq!(requires_seperator((0, 'T'), true, "Test"), false)
+}
+
+#[test]
+fn requires_seperator_upper_first_wrap_is_safe_current_lower() {
+    assert_eq!(requires_seperator((0, 't'), true, "Test"), false)
+}
+
+#[test]
+fn requires_seperator_upper_first_wrap_is_safe_current_lower_next_is_too() {
+    assert_eq!(requires_seperator((0, 't'), true, "test"), false)
+}
+
+#[test]
+fn test_char_is_seperator_dash() {
+    assert_eq!(char_is_seperator(&'-'), true)
+}
+
+#[test]
+fn test_char_is_seperator_underscore() {
+    assert_eq!(char_is_seperator(&'_'), true)
+}
+
+#[test]
+fn test_char_is_seperator_space() {
+    assert_eq!(char_is_seperator(&' '), true)
+}
+
+#[test]
+fn test_char_is_seperator_when_not() {
+    assert_eq!(char_is_seperator(&'A'), false)
+}
+
+#[test]
+fn test_last_char_lower_current_is_upper_or_new_word_with_new_word() {
+    assert_eq!(last_char_lower_current_is_upper_or_new_word(true, ' ', '-'), true)
+}
+
+#[test]
+fn test_last_char_lower_current_is_upper_or_new_word_last_char_space() {
+    assert_eq!(last_char_lower_current_is_upper_or_new_word(false, ' ', '-'), false)
+}
+
+#[test]
+fn test_last_char_lower_current_is_upper_or_new_word_last_char_lower_current_upper() {
+    assert_eq!(last_char_lower_current_is_upper_or_new_word(false, 'a', 'A'), true)
+}
+
+#[test]
+fn test_last_char_lower_current_is_upper_or_new_word_last_char_upper_current_upper() {
+    assert_eq!(last_char_lower_current_is_upper_or_new_word(false, 'A', 'A'), false)
+}
+
+#[test]
+fn test_last_char_lower_current_is_upper_or_new_word_last_char_upper_current_lower() {
+    assert_eq!(last_char_lower_current_is_upper_or_new_word(false, 'A', 'a'), false)
+}
+
+#[test]
+fn test_first_word_or_not_inverted_with_first_word() {
+    assert_eq!(first_word_or_not_inverted(true, false), true)
+}
+
+#[test]
+fn test_first_word_or_not_inverted_not_first_word_not_inverted() {
+    assert_eq!(first_word_or_not_inverted(false, false), true)
+}
+
+#[test]
+fn test_first_word_or_not_inverted_not_first_word_is_inverted() {
+    assert_eq!(first_word_or_not_inverted(false, true), false)
+}
+
+#[test]
+fn test_not_first_word_and_has_seperator_is_first_and_not_seperator() {
+    assert_eq!(not_first_word_and_has_seperator(true, false), false)
+}
+
+#[test]
+fn test_not_first_word_and_has_seperator_not_first_and_not_seperator() {
+    assert_eq!(not_first_word_and_has_seperator(false, false), false)
+}
+
+#[test]
+fn test_not_first_word_and_has_seperator_not_first_and_has_seperator() {
+    assert_eq!(not_first_word_and_has_seperator(false, true), true)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/classcase/mod.rs
@@ -0,0 +1,393 @@
+#![deny(warnings)]
+use cases::case::*;
+#[cfg(feature = "heavyweight")]
+use string::singularize::to_singular;
+#[cfg(feature = "heavyweight")]
+/// Converts a `&str` to `ClassCase` `String`
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "FooBars";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "foo_bars";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::to_class_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_class_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_class_case(non_class_case_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: true,
+        last_char: ' ',
+        first_word: false,
+        injectable_char: ' ',
+        has_seperator: false,
+        inverted: false,
+    };
+    let class_plural = to_case_camel_like(non_class_case_string, options);
+    let split: (&str, &str) =
+        class_plural.split_at(class_plural.rfind(char::is_uppercase).unwrap_or(0));
+    format!("{}{}", split.0, to_singular(split.1))
+}
+
+#[cfg(feature = "heavyweight")]
+/// Determines if a `&str` is `ClassCase` `bool`
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "Foo";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "foo";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongStrings";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "foo_bar_is_a_really_really_long_strings";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::classcase::is_class_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_class_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+pub fn is_class_case(test_string: &str) -> bool {
+    to_class_case(&test_string.clone()) == test_string
+}
+
+#[cfg(all(feature = "unstable", test))]
+#[cfg(feature = "heavyweight")]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_class_case(b: &mut Bencher) {
+        b.iter(|| super::to_class_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_is_class(b: &mut Bencher) {
+        b.iter(|| super::is_class_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_class_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_class_case("foo_bar"));
+    }
+}
+
+#[cfg(test)]
+#[cfg(feature = "heavyweight")]
+mod tests {
+    use ::to_class_case;
+    use ::is_class_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_class_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_table_case() {
+        let convertable_string: String = "foo_bars".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "RobertCMartin".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "RandomTextWithBadChar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "TrailingBadChar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "LeadingBadChar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "WrappedInBadChar".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "HasASign".to_owned();
+        assert_eq!(to_class_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_class_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_table_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_class_case(&convertable_string), true)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/kebabcase/mod.rs
@@ -0,0 +1,262 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Determines if a `&str` is `kebab-case`
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::is_kebab_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_kebab_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+pub fn is_kebab_case(test_string: &str) -> bool {
+    test_string == to_kebab_case(test_string.clone())
+}
+
+/// Converts a `&str` to `kebab-case` `String`
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::kebabcase::to_kebab_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "foo-bar".to_string();
+///     let asserted_string: String = to_kebab_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_kebab_case(non_kebab_case_string: &str) -> String {
+    to_case_snake_like(non_kebab_case_string, "-", "lower")
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_kebab(b: &mut Bencher) {
+        b.iter(|| super::to_kebab_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_is_kebab(b: &mut Bencher) {
+        b.iter(|| super::is_kebab_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_kebab_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_kebab_case("test_test_test"));
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_kebab_case;
+    use ::is_kebab_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "foo-bar".to_owned();
+        assert_eq!(to_kebab_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_kebab_case(&convertable_string), false)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/mod.rs
@@ -0,0 +1,52 @@
+mod case;
+/// Provides conversion to and detection of class case strings.
+///
+/// This version singularizes strings.
+///
+/// Example string `ClassCase`
+pub mod classcase;
+
+/// Provides conversion to and detection of camel case strings.
+///
+/// Example string `camelCase`
+pub mod camelcase;
+
+/// Provides conversion to and detection of snake case strings.
+///
+/// Example string `snake_case`
+pub mod snakecase;
+
+/// Provides conversion to and detection of screaming snake case strings.
+///
+/// Example string `SCREAMING_SNAKE_CASE`
+pub mod screamingsnakecase;
+
+/// Provides conversion to and detection of kebab case strings.
+///
+/// Example string `kebab-case`
+pub mod kebabcase;
+
+/// Provides conversion to and detection of train case strings.
+///
+/// Example string `Train-Case`
+pub mod traincase;
+
+/// Provides conversion to and detection of sentence case strings.
+///
+/// Example string `Sentence case`
+pub mod sentencecase;
+
+/// Provides conversion to and detection of title case strings.
+///
+/// Example string `Title Case`
+pub mod titlecase;
+
+/// Provides conversion to and detection of table case strings.
+///
+/// Example string `table_cases`
+pub mod tablecase;
+
+/// Provides conversion to pascal case strings.
+///
+/// Example string `PascalCase`
+pub mod pascalcase;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/pascalcase/mod.rs
@@ -0,0 +1,360 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Converts a `&str` to pascalCase `String`
+///
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "FooBar".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::to_pascal_case;
+///     let mock_string: &str = "FooBar3";
+///     let expected_string: String = "FooBar3".to_string();
+///     let asserted_string: String = to_pascal_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_pascal_case(non_pascalized_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: true,
+        last_char: ' ',
+        first_word: false,
+        injectable_char: ' ',
+        has_seperator: false,
+        inverted: false,
+    };
+    to_case_camel_like(non_pascalized_string, options)
+}
+
+/// Determines if a `&str` is pascalCase bool``
+///
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "Foo";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "foo";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "FooBarIsAReallyReally3LongString";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+///
+/// ```
+/// ```
+///     use inflector::cases::pascalcase::is_pascal_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_pascal_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+pub fn is_pascal_case(test_string: &str) -> bool {
+    to_pascal_case(test_string.clone()) == test_string
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_pascal0(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "Foo bar";
+            super::to_pascal_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_pascal1(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "foo_bar";
+            super::to_pascal_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_pascal2(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string = "fooBar";
+            super::to_pascal_case(test_string)
+        });
+    }
+
+    #[bench]
+    fn bench_is_pascal(b: &mut Bencher) {
+        b.iter(|| {
+            let test_string: &str = "Foo bar";
+            super::is_pascal_case(test_string)
+        });
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_pascal_case;
+    use ::is_pascal_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "FooBar".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "RobertCMartin".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "RandomTextWithBadChars".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "TrailingBadChars".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "LeadingBadChars".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "WrappedInBadChars".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "HasASign".to_owned();
+        assert_eq!(to_pascal_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_pascal_case(&convertable_string), false)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/screamingsnakecase/mod.rs
@@ -0,0 +1,253 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Converts a `&str` to `SCREAMING_SNAKE_CASE` `String`
+///
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "HTTP Foo bar";
+///     let expected_string: String = "HTTP_FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "FOO_BAR".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::to_screaming_snake_case;
+///     let mock_string: &str = "fooBar3";
+///     let expected_string: String = "FOO_BAR_3".to_string();
+///     let asserted_string: String = to_screaming_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_screaming_snake_case(non_snake_case_string: &str) -> String {
+    to_case_snake_like(non_snake_case_string, "_", "upper")
+}
+
+/// Determines of a `&str` is `SCREAMING_SNAKE_CASE`
+///
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "FOO_BAR1_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+/// ```
+///     use inflector::cases::screamingsnakecase::is_screaming_snake_case;
+///     let mock_string: &str = "FOO_BAR_1_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_screaming_snake_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+pub fn is_screaming_snake_case(test_string: &str) -> bool {
+    test_string == to_screaming_snake_case(test_string.clone())
+}
+
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_screaming_snake(b: &mut Bencher) {
+        b.iter(|| super::to_screaming_snake_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_is_screaming_snake(b: &mut Bencher) {
+        b.iter(|| super::is_screaming_snake_case("Foo bar"));
+    }
+
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_screaming_snake_case;
+    use ::is_screaming_snake_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "FOO_BAR".to_owned();
+        assert_eq!(to_screaming_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_screaming_snake_case(&convertable_string), false)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/sentencecase/mod.rs
@@ -0,0 +1,313 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Converts a `&str` to `Sentence case` `String`
+///
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::to_sentence_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "Foo bar".to_string();
+///     let asserted_string: String = to_sentence_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_sentence_case(non_sentence_case_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: true,
+        last_char: ' ',
+        first_word: true,
+        injectable_char: ' ',
+        has_seperator: true,
+        inverted: true,
+    };
+    to_case_camel_like(non_sentence_case_string, options)
+}
+/// Determines of a `&str` is `Sentence case`
+///
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "Foo";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "foo";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::sentencecase::is_sentence_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_sentence_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+pub fn is_sentence_case(test_string: &str) -> bool {
+    test_string == to_sentence_case(test_string.clone())
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_sentence(b: &mut Bencher) {
+        b.iter(|| super::to_sentence_case("Foo BAR"));
+    }
+
+    #[bench]
+    fn bench_is_sentence(b: &mut Bencher) {
+        b.iter(|| super::is_sentence_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_sentence_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_sentence_case("foo_bar"));
+    }
+
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_sentence_case;
+    use ::is_sentence_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "Foo bar".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "Robert c martin".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "Random text with bad chars".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "Trailing bad chars".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "Leading bad chars".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "Wrapped in bad chars".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "Has a sign".to_owned();
+        assert_eq!(to_sentence_case(&convertable_string), expected)
+    }
+
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_sentence_case(&convertable_string), false)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/snakecase/mod.rs
@@ -0,0 +1,334 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Converts a `&str` to `snake_case` `String`
+///
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "HTTP Foo bar";
+///     let expected_string: String = "http_foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "HTTPFooBar";
+///     let expected_string: String = "http_foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "foo_bar".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::to_snake_case;
+///     let mock_string: &str = "fooBar3";
+///     let expected_string: String = "foo_bar_3".to_string();
+///     let asserted_string: String = to_snake_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_snake_case(non_snake_case_string: &str) -> String {
+    to_case_snake_like(non_snake_case_string, "_", "lower")
+}
+
+/// Determines of a `&str` is `snake_case`
+///
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "FOO_BAR_IS_A_REALLY_REALLY_LONG_STRING";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "foo_bar1_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::snakecase::is_snake_case;
+///     let mock_string: &str = "foo_bar_1_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_snake_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+pub fn is_snake_case(test_string: &str) -> bool {
+    test_string == to_snake_case(test_string.clone())
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_snake_from_title(b: &mut Bencher) {
+        b.iter(|| super::to_snake_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_snake_from_camel(b: &mut Bencher) {
+        b.iter(|| super::to_snake_case("fooBar"));
+    }
+
+    #[bench]
+    fn bench_snake_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_snake_case("foo_bar_bar_bar"));
+    }
+
+    #[bench]
+    fn bench_is_snake(b: &mut Bencher) {
+        b.iter(|| super::is_snake_case("Foo bar"));
+    }
+
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_snake_case;
+    use ::is_snake_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "foo_bar".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "robert_c_martin".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "random_text_with_bad_chars".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "trailing_bad_chars".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "leading_bad_chars".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "wrapped_in_bad_chars".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "has_a_sign".to_owned();
+        assert_eq!(to_snake_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_snake_case(&convertable_string), true)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/tablecase/mod.rs
@@ -0,0 +1,271 @@
+#![deny(warnings)]
+#[cfg(feature = "heavyweight")]
+use string::pluralize::to_plural;
+#[cfg(feature = "heavyweight")]
+use cases::case::*;
+#[cfg(feature = "heavyweight")]
+/// Converts a `&str` to `table-case` `String`
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "foo-bar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "FOO_BAR";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "foo_bar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "Foo Bar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "Foo bar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "FooBar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+///
+/// ```
+/// use inflector::cases::tablecase::to_table_case;
+/// let mock_string: &str = "fooBar";
+/// let expected_string: String = "foo_bars".to_string();
+/// let asserted_string: String = to_table_case(mock_string);
+/// assert!(asserted_string == expected_string);
+/// ```
+pub fn to_table_case(non_table_case_string: &str) -> String {
+    let snaked: String = to_case_snake_like(non_table_case_string, "_", "lower");
+    let split: (&str, &str) = snaked.split_at(snaked.rfind('_').unwrap_or(0));
+    format!("{}{}", split.0, to_plural(split.1))
+}
+
+#[cfg(feature = "heavyweight")]
+/// Determines if a `&str` is `table-case`
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "foo_bar_strings";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == true);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+///
+/// ```
+///     use inflector::cases::tablecase::is_table_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_table_case(mock_string);
+///     assert!(asserted_bool == false);
+/// ```
+pub fn is_table_case(test_string: &str) -> bool {
+     to_table_case(&test_string.clone()) == test_string
+}
+
+#[cfg(all(feature = "unstable", test))]
+#[cfg(feature = "heavyweight")]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_table_case(b: &mut Bencher) {
+        b.iter(|| super::to_table_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_is_table_case(b: &mut Bencher) {
+        b.iter(|| super::is_table_case("Foo bar"));
+    }
+}
+
+#[cfg(test)]
+#[cfg(feature = "heavyweight")]
+mod tests {
+    use ::to_table_case;
+    use ::is_table_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_table_case() {
+        let convertable_string: String = "foo_bars".to_owned();
+        let expected: String = "foo_bars".to_owned();
+        assert_eq!(to_table_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_table_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_table_case() {
+        let convertable_string: String = "foo_bars".to_owned();
+        assert_eq!(is_table_case(&convertable_string), true)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/titlecase/mod.rs
@@ -0,0 +1,308 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Converts a `&str` to `Title Case` `String`
+///
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::to_title_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "Foo Bar".to_string();
+///     let asserted_string: String = to_title_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_title_case(non_title_case_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: true,
+        last_char: ' ',
+        first_word: true,
+        injectable_char: ' ',
+        has_seperator: true,
+        inverted: false,
+    };
+    to_case_camel_like(non_title_case_string, options)
+}
+
+/// Determines if a `&str` is `Title Case`
+///
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "foo";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::cases::titlecase::is_title_case;
+///     let mock_string: &str = "Foo Bar String That Is Really Really Long";
+///     let asserted_bool: bool = is_title_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+pub fn is_title_case(test_string: &str) -> bool {
+    test_string == to_title_case(test_string.clone())
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_title(b: &mut Bencher) {
+        b.iter(|| super::to_title_case("Foo BAR"));
+    }
+
+    #[bench]
+    fn bench_is_title(b: &mut Bencher) {
+        b.iter(|| super::is_title_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_title_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_title_case("foo_bar"));
+    }
+
+}
+
+
+#[cfg(test)]
+mod tests {
+    use ::to_title_case;
+    use ::is_title_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "Foo Bar".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "Robert C Martin".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "Random Text With Bad Chars".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "Trailing Bad Chars".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "Leading Bad Chars".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "Wrapped In Bad Chars".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "Has A Sign".to_owned();
+        assert_eq!(to_title_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_title_case(&convertable_string), false)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/cases/traincase/mod.rs
@@ -0,0 +1,320 @@
+#![deny(warnings)]
+use cases::case::*;
+/// Determines if a `&str` is `Train-Case`
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "Foo-Bar-String-That-Is-Really-Really-Long";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::is_train_case;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_train_case(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+pub fn is_train_case(test_string: &str) -> bool {
+    test_string == to_train_case(test_string.clone())
+}
+
+
+/// Converts a `&str` to `Train-Case` `String`
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "foo-bar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "FOO_BAR";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+/// ```
+///     use inflector::cases::traincase::to_train_case;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "Foo-Bar".to_string();
+///     let asserted_string: String = to_train_case(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_train_case(non_train_case_string: &str) -> String {
+    let options = CamelOptions {
+        new_word: true,
+        last_char: ' ',
+        first_word: true,
+        injectable_char: '-',
+        has_seperator: true,
+        inverted: false,
+    };
+    to_case_camel_like(non_train_case_string, options)
+}
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+
+    #[bench]
+    fn bench_train(b: &mut Bencher) {
+        b.iter(|| super::to_train_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_is_train(b: &mut Bencher) {
+        b.iter(|| super::is_train_case("Foo bar"));
+    }
+
+    #[bench]
+    fn bench_train_from_snake(b: &mut Bencher) {
+        b.iter(|| super::to_train_case("test_test_test"));
+    }
+
+}
+
+#[cfg(test)]
+mod tests {
+    use ::to_train_case;
+    use ::is_train_case;
+
+    #[test]
+    fn from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn from_case_with_loads_of_space() {
+        let convertable_string: String = "foo           bar".to_owned();
+        let expected: String = "Foo-Bar".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn a_name_with_a_dot() {
+        let convertable_string: String = "Robert C. Martin".to_owned();
+        let expected: String = "Robert-C-Martin".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn random_text_with_bad_chars() {
+        let convertable_string: String = "Random text with *(bad) chars".to_owned();
+        let expected: String = "Random-Text-With-Bad-Chars".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn trailing_bad_chars() {
+        let convertable_string: String = "trailing bad_chars*(()())".to_owned();
+        let expected: String = "Trailing-Bad-Chars".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn leading_bad_chars() {
+        let convertable_string: String = "-!#$%leading bad chars".to_owned();
+        let expected: String = "Leading-Bad-Chars".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn wrapped_in_bad_chars() {
+        let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
+        let expected: String = "Wrapped-In-Bad-Chars".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn has_a_sign() {
+        let convertable_string: String = "has a + sign".to_owned();
+        let expected: String = "Has-A-Sign".to_owned();
+        assert_eq!(to_train_case(&convertable_string), expected)
+    }
+
+    #[test]
+    fn is_correct_from_camel_case() {
+        let convertable_string: String = "fooBar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_pascal_case() {
+        let convertable_string: String = "FooBar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_kebab_case() {
+        let convertable_string: String = "foo-bar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_sentence_case() {
+        let convertable_string: String = "Foo bar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_title_case() {
+        let convertable_string: String = "Foo Bar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_train_case() {
+        let convertable_string: String = "Foo-Bar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), true)
+    }
+
+    #[test]
+    fn is_correct_from_screaming_snake_case() {
+        let convertable_string: String = "FOO_BAR".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+
+    #[test]
+    fn is_correct_from_snake_case() {
+        let convertable_string: String = "foo_bar".to_owned();
+        assert_eq!(is_train_case(&convertable_string), false)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/lib.rs
@@ -0,0 +1,332 @@
+#![deny(warnings, unused_variables, missing_docs, unsafe_code, unused_extern_crates)]
+#![cfg_attr(feature = "unstable", feature(test))]
+
+//! Adds String based inflections for Rust. Snake, kebab, train, camel,
+//! sentence, class, and title cases as well as ordinalize,
+//! deordinalize, demodulize, deconstantize, and foreign key are supported as
+//! both traits and pure functions acting on String types.
+//! ```rust
+//! use inflector::Inflector;
+//! let camel_case_string: String = "some_string".to_camel_case();
+//! let is_camel_cased: bool= camel_case_string.is_camel_case();
+//! assert!(is_camel_cased == true);
+//! ```
+
+#[cfg(feature = "heavyweight")]
+extern crate regex;
+
+#[cfg(feature = "heavyweight")]
+#[macro_use] extern crate lazy_static;
+
+/// Provides case inflections
+/// - Camel case
+/// - Class case
+/// - Kebab case
+/// - Train case
+/// - Screaming snake case
+/// - Table case
+/// - Sentence case
+/// - Snake case
+/// - Pascal case
+pub mod cases;
+/// Provides number inflections
+/// - Ordinalize
+/// - Deordinalize
+pub mod numbers;
+/// Provides suffix inflections
+/// - Foreign key
+pub mod suffix;
+/// Provides string inflections
+/// - Deconstantize
+/// - Demodulize
+/// - Pluralize
+/// - Singularize
+#[cfg(feature = "heavyweight")]
+pub mod string;
+
+
+#[cfg(feature = "heavyweight")]
+use cases::classcase::to_class_case;
+#[cfg(feature = "heavyweight")]
+use cases::classcase::is_class_case;
+
+use cases::camelcase::to_camel_case;
+use cases::camelcase::is_camel_case;
+
+use cases::pascalcase::to_pascal_case;
+use cases::pascalcase::is_pascal_case;
+
+use cases::snakecase::to_snake_case;
+use cases::snakecase::is_snake_case;
+
+use cases::screamingsnakecase::to_screaming_snake_case;
+use cases::screamingsnakecase::is_screaming_snake_case;
+
+use cases::kebabcase::to_kebab_case;
+use cases::kebabcase::is_kebab_case;
+
+use cases::traincase::to_train_case;
+use cases::traincase::is_train_case;
+
+use cases::sentencecase::to_sentence_case;
+use cases::sentencecase::is_sentence_case;
+
+use cases::titlecase::to_title_case;
+use cases::titlecase::is_title_case;
+
+#[cfg(feature = "heavyweight")]
+use cases::tablecase::to_table_case;
+#[cfg(feature = "heavyweight")]
+use cases::tablecase::is_table_case;
+
+use numbers::ordinalize::ordinalize;
+use numbers::deordinalize::deordinalize;
+
+use suffix::foreignkey::to_foreign_key;
+use suffix::foreignkey::is_foreign_key;
+
+#[cfg(feature = "heavyweight")]
+use string::demodulize::demodulize;
+#[cfg(feature = "heavyweight")]
+use string::deconstantize::deconstantize;
+
+#[cfg(feature = "heavyweight")]
+use string::pluralize::to_plural;
+#[cfg(feature = "heavyweight")]
+use string::singularize::to_singular;
+
+#[allow(missing_docs)]
+pub trait Inflector {
+
+    fn to_camel_case(&self) -> String;
+    fn is_camel_case(&self) -> bool;
+
+    fn to_pascal_case(&self) -> String;
+    fn is_pascal_case(&self) -> bool;
+
+    fn to_snake_case(&self) -> String;
+    fn is_snake_case(&self) -> bool;
+
+    fn to_screaming_snake_case(&self) -> String;
+    fn is_screaming_snake_case(&self) -> bool;
+
+    fn to_kebab_case(&self) -> String;
+    fn is_kebab_case(&self) -> bool;
+
+    fn to_train_case(&self) -> String;
+    fn is_train_case(&self) -> bool;
+
+    fn to_sentence_case(&self) -> String;
+    fn is_sentence_case(&self) -> bool;
+
+    fn to_title_case(&self) -> String;
+    fn is_title_case(&self) -> bool;
+
+    fn ordinalize(&self) -> String;
+    fn deordinalize(&self) -> String;
+
+    fn to_foreign_key(&self) -> String;
+    fn is_foreign_key(&self) -> bool;
+
+    #[cfg(feature = "heavyweight")]
+    fn demodulize(&self) -> String;
+    #[cfg(feature = "heavyweight")]
+    fn deconstantize(&self) -> String;
+
+    #[cfg(feature = "heavyweight")]
+    fn to_class_case(&self) -> String;
+    #[cfg(feature = "heavyweight")]
+    fn is_class_case(&self) -> bool;
+
+    #[cfg(feature = "heavyweight")]
+    fn to_table_case(&self) -> String;
+    #[cfg(feature = "heavyweight")]
+    fn is_table_case(&self) -> bool;
+    #[cfg(feature = "heavyweight")]
+    fn to_plural(&self) -> String;
+    #[cfg(feature = "heavyweight")]
+    fn to_singular(&self) -> String;
+}
+
+
+#[allow(missing_docs)]
+pub trait InflectorNumbers {
+    fn ordinalize(&self) -> String;
+}
+
+
+macro_rules! define_implementations {
+    ( $slf:ident; $($imp_trait:ident => $typ:ident), *) => {
+        $(
+            #[inline]
+            fn $imp_trait(&$slf) -> $typ {
+                $imp_trait($slf)
+            }
+        )*
+    }
+}
+
+macro_rules! define_number_implementations {
+    ( $slf:ident; $($imp_trait:ident => $typ:ident), *) => {
+        $(
+            #[inline]
+            fn $imp_trait(&$slf) -> $typ {
+                $imp_trait(&$slf.to_string())
+            }
+        )*
+    }
+}
+
+macro_rules! define_gated_implementations {
+    ( $slf:ident; $($imp_trait:ident => $typ:ident), *) => {
+        $(
+            #[inline]
+            #[cfg(feature = "heavyweight")]
+            fn $imp_trait(&$slf) -> $typ {
+                $imp_trait($slf)
+            }
+        )*
+    }
+}
+
+macro_rules! implement_string_for {
+    ( $trt:ident; $($typ:ident), *) => {
+        $(
+            impl $trt for $typ {
+                define_implementations![self;
+                    to_camel_case => String,
+                    is_camel_case => bool,
+                    to_pascal_case => String,
+                    is_pascal_case => bool,
+                    to_screaming_snake_case => String,
+                    is_screaming_snake_case => bool,
+                    to_snake_case => String,
+                    is_snake_case => bool,
+                    to_kebab_case => String,
+                    is_kebab_case => bool,
+                    to_train_case => String,
+                    is_train_case => bool,
+                    to_sentence_case => String,
+                    is_sentence_case => bool,
+                    to_title_case => String,
+                    is_title_case => bool,
+                    to_foreign_key => String,
+                    is_foreign_key => bool,
+                    ordinalize => String,
+                    deordinalize => String
+                ];
+                define_gated_implementations![self;
+                    to_class_case => String,
+                    is_class_case => bool,
+                    to_table_case => String,
+                    is_table_case => bool,
+                    to_plural => String,
+                    to_singular => String,
+                    demodulize => String,
+                    deconstantize => String
+                ];
+            }
+        )*
+    }
+}
+
+macro_rules! implement_number_for {
+    ( $trt:ident; $($typ:ident), *) => {
+        $(
+            impl $trt for $typ {
+                define_number_implementations![self;
+                    ordinalize => String
+                ];
+            }
+        )*
+    }
+}
+
+implement_string_for![
+    Inflector;
+    String, str
+];
+
+implement_number_for![
+    InflectorNumbers;
+    i8, i16, i32, i64, u8, u16, u32, u64, isize, usize, f32, f64
+];
+
+#[cfg(all(feature = "unstable", test))]
+mod benchmarks {
+    extern crate test;
+    use self::test::Bencher;
+    use ::Inflector;
+
+    macro_rules! benchmarks {
+        ( $($test_name:ident => $imp_trait:ident => $to_cast:expr), *) => {
+            $(
+                #[bench]
+                fn $test_name(b: &mut Bencher) {
+                    b.iter(|| {
+                        $to_cast.$imp_trait()
+                    });
+                }
+            )*
+        }
+    }
+
+    benchmarks![
+        benchmark_str_to_camel => to_camel_case => "foo_bar",
+        benchmark_str_is_camel => is_camel_case => "fooBar",
+        benchmark_str_to_screaming_snake => to_screaming_snake_case => "fooBar",
+        benchmark_str_is_screaming_snake => is_screaming_snake_case => "FOO_BAR",
+        benchmark_str_to_snake => to_snake_case => "fooBar",
+        benchmark_str_is_snake => is_snake_case => "foo_bar",
+        benchmark_str_to_kebab => to_kebab_case => "fooBar",
+        benchmark_str_is_kebab => is_kebab_case => "foo-bar",
+        benchmark_str_to_train => to_train_case => "fooBar",
+        benchmark_str_is_train => is_train_case => "Foo-Bar",
+        benchmark_str_to_sentence => to_sentence_case => "fooBar",
+        benchmark_str_is_sentence => is_sentence_case => "Foo bar",
+        benchmark_str_to_title => to_title_case => "fooBar",
+        benchmark_str_is_title => is_title_case => "Foo Bar",
+        benchmark_str_ordinalize  => ordinalize => "1",
+        benchmark_str_deordinalize  => deordinalize => "1st",
+        benchmark_str_to_foreign_key => to_foreign_key => "Foo::Bar",
+        benchmark_str_is_foreign_key => is_foreign_key => "bar_id",
+        benchmark_string_to_camel => to_camel_case => "foo_bar".to_string(),
+        benchmark_string_is_camel => is_camel_case => "fooBar".to_string(),
+        benchmark_string_to_screaming_snake => to_screaming_snake_case => "fooBar".to_string(),
+        benchmark_string_is_screaming_snake => is_screaming_snake_case => "FOO_BAR".to_string(),
+        benchmark_string_to_snake => to_snake_case => "fooBar".to_string(),
+        benchmark_string_is_snake => is_snake_case => "foo_bar".to_string(),
+        benchmark_string_to_kebab => to_kebab_case => "fooBar".to_string(),
+        benchmark_string_is_kebab => is_kebab_case => "foo-bar".to_string(),
+        benchmark_string_to_train => to_train_case => "fooBar".to_string(),
+        benchmark_string_is_train => is_train_case => "Foo-Bar".to_string(),
+        benchmark_string_to_sentence => to_sentence_case => "fooBar".to_string(),
+        benchmark_string_is_sentence => is_sentence_case => "Foo bar".to_string(),
+        benchmark_string_to_title => to_title_case => "fooBar".to_string(),
+        benchmark_string_is_title => is_title_case => "Foo Bar".to_string(),
+        benchmark_string_ordinalize  => ordinalize => "1".to_string(),
+        benchmark_string_deordinalize  => deordinalize => "1st".to_string(),
+        benchmark_string_to_foreign_key => to_foreign_key => "Foo::Bar".to_string(),
+        benchmark_string_is_foreign_key => is_foreign_key => "bar_id".to_string()
+    ];
+
+    #[cfg(feature = "heavyweight")]
+    benchmarks![
+        benchmark_str_to_class => to_class_case => "foo",
+        benchmark_str_is_class => is_class_case => "Foo",
+        benchmark_str_to_table => to_table_case => "fooBar",
+        benchmark_str_is_table => is_table_case => "foo_bars",
+        benchmark_str_pluralize => to_plural => "crate",
+        benchmark_str_singular => to_singular => "crates",
+        benchmark_string_to_class => to_class_case => "foo".to_string(),
+        benchmark_string_is_class => is_class_case => "Foo".to_string(),
+        benchmark_string_to_table => to_table_case => "fooBar".to_string(),
+        benchmark_string_is_table => is_table_case => "foo_bars".to_string(),
+        benchmark_string_pluralize => to_plural => "crate".to_string(),
+        benchmark_string_singular => to_singular => "crates".to_string(),
+        benchmark_string_demodulize => demodulize => "Foo::Bar".to_string(),
+        benchmark_string_deconstantize => deconstantize => "Foo::Bar".to_string(),
+        benchmark_str_demodulize => demodulize => "Foo::Bar",
+        benchmark_str_deconstantize => deconstantize => "Foo::Bar"
+    ];
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/numbers/deordinalize/mod.rs
@@ -0,0 +1,117 @@
+/// Deorginalizes a `&str`
+///
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "0.1";
+///     let expected_string: String = "0.1".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "-1st";
+///     let expected_string: String = "-1".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "0th";
+///     let expected_string: String = "0".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "1st";
+///     let expected_string: String = "1".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "2nd";
+///     let expected_string: String = "2".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "3rd";
+///     let expected_string: String = "3".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "9th";
+///     let expected_string: String = "9".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12th";
+///     let expected_string: String = "12".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12000th";
+///     let expected_string: String = "12000".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12001th";
+///     let expected_string: String = "12001".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12002nd";
+///     let expected_string: String = "12002".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12003rd";
+///     let expected_string: String = "12003".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::deordinalize::deordinalize;
+///     let mock_string: &str = "12004th";
+///     let expected_string: String = "12004".to_owned();
+///     let asserted_string: String = deordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn deordinalize(non_ordinalized_string: &str) -> String {
+    if non_ordinalized_string.contains('.') {
+        non_ordinalized_string.to_owned()
+    } else {
+        non_ordinalized_string.trim_right_matches("st")
+            .trim_right_matches("nd")
+            .trim_right_matches("rd")
+            .trim_right_matches("th")
+            .to_owned()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/numbers/mod.rs
@@ -0,0 +1,9 @@
+#![deny(warnings)]
+/// Provides ordinalization of a string.
+///
+/// Example string "1" becomes "1st"
+pub mod ordinalize;
+/// Provides deordinalization of a string.
+///
+/// Example string "1st" becomes "1"
+pub mod deordinalize;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/numbers/ordinalize/mod.rs
@@ -0,0 +1,147 @@
+/// Orginalizes a `&str`
+///
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "a";
+///     let expected_string: String = "a".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "0.1";
+///     let expected_string: String = "0.1".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "-1";
+///     let expected_string: String = "-1st".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "0";
+///     let expected_string: String = "0th".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "1";
+///     let expected_string: String = "1st".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "2";
+///     let expected_string: String = "2nd".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "3";
+///     let expected_string: String = "3rd".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "9";
+///     let expected_string: String = "9th".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12";
+///     let expected_string: String = "12th".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12000";
+///     let expected_string: String = "12000th".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12001";
+///     let expected_string: String = "12001st".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12002";
+///     let expected_string: String = "12002nd".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12003";
+///     let expected_string: String = "12003rd".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::numbers::ordinalize::ordinalize;
+///     let mock_string: &str = "12004";
+///     let expected_string: String = "12004th".to_owned();
+///     let asserted_string: String = ordinalize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn ordinalize(non_ordinalized_string: &str) -> String {
+    let chars: Vec<char> = non_ordinalized_string.clone().chars().collect();
+    let last_number: char = chars[chars.len() - 1];
+    if is_ordinalizable(last_number) {
+        return non_ordinalized_string.to_owned();
+    }
+    if chars.len() > 1 {
+        if second_last_number_is_one(chars) {
+            return format!("{}{}", non_ordinalized_string, "th");
+        } else if string_contains_decimal(non_ordinalized_string.to_owned()) {
+            return non_ordinalized_string.to_owned();
+        }
+    }
+    match last_number {
+        '1' => format!("{}{}", non_ordinalized_string, "st"),
+        '2' => format!("{}{}", non_ordinalized_string, "nd"),
+        '3' => format!("{}{}", non_ordinalized_string, "rd"),
+        _ => format!("{}{}", non_ordinalized_string, "th"),
+    }
+}
+
+fn is_ordinalizable(last_number: char) -> bool {
+    !last_number.is_numeric()
+}
+
+fn second_last_number_is_one(chars: Vec<char>) -> bool {
+    let second_last_number: char = chars[chars.len() - 2];
+    second_last_number == '1'
+}
+
+fn string_contains_decimal(non_ordinalized_string: String) -> bool {
+    non_ordinalized_string.contains('.')
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/constants/mod.rs
@@ -0,0 +1,225 @@
+pub const UNACCONTABLE_WORDS: [&'static str; 202] = ["accommodation",
+                                                     "adulthood",
+                                                     "advertising",
+                                                     "advice",
+                                                     "aggression",
+                                                     "aid",
+                                                     "air",
+                                                     "aircraft",
+                                                     "alcohol",
+                                                     "anger",
+                                                     "applause",
+                                                     "arithmetic",
+                                                     "assistance",
+                                                     "athletics",
+
+                                                     "bacon",
+                                                     "baggage",
+                                                     "beef",
+                                                     "biology",
+                                                     "blood",
+                                                     "botany",
+                                                     "bread",
+                                                     "butter",
+
+                                                     "carbon",
+                                                     "cardboard",
+                                                     "cash",
+                                                     "chalk",
+                                                     "chaos",
+                                                     "chess",
+                                                     "crossroads",
+                                                     "countryside",
+
+                                                     "dancing",
+                                                     "deer",
+                                                     "dignity",
+                                                     "dirt",
+                                                     "dust",
+
+                                                     "economics",
+                                                     "education",
+                                                     "electricity",
+                                                     "engineering",
+                                                     "enjoyment",
+                                                     "envy",
+                                                     "equipment",
+                                                     "ethics",
+                                                     "evidence",
+                                                     "evolution",
+
+                                                     "fame",
+                                                     "fiction",
+                                                     "flour",
+                                                     "flu",
+                                                     "food",
+                                                     "fuel",
+                                                     "fun",
+                                                     "furniture",
+
+                                                     "gallows",
+                                                     "garbage",
+                                                     "garlic",
+                                                     "genetics",
+                                                     "gold",
+                                                     "golf",
+                                                     "gossip",
+                                                     "grammar",
+                                                     "gratitude",
+                                                     "grief",
+                                                     "guilt",
+                                                     "gymnastics",
+
+                                                     "happiness",
+                                                     "hardware",
+                                                     "harm",
+                                                     "hate",
+                                                     "hatred",
+                                                     "health",
+                                                     "heat",
+                                                     "help",
+                                                     "homework",
+                                                     "honesty",
+                                                     "honey",
+                                                     "hospitality",
+                                                     "housework",
+                                                     "humour",
+                                                     "hunger",
+                                                     "hydrogen",
+
+                                                     "ice",
+                                                     "importance",
+                                                     "inflation",
+                                                     "information",
+                                                     "innocence",
+                                                     "iron",
+                                                     "irony",
+
+                                                     "jam",
+                                                     "jewelry",
+                                                     "judo",
+
+                                                     "karate",
+                                                     "knowledge",
+
+                                                     "lack",
+                                                     "laughter",
+                                                     "lava",
+                                                     "leather",
+                                                     "leisure",
+                                                     "lightning",
+                                                     "linguine",
+                                                     "linguini",
+                                                     "linguistics",
+                                                     "literature",
+                                                     "litter",
+                                                     "livestock",
+                                                     "logic",
+                                                     "loneliness",
+                                                     "luck",
+                                                     "luggage",
+
+                                                     "macaroni",
+                                                     "machinery",
+                                                     "magic",
+                                                     "management",
+                                                     "mankind",
+                                                     "marble",
+                                                     "mathematics",
+                                                     "mayonnaise",
+                                                     "measles",
+                                                     "methane",
+                                                     "milk",
+                                                     "money",
+                                                     "mud",
+                                                     "music",
+                                                     "mumps",
+
+                                                     "nature",
+                                                     "news",
+                                                     "nitrogen",
+                                                     "nonsense",
+                                                     "nurture",
+                                                     "nutrition",
+
+                                                     "obedience",
+                                                     "obesity",
+                                                     "oxygen",
+
+                                                     "pasta",
+                                                     "patience",
+                                                     "physics",
+                                                     "poetry",
+                                                     "pollution",
+                                                     "poverty",
+                                                     "pride",
+                                                     "psychology",
+                                                     "publicity",
+                                                     "punctuation",
+
+                                                     "quartz",
+
+                                                     "racism",
+                                                     "relaxation",
+                                                     "reliability",
+                                                     "research",
+                                                     "respect",
+                                                     "revenge",
+                                                     "rice",
+                                                     "rubbish",
+                                                     "rum",
+
+                                                     "safety",
+                                                     "scenery",
+                                                     "seafood",
+                                                     "seaside",
+                                                     "series",
+                                                     "shame",
+                                                     "sheep",
+                                                     "shopping",
+                                                     "sleep",
+                                                     "smoke",
+                                                     "smoking",
+                                                     "snow",
+                                                     "soap",
+                                                     "software",
+                                                     "soil",
+                                                     "spaghetti",
+                                                     "species",
+                                                     "steam",
+                                                     "stuff",
+                                                     "stupidity",
+                                                     "sunshine",
+                                                     "symmetry",
+
+                                                     "tennis",
+                                                     "thirst",
+                                                     "thunder",
+                                                     "timber",
+                                                     "traffic",
+                                                     "transportation",
+                                                     "trust",
+
+                                                     "underwear",
+                                                     "unemployment",
+                                                     "unity",
+
+                                                     "validity",
+                                                     "veal",
+                                                     "vegetation",
+                                                     "vegetarianism",
+                                                     "vengeance",
+                                                     "violence",
+                                                     "vitality",
+
+                                                     "warmth",
+                                                     "wealth",
+                                                     "weather",
+                                                     "welfare",
+                                                     "wheat",
+                                                     "wildlife",
+                                                     "wisdom",
+                                                     "yoga",
+
+                                                     "zinc",
+                                                     "zoology"];
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/deconstantize/mod.rs
@@ -0,0 +1,50 @@
+#[cfg(feature = "heavyweight")]
+use cases::classcase::to_class_case;
+
+#[cfg(feature = "heavyweight")]
+/// Deconstantizes a `&str`
+///
+/// ```
+///     use inflector::string::deconstantize::deconstantize;
+///     let mock_string: &str = "Bar";
+///     let expected_string: String = "".to_owned();
+///     let asserted_string: String = deconstantize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::deconstantize::deconstantize;
+///     let mock_string: &str = "::Bar";
+///     let expected_string: String = "".to_owned();
+///     let asserted_string: String = deconstantize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::deconstantize::deconstantize;
+///     let mock_string: &str = "Foo::Bar";
+///     let expected_string: String = "Foo".to_owned();
+///     let asserted_string: String = deconstantize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::deconstantize::deconstantize;
+///     let mock_string: &str = "Test::Foo::Bar";
+///     let expected_string: String = "Foo".to_owned();
+///     let asserted_string: String = deconstantize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn deconstantize(non_deconstantized_string: &str) -> String {
+    if non_deconstantized_string.contains("::") {
+        let split_string: Vec<&str> = non_deconstantized_string.split("::").collect();
+        if split_string.len() > 1 {
+            to_class_case(split_string[split_string.len() - 2])
+        } else {
+            "".to_owned()
+        }
+    } else {
+        "".to_owned()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/demodulize/mod.rs
@@ -0,0 +1,46 @@
+#[cfg(feature = "heavyweight")]
+use cases::classcase::to_class_case;
+
+#[cfg(feature = "heavyweight")]
+/// Demodulize a `&str`
+///
+/// ```
+///     use inflector::string::demodulize::demodulize;
+///     let mock_string: &str = "Bar";
+///     let expected_string: String = "Bar".to_owned();
+///     let asserted_string: String = demodulize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::demodulize::demodulize;
+///     let mock_string: &str = "::Bar";
+///     let expected_string: String = "Bar".to_owned();
+///     let asserted_string: String = demodulize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::demodulize::demodulize;
+///     let mock_string: &str = "Foo::Bar";
+///     let expected_string: String = "Bar".to_owned();
+///     let asserted_string: String = demodulize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::demodulize::demodulize;
+///     let mock_string: &str = "Test::Foo::Bar";
+///     let expected_string: String = "Bar".to_owned();
+///     let asserted_string: String = demodulize(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn demodulize(non_demodulize_string: &str) -> String {
+    if non_demodulize_string.contains("::") {
+        let split_string: Vec<&str> = non_demodulize_string.split("::").collect();
+        to_class_case(split_string[split_string.len() - 1])
+    } else {
+        non_demodulize_string.to_owned()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/mod.rs
@@ -0,0 +1,23 @@
+#![deny(warnings)]
+/// Provides demodulize a string.
+///
+/// Example string `Foo::Bar` becomes `Bar`
+#[cfg(feature = "heavyweight")]
+pub mod demodulize;
+/// Provides deconstantizea string.
+///
+/// Example string `Foo::Bar` becomes `Foo`
+#[cfg(feature = "heavyweight")]
+pub mod deconstantize;
+/// Provides conversion to plural strings.
+///
+/// Example string `FooBar` -> `FooBars`
+#[cfg(feature = "heavyweight")]
+pub mod pluralize;
+/// Provides conversion to singular strings.
+///
+/// Example string `FooBars` -> `FooBar`
+#[cfg(feature = "heavyweight")]
+pub mod singularize;
+
+mod constants;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/pluralize/mod.rs
@@ -0,0 +1,194 @@
+#![deny(warnings)]
+use regex::Regex;
+use string::constants::UNACCONTABLE_WORDS;
+
+macro_rules! add_rule{
+    ($r:ident, $rule:expr => $replace:expr) => {
+        $r.push((Regex::new($rule).unwrap(), $replace));
+    }
+}
+
+macro_rules! rules{
+    ($r:ident; $($rule:expr => $replace:expr), *) => {
+        $(
+            add_rule!{$r, $rule => $replace}
+        )*
+    }
+}
+
+
+lazy_static!{
+    static ref RULES: Vec<(Regex, &'static str)> = {
+        let mut r = Vec::with_capacity(24);
+        rules![r;
+               r"(\w*)s$" => "s",
+               r"(\w*([^aeiou]ese))$" => "",
+               r"(\w*(ax|test))is$" => "es",
+               r"(\w*(alias|[^aou]us|tlas|gas|ris))$" => "es",
+               r"(\w*(e[mn]u))s?$" => "s",
+               r"(\w*([^l]ias|[aeiou]las|[emjzr]as|[iu]am))$" => "",
+               r"(\w*(alumn|syllab|octop|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat))(?:us|i)$" => "i",
+               r"(\w*(alumn|alg|vertebr))(?:a|ae)$" => "ae",
+               r"(\w*(seraph|cherub))(?:im)?$" => "im",
+               r"(\w*(her|at|gr))o$" => "oes",
+               r"(\w*(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor))(?:a|um)$" => "a",
+               r"(\w*(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat))(?:a|on)$" => "a",
+               r"(\w*)sis$" => "ses",
+               r"(\w*(kni|wi|li))fe$" => "ves",
+               r"(\w*(ar|l|ea|eo|oa|hoo))f$" => "ves",
+               r"(\w*([^aeiouy]|qu))y$" => "ies",
+               r"(\w*([^ch][ieo][ln]))ey$" => "ies",
+               r"(\w*(x|ch|ss|sh|zz)es)$" => "",
+               r"(\w*(x|ch|ss|sh|zz))$" => "es",
+               r"(\w*(matr|cod|mur|sil|vert|ind|append))(?:ix|ex)$" => "ices",
+               r"(\w*(m|l)(?:ice|ouse))$" => "ice",
+               r"(\w*(pe)(?:rson|ople))$" => "ople",
+               r"(\w*(child))(?:ren)?$" => "ren",
+               r"(\w*eaux)$" => ""
+        ];
+        r
+    };
+}
+
+macro_rules! special_cases{
+    ($s:ident, $($singular: expr => $plural:expr), *) => {
+        match &$s[..] {
+            $(
+                $singular => {
+                    return $plural.to_owned();
+                },
+            )*
+            _ => ()
+        }
+    }
+}
+
+
+/// Converts a `&str` to pluralized `String`
+///
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "foo_bars".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "ox";
+///     let expected_string: String = "oxen".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "crate";
+///     let expected_string: String = "crates".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "boxes";
+///     let expected_string: String = "boxes".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "vengeance";
+///     let expected_string: String = "vengeance".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "yoga";
+///     let expected_string: String = "yoga".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::pluralize::to_plural;
+///     let mock_string: &str = "geometry";
+///     let expected_string: String = "geometries".to_owned();
+///     let asserted_string: String = to_plural(mock_string);
+///     assert_eq!(asserted_string, expected_string);
+///
+/// ```
+///
+pub fn to_plural(non_plural_string: &str) -> String {
+    if UNACCONTABLE_WORDS.contains(&non_plural_string.as_ref()) {
+        non_plural_string.to_owned()
+    } else {
+        special_cases![non_plural_string,
+            "ox" => "oxen",
+            "man" => "men",
+            "woman" => "women",
+            "die" => "dice",
+            "yes" => "yeses",
+            "foot" => "feet",
+            "eave" => "eaves",
+            "goose" => "geese",
+            "tooth" => "teeth",
+            "quiz" => "quizzes"
+        ];
+        for &(ref rule, replace) in RULES.iter().rev() {
+            if let Some(c) = rule.captures(&non_plural_string) {
+                if let Some(c) = c.get(1) {
+                    return format!("{}{}", c.as_str(), replace);
+                }
+            }
+        }
+
+        format!("{}s", non_plural_string)
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+
+    macro_rules! as_item {
+        ($i:item) => { $i };
+    }
+
+    macro_rules! make_tests{
+        ($($singular:ident => $plural:ident); *) =>{
+            $(
+                   as_item! {
+                       #[test]
+                       fn $singular(){
+                           assert_eq!(
+                               stringify!($plural),
+                               super::to_plural(stringify!($singular))
+                               );
+                       }
+                   }
+            )*
+        }
+    }
+
+    #[test]
+    fn boxes() {
+        assert_eq!("boxes", super::to_plural("box"));
+    }
+
+    make_tests!{
+        geometry => geometries;
+        ox => oxen;
+        woman => women;
+        test => tests;
+        axis => axes;
+        knife => knives;
+        agendum => agenda;
+        elf => elves;
+        zoology => zoology
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/string/singularize/mod.rs
@@ -0,0 +1,189 @@
+use regex::Regex;
+use string::constants::UNACCONTABLE_WORDS;
+
+macro_rules! special_cases{
+    ($s:ident, $($singular: expr => $plural:expr), *) => {
+        match &$s[..] {
+            $(
+                $singular => {
+                    return $plural.to_owned();
+                },
+            )*
+            _ => ()
+        }
+    }
+}
+
+
+/// Converts a `&str` to singularized `String`
+///
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "foo_bars";
+///     let expected_string: String = "foo_bar".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "oxen";
+///     let expected_string: String = "ox".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "crates";
+///     let expected_string: String = "crate".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "oxen";
+///     let expected_string: String = "ox".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "boxes";
+///     let expected_string: String = "box".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "vengeance";
+///     let expected_string: String = "vengeance".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::string::singularize::to_singular;
+///     let mock_string: &str = "yoga";
+///     let expected_string: String = "yoga".to_owned();
+///     let asserted_string: String = to_singular(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+///
+pub fn to_singular(non_singular_string: &str) -> String {
+    if UNACCONTABLE_WORDS.contains(&non_singular_string.as_ref()) {
+        non_singular_string.to_owned()
+    } else {
+        special_cases![non_singular_string,
+            "oxen" => "ox",
+            "boxes" => "box",
+            "men" => "man",
+            "women" => "woman",
+            "dice" => "die",
+            "yeses" => "yes",
+            "feet" => "foot",
+            "eaves" => "eave",
+            "geese" => "goose",
+            "teeth" => "tooth",
+            "quizzes" => "quiz"
+        ];
+        for &(ref rule, replace) in RULES.iter().rev() {
+            if let Some(captures) = rule.captures(&non_singular_string) {
+                if let Some(c) = captures.get(1) {
+                    let mut buf = String::new();
+                    captures.expand(&format!("{}{}", c.as_str(), replace), &mut buf);
+                    return buf;
+                }
+            }
+        }
+
+        format!("{}", non_singular_string)
+    }
+}
+
+macro_rules! add_rule{
+    ($r:ident, $rule:expr => $replace:expr) => {
+        $r.push((Regex::new($rule).unwrap(), $replace));
+    }
+}
+
+macro_rules! rules{
+    ($r:ident; $($rule:expr => $replace:expr), *) => {
+        $(
+            add_rule!{$r, $rule => $replace}
+        )*
+    }
+}
+
+
+lazy_static!{
+    static ref RULES: Vec<(Regex, &'static str)> = {
+    let mut r = Vec::with_capacity(27);
+    rules![r;
+     r"(\w*)s$" => "",
+     r"(\w*)(ss)$" => "$2",
+     r"(n)ews$" => "ews",
+     r"(\w*)(o)es$" => "",
+     r"(\w*)([ti])a$" => "um",
+     r"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$" => "sis",
+     r"(^analy)(sis|ses)$" => "sis",
+     r"(\w*)([^f])ves$" => "fe",
+     r"(\w*)(hive)s$" => "",
+     r"(\w*)(tive)s$" => "",
+     r"(\w*)([lr])ves$" => "f",
+     r"(\w*([^aeiouy]|qu))ies$" => "y",
+     r"(s)eries$" => "eries",
+     r"(m)ovies$" => "ovie",
+     r"(\w*)(x|ch|ss|sh)es$" => "$2",
+     r"(m|l)ice$" => "ouse",
+     r"(bus)(es)?$" => "",
+     r"(shoe)s$" => "",
+     r"(cris|test)(is|es)$" => "is",
+     r"^(a)x[ie]s$" => "xis",
+     r"(octop|vir)(us|i)$" => "us",
+     r"(alias|status)(es)?$" => "",
+     r"^(ox)en" => "",
+     r"(vert|ind)ices$" => "ex",
+     r"(matr)ices$" => "ix",
+     r"(quiz)zes$" => "",
+     r"(database)s$" => ""
+         ];
+     r
+    };
+}
+
+#[test]
+fn singularize_ies_suffix() {
+    assert_eq!("reply", to_singular("replies"));
+    assert_eq!("lady", to_singular("ladies"));
+    assert_eq!("soliloquy", to_singular("soliloquies"));
+}
+
+#[test]
+fn singularize_ss_suffix() {
+    assert_eq!("glass", to_singular("glass"));
+    assert_eq!("access", to_singular("access"));
+    assert_eq!("glass", to_singular("glasses"));
+    assert_eq!("witch", to_singular("witches"));
+    assert_eq!("dish", to_singular("dishes"));
+}
+
+#[test]
+fn singularize_string_if_a_regex_will_match() {
+    let expected_string: String = "ox".to_owned();
+    let asserted_string: String = to_singular("oxen");
+    assert!(expected_string == asserted_string);
+
+}
+
+#[test]
+fn singularize_string_returns_none_option_if_no_match() {
+    let expected_string: String = "bacon".to_owned();
+    let asserted_string: String = to_singular("bacon");
+
+    assert!(expected_string == asserted_string);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/suffix/foreignkey/mod.rs
@@ -0,0 +1,139 @@
+use cases::snakecase::to_snake_case;
+
+/// Converts a `&str` to a `foreign_key`
+///
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "foo_bar";
+///     let expected_string: String = "foo_bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "Foo bar";
+///     let expected_string: String = "foo_bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "Foo Bar";
+///     let expected_string: String = "foo_bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "Foo::Bar";
+///     let expected_string: String = "bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "Test::Foo::Bar";
+///     let expected_string: String = "bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "FooBar";
+///     let expected_string: String = "foo_bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "fooBar";
+///     let expected_string: String = "foo_bar_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::to_foreign_key;
+///     let mock_string: &str = "fooBar3";
+///     let expected_string: String = "foo_bar_3_id".to_owned();
+///     let asserted_string: String = to_foreign_key(mock_string);
+///     assert!(asserted_string == expected_string);
+///
+/// ```
+pub fn to_foreign_key(non_foreign_key_string: &str) -> String {
+    if non_foreign_key_string.contains("::") {
+        let split_string: Vec<&str> = non_foreign_key_string.split("::").collect();
+        safe_convert(split_string[split_string.len() - 1])
+    } else {
+        safe_convert(non_foreign_key_string)
+    }
+}
+fn safe_convert(safe_string: &str) -> String {
+    let snake_cased: String = to_snake_case(safe_string);
+    if snake_cased.ends_with("_id") {
+        snake_cased
+    } else {
+        format!("{}{}", snake_cased, "_id")
+    }
+}
+
+/// Determines if a `&str` is a `foreign_key`
+///
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "Foo bar string that is really really long";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "foo-bar-string-that-is-really-really-long";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "FooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "Foo Bar Is A Really Really Long String";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "fooBarIsAReallyReallyLongString";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == false);
+///
+/// ```
+/// ```
+///     use inflector::suffix::foreignkey::is_foreign_key;
+///     let mock_string: &str = "foo_bar_string_that_is_really_really_long_id";
+///     let asserted_bool: bool = is_foreign_key(mock_string);
+///     assert!(asserted_bool == true);
+///
+/// ```
+pub fn is_foreign_key(test_string: &str) -> bool {
+    to_foreign_key(test_string.clone()) == test_string
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/src/suffix/mod.rs
@@ -0,0 +1,5 @@
+#![deny(warnings)]
+/// Provides foreign key conversion for String.
+///
+/// Example string `foo` becomes `foo_id`
+pub mod foreignkey;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/Inflector/tests/lib.rs
@@ -0,0 +1,162 @@
+#![deny(warnings)]
+extern crate inflector;
+
+use inflector::Inflector;
+use inflector::InflectorNumbers;
+
+macro_rules! str_tests {
+    ( $($test_name:ident => $imp_trait:ident => $to_cast:expr => $casted:expr), *) => {
+        $(
+            #[test]
+            fn $test_name() {
+                assert_eq!($to_cast.$imp_trait(), $casted)
+            }
+        )*
+    }
+}
+
+macro_rules! string_tests {
+    ( $($test_name:ident => $imp_trait:ident => $to_cast:expr => $casted:expr), *) => {
+        $(
+            #[test]
+            fn $test_name() {
+                assert_eq!($to_cast.to_string().$imp_trait(), $casted)
+            }
+        )*
+    }
+}
+
+macro_rules! number_tests {
+    ( $($test_name:ident => $imp_trait:ident => $typ:ident => $to_cast:expr => $casted:expr), *) => {
+        $(
+            #[test]
+            fn $test_name() {
+                let to_cast: $typ = $to_cast;
+                assert_eq!(to_cast.$imp_trait(), $casted)
+            }
+        )*
+    }
+}
+
+macro_rules! gated_str_tests {
+    ( $($test_name:ident => $imp_trait:ident => $to_cast:expr => $casted:expr), *) => {
+        $(
+            #[test]
+            #[cfg(feature = "heavyweight")]
+            fn $test_name() {
+                assert_eq!($to_cast.$imp_trait(), $casted)
+            }
+        )*
+    }
+}
+
+macro_rules! gated_string_tests {
+    ( $($test_name:ident => $imp_trait:ident => $to_cast:expr => $casted:expr), *) => {
+        $(
+            #[test]
+            #[cfg(feature = "heavyweight")]
+            fn $test_name() {
+                assert_eq!($to_cast.to_string().$imp_trait(), $casted)
+            }
+        )*
+    }
+}
+
+str_tests![
+    str_to_camel => to_camel_case => "foo_bar" => "fooBar".to_string(),
+    str_is_camel => is_camel_case => "fooBar" => true,
+    str_is_not_camel => is_camel_case => "foo_bar" => false,
+    str_to_screaming_snake => to_screaming_snake_case => "fooBar" => "FOO_BAR".to_string(),
+    str_is_screaming_snake => is_screaming_snake_case => "FOO_BAR" => true,
+    str_is_not_screaming_snake => is_screaming_snake_case => "foo_bar" => false,
+    str_to_snake => to_snake_case => "fooBar" => "foo_bar".to_string(),
+    str_is_snake => is_snake_case => "foo_bar" => true,
+    str_is_not_snake => is_snake_case => "fooBar" => false,
+    str_to_kebab => to_kebab_case => "fooBar" => "foo-bar".to_string(),
+    str_is_kebab => is_kebab_case => "foo-bar" => true,
+    str_is_not_kebab => is_kebab_case => "fooBar" => false,
+    str_to_train => to_train_case => "fooBar" => "Foo-Bar".to_string(),
+    str_is_train => is_train_case => "Foo-Bar" => true,
+    str_is_not_train => is_train_case => "FOO-Bar" => false,
+    str_to_sentence => to_sentence_case => "fooBar" => "Foo bar".to_string(),
+    str_is_sentence => is_sentence_case => "Foo bar" => true,
+    str_is_not_sentence => is_sentence_case => "foo_bar" => false,
+    str_to_title => to_title_case => "fooBar" => "Foo Bar".to_string(),
+    str_is_title => is_title_case => "Foo Bar" => true,
+    str_is_not_title => is_title_case => "Foo_Bar" => false,
+    str_ordinalize  => ordinalize => "1" => "1st".to_string(),
+    str_deordinalize  => deordinalize => "1st" => "1".to_string(),
+    str_to_foreign_key => to_foreign_key => "Foo::Bar" => "bar_id".to_string(),
+    str_is_foreign_key => is_foreign_key => "bar_id" => true,
+    str_is_not_foreign_key => is_foreign_key => "bar" => false
+];
+
+gated_str_tests![
+    str_to_class_case => to_class_case => "foo" => "Foo".to_string(),
+    str_is_class_case => is_class_case => "Foo" => true,
+    str_is_not_class_case => is_class_case => "foo" => false,
+    str_to_table => to_table_case => "fooBar" => "foo_bars".to_string(),
+    str_is_table => is_table_case => "foo_bars" => true,
+    str_is_not_table => is_table_case => "fooBars" => false,
+    str_pluralize => to_plural => "crate" => "crates".to_string(),
+    str_singular => to_singular => "crates" => "crate".to_string(),
+    str_demodulize => demodulize => "Foo::Bar" => "Bar".to_string(),
+    str_deconstantize => deconstantize => "Foo::Bar" => "Foo".to_string()
+];
+
+string_tests![
+    string_to_camel => to_camel_case => "foo_bar".to_string() => "fooBar".to_string(),
+    string_is_camel => is_camel_case => "fooBar".to_string() => true,
+    string_is_not_camel => is_camel_case => "foo_bar".to_string() => false,
+    string_to_screaming_snake => to_screaming_snake_case => "fooBar".to_string() => "FOO_BAR".to_string(),
+    string_is_screaming_snake => is_screaming_snake_case => "FOO_BAR".to_string() => true,
+    string_is_not_screaming_snake => is_screaming_snake_case => "foo_bar".to_string() => false,
+    string_to_snake => to_snake_case => "fooBar".to_string() => "foo_bar".to_string(),
+    string_is_snake => is_snake_case => "foo_bar".to_string() => true,
+    string_is_not_snake => is_snake_case => "fooBar".to_string() => false,
+    string_to_kebab => to_kebab_case => "fooBar".to_string() => "foo-bar".to_string(),
+    string_is_kebab => is_kebab_case => "foo-bar".to_string() => true,
+    string_is_not_kebab => is_kebab_case => "fooBar".to_string() => false,
+    string_to_train => to_train_case => "fooBar".to_string() => "Foo-Bar".to_string(),
+    string_is_train => is_train_case => "Foo-Bar".to_string() => true,
+    string_is_not_train => is_train_case => "foo-Bar".to_string() => false,
+    string_to_sentence => to_sentence_case => "fooBar".to_string() => "Foo bar".to_string(),
+    string_is_sentence => is_sentence_case => "Foo bar".to_string() => true,
+    string_is_not_sentence => is_sentence_case => "fooBar".to_string() => false,
+    string_to_title => to_title_case => "fooBar".to_string() => "Foo Bar".to_string(),
+    string_is_title => is_title_case => "Foo Bar".to_string() => true,
+    string_is_not_title => is_title_case => "fooBar".to_string() => false,
+    string_ordinalize  => ordinalize => "1".to_string() => "1st".to_string(),
+    string_deordinalize  => deordinalize => "1st".to_string() => "1".to_string(),
+    string_to_foreign_key => to_foreign_key => "Foo::Bar".to_string() => "bar_id".to_string(),
+    string_is_foreign_key => is_foreign_key => "bar_id".to_string() => true,
+    string_is_not_foreign_key => is_foreign_key => "bar".to_string() => false
+];
+
+gated_string_tests![
+    string_to_class_case => to_class_case => "foo".to_string() => "Foo".to_string(),
+    string_is_class_case => is_class_case => "Foo".to_string() => true,
+    string_is_not_class_case => is_class_case => "ooBar".to_string() => false,
+    string_to_table => to_table_case => "fooBar".to_string() => "foo_bars".to_string(),
+    string_is_table => is_table_case => "foo_bars".to_string() => true,
+    string_is_not_table => is_table_case => "fooBar".to_string() => false,
+    string_pluralize => to_plural => "crate".to_string() => "crates".to_string(),
+    string_singular => to_singular => "crates".to_string() => "crate".to_string(),
+    string_demodulize => demodulize => "Foo::Bar".to_string() => "Bar".to_string(),
+    string_deconstantize => deconstantize => "Foo::Bar".to_string() => "Foo".to_string()
+];
+
+number_tests![
+    i8_ordinalize   => ordinalize => i8  => 1 => "1st".to_string(),
+    i16_ordinalize  => ordinalize => i16 => 1 => "1st".to_string(),
+    i32_ordinalize  => ordinalize => i32 => 1 => "1st".to_string(),
+    i64_ordinalize  => ordinalize => i64 => 1 => "1st".to_string(),
+    u8_ordinalize   => ordinalize => u8  => 1 => "1st".to_string(),
+    u16_ordinalize  => ordinalize => u16 => 1 => "1st".to_string(),
+    u32_ordinalize  => ordinalize => u32 => 1 => "1st".to_string(),
+    u64_ordinalize  => ordinalize => u64 => 1 => "1st".to_string(),
+    isize_ordinalize  => ordinalize => isize => 1 => "1st".to_string(),
+    usize_ordinalize  => ordinalize => usize => 1 => "1st".to_string(),
+    f32_ordinalize  => ordinalize => f32 => 1.0 => "1st".to_string(),
+    f64_ordinalize  => ordinalize => f64 => 1.0 => "1st".to_string()
+];
new file mode 100755
--- /dev/null
+++ b/third_party/rust/Inflector/travis-after-success.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+
+if [ "$TRAVIS_RUST_VERSION" == "stable" ]; then
+  wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz && \
+  tar xzf master.tar.gz &&\
+  cd kcov-master && \
+  mkdir build && \
+  cd build && \
+  cmake .. && \
+  make && \
+  sudo make install && \
+  cd ../.. && \
+  rm -rf kcov-master && \
+  for file in target/debug/inflector-*; do mkdir -p "target/cov/$(basename $file)"; kcov --exclude-pattern=/.cargo,/usr/lib --verify "target/cov/$(basename $file)" "$file"; done && \
+  bash <(curl -s https://codecov.io/bash) && \
+  echo "Uploaded code coverage"
+fi
+if [ "${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}" != "master" ] && [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then
+    REMOTE_URL="$(git config --get remote.origin.url)";
+    # Clone the repository fresh..for some reason checking out master fails
+    # from a normal PR build's provided directory
+    cd ${TRAVIS_BUILD_DIR}/.. && \
+    git clone ${REMOTE_URL} "${TRAVIS_REPO_SLUG}-bench" && \
+    cd  "${TRAVIS_REPO_SLUG}-bench" && \
+    # Bench master
+    git checkout master && \
+    cargo bench --features=unstable > benches-control && \
+    # Bench variable
+    git checkout ${TRAVIS_COMMIT} && \
+    cargo bench --features=unstable > benches-variable && \
+    cargo install cargo-benchcmp --force && \
+    export PATH=/home/travis/.cargo/bin:$PATH && \
+    cargo benchcmp benches-control benches-variable --threshold 7 --variance;
+fi
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"dbb4e9109fa74df727ab69e2fec04655817f29f13f3014e84da8052039764b73","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"73cb5f952615bc21d11487cd7e0cf091967cc71d2e7d6cb93f96b36d47b250ed","README.md":"936b7dcfa140c626ec81541090208d000c8e6c05f2ef4bd5ba9dc1befe06d80f","src/lib.rs":"85a4f14672537e5dcf1a2e070436fa91c364ecd39581616a48cddb9735b64133","src/row.rs":"6ce3e1a99cb6ccdb1d525b03ce12e6265979d12a8dcc4aa9860215ca8e3d5cb4","src/style.rs":"3ae1b7e308532362c3a93d6f8113882f36cfd9c773486a6e99651514a6cb44d9","src/test.rs":"154421667bec09882e7d59c504ffd35309b92be650baa694dc79eb54d4c68c78"},"package":"b385d69402821a1c254533a011a312531cbcc0e3e24f19bbb4747a5a2daf37e2"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "ascii-canvas"
+version = "1.0.0"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
+description = "simple canvas for drawing lines and styled text and emitting to the terminal"
+repository = "https://github.com/nikomatsakis/ascii-canvas"
+license = "Apache-2.0/MIT"
+
+[dependencies]
+term = "0.4.5"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015 The LALRPOP Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/README.md
@@ -0,0 +1,4 @@
+ASCII canvas is a simple library that allows you to draw lines and
+colored text and then write them to the terminal. It uses the `term`
+library to handle the ANSI nonsense and hence it works on Windows,
+Mac, and Unix.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/src/lib.rs
@@ -0,0 +1,372 @@
+//! An "ASCII Canvas" allows us to draw lines and write text into a
+//! fixed-sized canvas and then convert that canvas into ASCII
+//! characters. ANSI styling is supported.
+
+extern crate term;
+
+use std::cmp;
+use std::ops::Range;
+use std::iter::ExactSizeIterator;
+use style::Style;
+use term::Terminal;
+
+mod row;
+#[cfg(test)] mod test;
+
+pub mod style;
+
+pub use self::row::Row;
+
+///////////////////////////////////////////////////////////////////////////
+
+/// AsciiView is a view onto an `AsciiCanvas` which potentially
+/// applies transformations along the way (e.g., shifting, adding
+/// styling information). Most of the main drawing methods for
+/// `AsciiCanvas` are defined as inherent methods on an `AsciiView`
+/// trait object.
+pub trait AsciiView {
+    fn columns(&self) -> usize;
+    fn read_char(&mut self, row: usize, column: usize) -> char;
+    fn write_char(&mut self, row: usize, column: usize, ch: char, style: Style);
+}
+
+impl<'a> AsciiView+'a {
+    fn add_box_dirs(&mut self,
+                    row: usize,
+                    column: usize,
+                    dirs: u8)
+    {
+        let old_ch = self.read_char(row, column);
+        let new_ch = add_dirs(old_ch, dirs);
+        self.write_char(row, column, new_ch, Style::new());
+    }
+
+    /// Draws a line for the given range of rows at the given column.
+    pub fn draw_vertical_line(&mut self,
+                              rows: Range<usize>,
+                              column: usize)
+    {
+        let len = rows.len();
+        for (index, r) in rows.enumerate() {
+            let new_dirs = if index == 0 {
+                DOWN
+            } else if index == len - 1 {
+                UP
+            } else {
+                UP | DOWN
+            };
+            self.add_box_dirs(r, column, new_dirs);
+        }
+    }
+
+    /// Draws a horizontal line along a given row for the given range
+    /// of columns.
+    pub fn draw_horizontal_line(&mut self,
+                                row: usize,
+                                columns: Range<usize>)
+    {
+        let len = columns.len();
+        for (index, c) in columns.enumerate() {
+            let new_dirs = if index == 0 {
+                RIGHT
+            } else if index == len - 1 {
+                LEFT
+            } else {
+                LEFT | RIGHT
+            };
+            self.add_box_dirs(row, c, new_dirs);
+        }
+    }
+
+    /// Writes characters in the given style at the given position.
+    pub fn write_chars<I>(&mut self,
+                          row: usize,
+                          column: usize,
+                          chars: I,
+                          style: Style)
+        where I: Iterator<Item=char>
+    {
+        for (i, ch) in chars.enumerate() {
+            self.write_char(row, column + i, ch, style);
+        }
+    }
+
+    /// Creates a new view onto the same canvas, but writing at an offset.
+    pub fn shift<'c>(&'c mut self, row: usize, column: usize) -> ShiftedView<'c> {
+        ShiftedView::new(self, row, column)
+    }
+
+    /// Creates a new view onto the same canvas, but applying a style
+    /// to all the characters written.
+    pub fn styled<'c>(&'c mut self, style: Style) -> StyleView<'c> {
+        StyleView::new(self, style)
+    }
+}
+
+pub struct AsciiCanvas {
+    columns: usize,
+    rows: usize,
+    characters: Vec<char>,
+    styles: Vec<Style>,
+}
+
+/// To use an `AsciiCanvas`, first create the canvas, then draw any
+/// lines, then write text labels. It is required to draw the lines
+/// first so that we can detect intersecting lines properly (we could
+/// track which characters belong to lines, I suppose).
+impl AsciiCanvas {
+    /// Create a canvas of the given size. We will automatically add
+    /// rows as needed, but the columns are fixed at creation.
+    pub fn new(rows: usize, columns: usize) -> Self {
+        AsciiCanvas {
+            rows: rows,
+            columns: columns,
+            characters: vec![' '; columns * rows],
+            styles: vec![Style::new(); columns * rows],
+        }
+    }
+
+    fn grow_rows_if_needed(&mut self, new_rows: usize) {
+        if new_rows >= self.rows {
+            let new_chars = (new_rows - self.rows) * self.columns;
+            self.characters.extend((0..new_chars).map(|_| ' '));
+            self.styles.extend((0..new_chars).map(|_| Style::new()));
+            self.rows = new_rows;
+        }
+    }
+
+    fn index(&mut self, r: usize, c: usize) -> usize {
+        self.grow_rows_if_needed(r + 1);
+        self.in_range_index(r, c)
+    }
+
+    fn in_range_index(&self, r: usize, c: usize) -> usize {
+        assert!(r < self.rows);
+        assert!(c <= self.columns);
+        r * self.columns + c
+    }
+
+    fn start_index(&self, r: usize) -> usize {
+        self.in_range_index(r, 0)
+    }
+
+    fn end_index(&self, r: usize) -> usize {
+        self.in_range_index(r, self.columns)
+    }
+
+    pub fn write_to<T:Terminal+?Sized>(&self, term: &mut T) -> term::Result<()> {
+        for row in self.to_strings() {
+            try!(row.write_to(term));
+            try!(writeln!(term, ""));
+        }
+        Ok(())
+    }
+
+    pub fn to_strings(&self) -> Vec<Row> {
+        (0..self.rows)
+            .map(|row| {
+                let start = self.start_index(row);
+                let end = self.end_index(row);
+                let chars = &self.characters[start..end];
+                let styles = &self.styles[start..end];
+                Row::new(chars, styles)
+            })
+            .collect()
+    }
+}
+
+impl AsciiView for AsciiCanvas {
+    fn columns(&self) -> usize {
+        self.columns
+    }
+
+    fn read_char(&mut self, row: usize, column: usize) -> char {
+        assert!(column < self.columns);
+        let index = self.index(row, column);
+        self.characters[index]
+    }
+
+    fn write_char(&mut self,
+                  row: usize,
+                  column: usize,
+                  ch: char,
+                  style: Style)
+    {
+        assert!(column < self.columns);
+        let index = self.index(row, column);
+        self.characters[index] = ch;
+        self.styles[index] = style;
+    }
+}
+
+#[derive(Copy, Clone)]
+struct Point {
+    row: usize,
+    column: usize,
+}
+
+/// Gives a view onto an AsciiCanvas that has a fixed upper-left
+/// point. You can get one of these by calling the `shift()` method on
+/// any ASCII view.
+///
+/// Shifted views also track the extent of the characters which are
+/// written through them; the `close()` method can be used to read
+/// that out when you are finished.
+pub struct ShiftedView<'canvas> {
+    // either the base canvas or another view
+    base: &'canvas mut AsciiView,
+
+    // fixed at creation: the content is always allowed to grow down,
+    // but cannot grow right more than `num_columns`
+    upper_left: Point,
+
+    // this is updated to track content that is emitted
+    lower_right: Point,
+}
+
+impl<'canvas> ShiftedView<'canvas> {
+    fn new(base: &'canvas mut AsciiView,
+           row: usize,
+           column: usize)
+           -> Self {
+        let upper_left = Point { row: row, column: column };
+        ShiftedView {
+            base: base,
+            upper_left: upper_left,
+            lower_right: upper_left,
+        }
+    }
+
+    /// Finalize the view; returns the (maximal row, maximal column)
+    /// that was written (in the coordinates of the parent view, not
+    /// the shifted view). Note that these values are the actual last
+    /// places that were written, so if you wrote to that precise
+    /// location, you would overwrite some of the content that was
+    /// written.
+    pub fn close(self) -> (usize, usize) {
+        (self.lower_right.row, self.lower_right.column)
+    }
+
+    fn track_max(&mut self, row: usize, column: usize) {
+        self.lower_right.row = cmp::max(self.lower_right.row, row);
+        self.lower_right.column = cmp::max(self.lower_right.column, column);
+    }
+}
+
+impl<'canvas> AsciiView for ShiftedView<'canvas> {
+    fn columns(&self) -> usize {
+        self.base.columns() - self.upper_left.column
+    }
+
+    fn read_char(&mut self, row: usize, column: usize) -> char {
+        let row = self.upper_left.row + row;
+        let column = self.upper_left.column + column;
+        self.base.read_char(row, column)
+    }
+
+    fn write_char(&mut self,
+                  row: usize,
+                  column: usize,
+                  ch: char,
+                  style: Style)
+    {
+        let row = self.upper_left.row + row;
+        let column = self.upper_left.column + column;
+        self.track_max(row, column);
+        self.base.write_char(row, column, ch, style)
+    }
+}
+
+/// Gives a view onto an AsciiCanvas that applies an additional style
+/// to things that are written. You can get one of these by calling
+/// the `styled()` method on any ASCII view.
+pub struct StyleView<'canvas> {
+    base: &'canvas mut AsciiView,
+    style: Style,
+}
+
+impl<'canvas> StyleView<'canvas> {
+    fn new(base: &'canvas mut AsciiView, style: Style) -> Self {
+        StyleView {
+            base: base,
+            style: style,
+        }
+    }
+}
+
+impl<'canvas> AsciiView for StyleView<'canvas> {
+    fn columns(&self) -> usize {
+        self.base.columns()
+    }
+
+    fn read_char(&mut self, row: usize, column: usize) -> char {
+        self.base.read_char(row, column)
+    }
+
+    fn write_char(&mut self,
+                  row: usize,
+                  column: usize,
+                  ch: char,
+                  style: Style)
+    {
+        self.base.write_char(row, column, ch, style.with(self.style))
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Unicode box-drawing characters
+
+const UP: u8 = 0b0001;
+const DOWN: u8 = 0b0010;
+const LEFT: u8 = 0b0100;
+const RIGHT: u8 = 0b1000;
+
+const BOX_CHARS: &'static [(char, u8)] = &[
+    ('╵', UP),
+    ('│', UP | DOWN),
+    ('┤', UP | DOWN | LEFT),
+    ('├', UP | DOWN | RIGHT),
+    ('┼', UP | DOWN | LEFT | RIGHT),
+    ('┘', UP | LEFT),
+    ('└', UP | RIGHT),
+    ('┴', UP | LEFT | RIGHT),
+
+    // No UP:
+    ('╷', DOWN),
+    ('┐', DOWN | LEFT),
+    ('┌', DOWN | RIGHT),
+    ('┬', DOWN | LEFT | RIGHT),
+
+    // No UP|DOWN:
+    ('╶', LEFT),
+    ('─', LEFT | RIGHT),
+
+    // No LEFT:
+    ('╴', RIGHT),
+
+    // No RIGHT:
+    (' ', 0),
+];
+
+fn box_char_for_dirs(dirs: u8) -> char {
+    for &(c, d) in BOX_CHARS {
+        if dirs == d {
+            return c;
+        }
+    }
+    panic!("no box character for dirs: {:b}", dirs);
+}
+
+fn dirs_for_box_char(ch: char) -> Option<u8> {
+    for &(c, d) in BOX_CHARS {
+        if c == ch {
+            return Some(d);
+        }
+    }
+    None
+}
+
+fn add_dirs(old_ch: char, new_dirs: u8) -> char {
+    let old_dirs = dirs_for_box_char(old_ch).unwrap_or(0);
+    box_char_for_dirs(old_dirs | new_dirs)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/src/row.rs
@@ -0,0 +1,46 @@
+use std::fmt::{Debug, Display, Formatter, Error};
+use style::{Style, StyleCursor};
+use term::{self, Terminal};
+
+pub struct Row {
+    text: String,
+    styles: Vec<Style>
+}
+
+impl Row {
+    pub fn new(chars: &[char], styles: &[Style]) -> Row {
+        assert_eq!(chars.len(), styles.len());
+        Row {
+            text: chars.iter().cloned().collect(),
+            styles: styles.to_vec()
+        }
+    }
+
+    pub fn write_to<T:Terminal+?Sized>(&self, term: &mut T) -> term::Result<()> {
+        let mut cursor = try!(StyleCursor::new(term));
+        for (character, &style) in self.text.trim_right().chars()
+                                                         .zip(&self.styles)
+        {
+            try!(cursor.set_style(style));
+            try!(write!(cursor.term(), "{}", character));
+        }
+        Ok(())
+    }
+}
+
+// Using display/debug just skips the styling.
+
+impl Display for Row {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self.text.trim_right(), fmt)
+    }
+}
+
+impl Debug for Row {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        // NB: use Display, not Debug, just throw some quotes around it
+        try!(write!(fmt, "\""));
+        try!(Display::fmt(self.text.trim_right(), fmt));
+        write!(fmt, "\"")
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/src/style.rs
@@ -0,0 +1,203 @@
+//! The `Style` type is a simplified view of the various
+//! attributes offered by the `term` library. These are
+//! enumerated as bits so they can be easily or'd together
+//! etc.
+
+use std::default::Default;
+use term::{self, Terminal};
+
+#[derive(Copy, Clone, Default, PartialEq, Eq)]
+pub struct Style {
+    bits: u64
+}
+
+macro_rules! declare_styles {
+    ($($style:ident,)*) => {
+        #[derive(Copy, Clone)]
+        #[allow(non_camel_case_types)]
+        enum StyleBit {
+            $($style,)*
+        }
+
+        $(
+            pub const $style: Style = Style { bits: 1 << (StyleBit::$style as u64) };
+        )*
+    }
+}
+
+pub const DEFAULT: Style = Style { bits: 0 };
+
+declare_styles! {
+    // Foreground colors:
+    FG_BLACK,
+    FG_BLUE,
+    FG_BRIGHT_BLACK,
+    FG_BRIGHT_BLUE,
+    FG_BRIGHT_CYAN,
+    FG_BRIGHT_GREEN,
+    FG_BRIGHT_MAGENTA,
+    FG_BRIGHT_RED,
+    FG_BRIGHT_WHITE,
+    FG_BRIGHT_YELLOW,
+    FG_CYAN,
+    FG_GREEN,
+    FG_MAGENTA,
+    FG_RED,
+    FG_WHITE,
+    FG_YELLOW,
+
+    // Background colors:
+    BG_BLACK,
+    BG_BLUE,
+    BG_BRIGHT_BLACK,
+    BG_BRIGHT_BLUE,
+    BG_BRIGHT_CYAN,
+    BG_BRIGHT_GREEN,
+    BG_BRIGHT_MAGENTA,
+    BG_BRIGHT_RED,
+    BG_BRIGHT_WHITE,
+    BG_BRIGHT_YELLOW,
+    BG_CYAN,
+    BG_GREEN,
+    BG_MAGENTA,
+    BG_RED,
+    BG_WHITE,
+    BG_YELLOW,
+
+    // Other:
+    BOLD,
+    DIM,
+    ITALIC,
+    UNDERLINE,
+    BLINK,
+    STANDOUT,
+    REVERSE,
+    SECURE,
+}
+
+impl Style {
+    pub fn new() -> Style {
+        Style::default()
+    }
+
+    pub fn with(self, other_style: Style) -> Style {
+        Style { bits: self.bits | other_style.bits }
+    }
+
+    pub fn contains(self, other_style: Style) -> bool {
+        self.with(other_style) == self
+    }
+
+    /// Attempts to apply the given style to the given terminal. If
+    /// the style is not supported, either there is no effect or else
+    /// a similar, substitute style may be applied.
+    pub fn apply<T: Terminal + ?Sized>(self, term: &mut T) -> term::Result<()> {
+        try!(term.reset());
+
+        macro_rules! fg_color {
+            ($color:expr, $term_color:ident) => {
+                if self.contains($color) {
+                    if term.supports_color() {
+                        try!(term.fg(term::color::$term_color));
+                    }
+                }
+            }
+        }
+
+        fg_color!(FG_BLACK, BLACK);
+        fg_color!(FG_BLUE, BLUE);
+        fg_color!(FG_BRIGHT_BLACK, BRIGHT_BLACK);
+        fg_color!(FG_BRIGHT_BLUE, BRIGHT_BLUE);
+        fg_color!(FG_BRIGHT_CYAN, BRIGHT_CYAN);
+        fg_color!(FG_BRIGHT_GREEN, BRIGHT_GREEN);
+        fg_color!(FG_BRIGHT_MAGENTA, BRIGHT_MAGENTA);
+        fg_color!(FG_BRIGHT_RED, BRIGHT_RED);
+        fg_color!(FG_BRIGHT_WHITE, BRIGHT_WHITE);
+        fg_color!(FG_BRIGHT_YELLOW, BRIGHT_YELLOW);
+        fg_color!(FG_CYAN, CYAN);
+        fg_color!(FG_GREEN, GREEN);
+        fg_color!(FG_MAGENTA, MAGENTA);
+        fg_color!(FG_RED, RED);
+        fg_color!(FG_WHITE, WHITE);
+        fg_color!(FG_YELLOW, YELLOW);
+
+        macro_rules! bg_color {
+            ($color:expr, $term_color:ident) => {
+                if self.contains($color) {
+                    if term.supports_color() {
+                        try!(term.bg(term::color::$term_color));
+                    }
+                }
+            }
+        }
+
+        bg_color!(BG_BLACK, BLACK);
+        bg_color!(BG_BLUE, BLUE);
+        bg_color!(BG_BRIGHT_BLACK, BRIGHT_BLACK);
+        bg_color!(BG_BRIGHT_BLUE, BRIGHT_BLUE);
+        bg_color!(BG_BRIGHT_CYAN, BRIGHT_CYAN);
+        bg_color!(BG_BRIGHT_GREEN, BRIGHT_GREEN);
+        bg_color!(BG_BRIGHT_MAGENTA, BRIGHT_MAGENTA);
+        bg_color!(BG_BRIGHT_RED, BRIGHT_RED);
+        bg_color!(BG_BRIGHT_WHITE, BRIGHT_WHITE);
+        bg_color!(BG_BRIGHT_YELLOW, BRIGHT_YELLOW);
+        bg_color!(BG_CYAN, CYAN);
+        bg_color!(BG_GREEN, GREEN);
+        bg_color!(BG_MAGENTA, MAGENTA);
+        bg_color!(BG_RED, RED);
+        bg_color!(BG_WHITE, WHITE);
+        bg_color!(BG_YELLOW, YELLOW);
+
+        macro_rules! attr {
+            ($attr:expr, $term_attr:expr) => {
+                if self.contains($attr) {
+                    let attr = $term_attr;
+                    if term.supports_attr(attr) {
+                        try!(term.attr(attr));
+                    }
+                }
+            }
+        }
+
+        attr!(BOLD, term::Attr::Bold);
+        attr!(DIM, term::Attr::Dim);
+        attr!(ITALIC, term::Attr::Italic(true));
+        attr!(UNDERLINE, term::Attr::Underline(true));
+        attr!(BLINK, term::Attr::Blink);
+        attr!(STANDOUT, term::Attr::Standout(true));
+        attr!(REVERSE, term::Attr::Reverse);
+        attr!(SECURE, term::Attr::Secure);
+
+        Ok(())
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct StyleCursor<'term, T: ?Sized + Terminal + 'term> {
+    current_style: Style,
+    term: &'term mut T,
+}
+
+impl<'term, T: ?Sized + Terminal> StyleCursor<'term, T> {
+    pub fn new(term: &'term mut T) -> term::Result<StyleCursor<'term, T>> {
+        let current_style = Style::default();
+        try!(current_style.apply(term));
+        Ok(StyleCursor {
+            current_style: current_style,
+            term: term
+        })
+    }
+
+    pub fn term(&mut self) -> &mut T {
+        self.term
+    }
+
+    pub fn set_style(&mut self, style: Style) -> term::Result<()> {
+        if style != self.current_style {
+            try!(style.apply(self.term));
+            self.current_style = style;
+        }
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ascii-canvas/src/test.rs
@@ -0,0 +1,77 @@
+use style::Style;
+use test_util::expect_debug;
+
+use super::{AsciiCanvas, AsciiView};
+
+#[test]
+fn draw_box() {
+    let mut canvas = AsciiCanvas::new(5, 10);
+    {
+        let view: &mut AsciiView = &mut canvas;
+        view.draw_vertical_line(2..5, 2);
+        view.draw_vertical_line(2..5, 7);
+        view.draw_horizontal_line(2, 2..8);
+        view.draw_horizontal_line(4, 2..8);
+    }
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "",
+    "",
+    "  ┌────┐",
+    "  │    │",
+    "  └────┘"
+]
+"#.trim());
+}
+
+#[test]
+fn grow_box() {
+    let mut canvas = AsciiCanvas::new(0, 10);
+    {
+        let view: &mut AsciiView = &mut canvas;
+        view.draw_vertical_line(2..5, 2);
+        view.draw_vertical_line(2..5, 7);
+        view.draw_horizontal_line(2, 2..8);
+        view.draw_horizontal_line(4, 2..8);
+    }
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "",
+    "",
+    "  ┌────┐",
+    "  │    │",
+    "  └────┘"
+]
+"#.trim());
+}
+
+#[test]
+fn shift() {
+    let mut canvas = AsciiCanvas::new(0, 10);
+    {
+        let canvas: &mut AsciiView = &mut canvas;
+        let view: &mut AsciiView = &mut canvas.shift(1, 2);
+        view.draw_vertical_line(2..5, 2);
+        view.draw_vertical_line(2..5, 7);
+        view.draw_horizontal_line(2, 2..8);
+        view.draw_horizontal_line(4, 2..8);
+        view.write_chars(3, 3, "Hi!".chars(), Style::new());
+    }
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "",
+    "",
+    "",
+    "    ┌────┐",
+    "    │Hi! │",
+    "    └────┘"
+]
+"#.trim());
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"71e232ec96a9f11083a6ac2e3de7d3482032a4a9ed02c0e1be30b46da47cacef","CHANGELOG.md":"6c8e98f58fc7c4c3b7039027ff521a070b511f2882eb9985e32f118aff4ee4c0","Cargo.toml":"c87fbd92db7e1f7ace5b082a4168161e21e5ac76320ad44e01b7e3ea88aeee6e","LICENSE":"643adba34cf48432ba1bac872fdd5686d129c64e06246399bacf20142820620b","README.md":"3768d87584c808a133df7547996900d7574801f2021b6e6bc8c94cd0040b3cf8","appveyor.yml":"ab80c6004eeccda11d3e10284c7cd1bc8ecc87765204dfbf9c1dc4eb3843b86a","src/lib.rs":"16610a89cc5b9f0682a08507b4aea6b1e50ed6e78bc9a63acb6317e23a84477b"},"package":"d0fd4c0631f06448cc45a6bbb3b710ebb7ff8ccb96a0800c994afe23a70d5df2"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/.travis.yml
@@ -0,0 +1,43 @@
+sudo: false
+language: rust
+matrix:
+  fast_finish: true
+  include:
+    - rust: nightly
+    - rust: beta
+    - rust: stable
+os:
+ - linux
+ - osx
+script:
+  - cargo build
+  - cargo test
+cache:
+  apt: true
+  directories:
+  - target/debug/deps
+  - target/debug/build
+addons:
+  apt:
+    packages:
+    - libcurl4-openssl-dev
+    - libelf-dev
+    - libdw-dev
+    - binutils-dev # required for `kcov --verify`
+    - libbfd-dev # required for `kcov --verify`
+after_success: |
+  [ $TRAVIS_RUST_VERSION = stable ] &&
+  wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
+  tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. &&
+  ls target/debug &&
+  ./kcov-master/tmp/usr/local/bin/kcov --verify --coveralls-id=$TRAVIS_JOB_ID --exclude-pattern=/.cargo target/kcov target/debug/atty-* &&
+  [ $TRAVIS_BRANCH = master ] &&
+  [ $TRAVIS_PULL_REQUEST = false ] &&
+  cargo doc --no-deps &&
+  echo "<meta http-equiv=refresh content=0;url=`echo $TRAVIS_REPO_SLUG | cut -d '/' -f 2`/index.html>" > target/doc/index.html &&
+  sudo pip install --user ghp-import &&
+  /home/travis/.local/bin/ghp-import -n target/doc &&
+  git push -fq https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
+env:
+  global:
+    secure: acjXoBFG4yFklz/iW4q9PLaMmTgug0c8hOov4uiaXYjDkVGhnEePBozGc8ctKuFv2BVlwBSzvE1neE9dHcCS6il0x+G79sVTekfVN5dERja3UpwrC0/QodJuDmErIUpb6zylupPnUGq5pzZabRPNKyAnsFS5wYhLMSLxGPu4pfYdW0Eu8CEPIgPYsI6o2pfKgNpXbeizdHRLMeZCN4cbEPohO1odc+Z6WJvgKn2xEkpAcfhAuaroqGGxRtmDiJZ/JaBijAKY/O9Q3Xq1GSGOPT5lmwJSp3Fxw5dgmeX6LmN0ZODASdnEoYfoqUDUFzkCON3Sk4a7hugxlkZ7cx1tfqXxMg+0BgYIUdGQNloDJnuusWvXPBFdB2jxMsfcbrCjNsrJ8kjN6uBsW9yy0kqN7a8eOJckwh5fYRWfNta0R+BrveNXWmGp4u4aBq/85jEiHi30XKTzaEUbF0Y3cIONweWeWwBOcAvPBhO63Y07TRRe+SSk1NYm7QHGW9RsHhz89OSbaIXqn+r/o+6DZcw5XaO73DtZ62Kx48NErej9kVqcIJ6HnyvCJ/fJoT7h1ixSRI/WmS30l2S/q33Q2G4C/IZ4ZZRD/1thSltAxeA6OAUnr8ITZyW47CqOmyL1IUptrdAb9OLEedYV/QrOhcg2RJLXyP66xnItOwMp014bEp4=
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/CHANGELOG.md
@@ -0,0 +1,12 @@
+# 0.1.2
+
+* windows support (with automated testing)
+* automated code coverage
+
+# 0.1.1
+
+* bumped libc dep from `0.1` to `0.2`
+
+# 0.1.0
+
+* initial release
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "atty"
+version = "0.1.2"
+authors = ["softprops <d.tangren@gmail.com>"]
+description = "A simple interface for querying atty"
+documentation = "http://softprops.github.io/atty"
+homepage = "https://github.com/softprops/atty"
+repository = "https://github.com/softprops/atty"
+keywords = ["terminal", "tty"]
+license = "MIT"
+
+[dependencies]
+libc = "0.2"
+winapi = "0.2"
+kernel32-sys = "0.2"
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2015 Doug Tangren
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/README.md
@@ -0,0 +1,20 @@
+# atty
+
+[![Build Status](https://travis-ci.org/softprops/atty.svg?branch=master)](https://travis-ci.org/softprops/atty) [![Build status](https://ci.appveyor.com/api/projects/status/geggrsnsjsuse8cv?svg=true)](https://ci.appveyor.com/project/softprops/atty) [![Coverage Status](https://coveralls.io/repos/softprops/atty/badge.svg?branch=master&service=github)](https://coveralls.io/github/softprops/atty?branch=master)
+
+> are you or are you not a tty?
+
+## docs
+
+Find them [here](http://softprops.github.io/atty)
+
+## install
+
+Add the following to your `Cargo.toml`
+
+```toml
+[dependencies]
+atty = "0.1"
+```
+
+Doug Tangren (softprops) 2015
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/appveyor.yml
@@ -0,0 +1,19 @@
+environment:
+  matrix:
+  - TARGET: nightly-x86_64-pc-windows-msvc
+    VCVARS: "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\vcvars64.bat"
+  - TARGET: nightly-i686-pc-windows-msvc
+    VCVARS: "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\vcvars32.bat"
+  - TARGET: nightly-x86_64-pc-windows-gnu
+  - TARGET: nightly-i686-pc-windows-gnu
+  - TARGET: 1.2.0-x86_64-pc-windows-gnu
+install:
+  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-${env:TARGET}.exe" -FileName "rust-install.exe"
+  - ps: .\rust-install.exe /VERYSILENT /NORESTART /DIR="C:\rust" | Out-Null
+  - ps: $env:PATH="$env:PATH;C:\rust\bin"
+  - call "%VCVARS%" || ver>nul
+  - rustc -vV
+  - cargo -vV
+build: false
+test_script:
+  - cargo test --verbose
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/atty-0.1.2/src/lib.rs
@@ -0,0 +1,62 @@
+//! atty is a simple utility that answers one question
+//! > is this a tty?
+//!
+//! usage is just as simple
+//!
+//! ```
+//! if atty::is() {
+//!   println!("i'm a tty")
+//! }
+//! ```
+//!
+//! ```
+//! if atty::isnt() {
+//!   println!("i'm not a tty")
+//! }
+//! ```
+
+extern crate libc;
+
+/// returns true if this is a tty
+#[cfg(unix)]
+pub fn is() -> bool {
+    let r = unsafe { libc::isatty(libc::STDOUT_FILENO) };
+    r != 0
+}
+
+/// returns true if this is a tty
+#[cfg(windows)]
+pub fn is() -> bool {
+    extern crate kernel32;
+    extern crate winapi;
+    use std::ptr;
+    let handle: winapi::HANDLE = unsafe {
+        kernel32::CreateFileA(b"CONOUT$\0".as_ptr() as *const i8,
+                              winapi::GENERIC_READ | winapi::GENERIC_WRITE,
+                              winapi::FILE_SHARE_WRITE,
+                              ptr::null_mut(),
+                              winapi::OPEN_EXISTING,
+                              0,
+                              ptr::null_mut())
+    };
+    if handle == winapi::INVALID_HANDLE_VALUE {
+        return false;
+    }
+    let mut out = 0;
+    unsafe { kernel32::GetConsoleMode(handle, &mut out) != 0 }
+}
+
+/// returns true if this is _not_ a tty
+pub fn isnt() -> bool {
+    !is()
+}
+
+#[cfg(test)]
+mod tests {
+    use super::is;
+
+    #[test]
+    fn is_test() {
+        assert!(is())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"9e018f77dc9cd8ba5c268eedd0fe34a3b6a5b68a660a9adf223d9227d2db853e","README.md":"17e5ed3a3bd9b898e73c3056711daabe1238fe9682d24d255f8263fae4eb783d","examples/generate_spidermonkey.rs":"e65aeec6bc288bba720c51e5af1f9034245b019bd637b265982d1c156e04dde4","src/export.rs":"1ee8b16339d34519ecae745ce22f5ee970a1fdfa3b4326e94876bbac25e2b918","src/import.rs":"3c1d2faf80636ff55913b300f0bfcda650ed71e4ee7ab7d9acf31ebf388b436a","src/lib.rs":"d4ea18ec850054a817c6b91ed52412a2f2f39639628e5918dee688d829d3ed4b","src/spec.rs":"15a22ecea4dc3473e34c6cfe121e95edb1a83cfa5e264245e10d19f68456ac72","src/util.rs":"f38a09cee2260912a849968d89dc76f6d01abcd41fbc01138001b86579a5b408"},"package":"9fcfc86eecb125147e907529a5f1ac7978f6f26d20a52b82a7e053da5faefbc3"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/Cargo.toml
@@ -0,0 +1,45 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "binjs_meta"
+version = "0.3.6"
+authors = ["David Teller <D.O.Teller@gmail.com>"]
+description = "Part of binjs-ref. Tools for manipulating grammars. You probably do not want to use this crate directly unless you're writing an encoder, decoder or parser generator for binjs."
+homepage = "https://binast.github.io/ecmascript-binary-ast/"
+readme = "README.md"
+keywords = ["javascript", "js", "binjs", "ast"]
+categories = ["compression", "parsing", "web-programming"]
+license = "MIT"
+repository = "https://github.com/binast/binjs-ref"
+[dependencies.Inflector]
+version = "^0.11"
+
+[dependencies.itertools]
+version = "^0.6"
+
+[dependencies.log]
+version = "^0.4"
+
+[dependencies.webidl]
+version = "^0.6"
+[dev-dependencies.clap]
+version = "^2"
+
+[dev-dependencies.env_logger]
+version = "^0.5"
+
+[dev-dependencies.yaml-rust]
+version = "^0.4"
+[badges.travis-ci]
+branch = "master"
+repository = "https://github.com/binast/binjs-ref"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/README.md
@@ -0,0 +1,7 @@
+# About
+
+This crate contains the tools used to manipulate the abstract syntax of JavaScript,
+i.e. generate parsers, encoders, etc from a specification of ASTs of the language.
+
+Actual tools to manipulate ASTs for a specific version of JavaScript are
+in dependent crates.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/examples/generate_spidermonkey.rs
@@ -0,0 +1,1293 @@
+extern crate binjs_meta;
+extern crate clap;
+extern crate env_logger;
+extern crate itertools;
+#[macro_use] extern crate log;
+extern crate webidl;
+extern crate yaml_rust;
+
+use binjs_meta::export::{ TypeDeanonymizer, TypeName };
+use binjs_meta::import::Importer;
+use binjs_meta::spec::*;
+use binjs_meta::util::*;
+
+use std::collections::{ HashMap, HashSet };
+use std::fs::*;
+use std::io::*;
+
+use clap::*;
+
+use itertools::Itertools;
+
+#[derive(Clone, Default)]
+pub struct FieldParsingRules {
+    pub declare: Option<String>,
+    /// Replace the declaration and assignation.
+    pub replace: Option<String>,
+    pub before_field: Option<String>,
+    pub after_field: Option<String>,
+    pub block_before_field: Option<String>,
+    pub block_after_field: Option<String>,
+}
+#[derive(Clone, Default)]
+pub struct NodeParsingRules {
+    /// This node inherits from another node.
+    pub inherits: Option<NodeName>,
+
+    /// Override the result type for the method.
+    pub type_ok: Option<String>,
+
+    pub start: Option<String>,
+
+    /// Append to a list. Used only for lists.
+    pub append: Option<String>,
+
+    /// Custom per-field treatment. Used only for interfaces.
+    pub by_field: HashMap<FieldName, FieldParsingRules>,
+    pub build_result: Option<String>,
+}
+impl GenerationRules {
+    fn get(&self, name: &NodeName) -> NodeParsingRules {
+        let mut rules = self.per_node.get(name)
+            .cloned()
+            .unwrap_or_default();
+        let inherits = rules.inherits.clone();
+        if let Some(ref parent) = inherits {
+            let NodeParsingRules {
+                inherits,
+                type_ok,
+                start,
+                append,
+                by_field,
+                build_result,
+            } = self.get(parent);
+            if rules.inherits.is_none() {
+                rules.inherits = inherits;
+            }
+            if rules.type_ok.is_none() {
+                rules.type_ok = type_ok;
+            }
+            if rules.start.is_none() {
+                rules.start = start;
+            }
+            if rules.append.is_none() {
+                rules.append = append;
+            }
+            if rules.build_result.is_none() {
+                rules.build_result = build_result;
+            }
+            for (key, value) in by_field {
+                rules.by_field.entry(key)
+                    .or_insert(value);
+            }
+        }
+        rules
+    }
+}
+#[derive(Default)]
+pub struct GenerationRules {
+    cpp_header: Option<String>,
+    cpp_footer: Option<String>,
+    hpp_class_header: Option<String>,
+    hpp_tokens_header: Option<String>,
+    hpp_tokens_footer: Option<String>,
+    hpp_tokens_kind_doc: Option<String>,
+    hpp_tokens_field_doc: Option<String>,
+    hpp_tokens_variant_doc: Option<String>,
+    per_node: HashMap<NodeName, NodeParsingRules>,
+}
+
+struct ToWebidl;
+impl ToWebidl {
+    pub fn spec(spec: &TypeSpec, prefix: &str, indent: &str) -> String {
+        match *spec {
+            TypeSpec::Array { ref contents, supports_empty: false } =>
+                format!("[NonEmpty] FrozenArray<{}>", Self::type_(&*contents, prefix, indent)),
+            TypeSpec::Array { ref contents, supports_empty: true } =>
+                format!("FrozenArray<{}>", Self::type_(&*contents, prefix, indent)),
+            TypeSpec::Offset =>
+                "offset".to_string(),
+            TypeSpec::Boolean =>
+                "bool".to_string(),
+            TypeSpec::String =>
+                "string".to_string(),
+            TypeSpec::Number =>
+                "number".to_string(),
+            TypeSpec::NamedType(ref name) =>
+                name.to_str().to_string(),
+            TypeSpec::TypeSum(ref sum) => {
+                format!("({})", sum.types()
+                    .iter()
+                    .map(|x| Self::spec(x, "", indent))
+                    .format(" or "))
+            }
+            TypeSpec::Void => "void".to_string()
+        }
+    }
+
+    pub fn type_(type_: &Type, prefix: &str, indent: &str) -> String {
+        let pretty_type = Self::spec(type_.spec(), prefix, indent);
+        format!("{}{}", pretty_type, if type_.is_optional() { "?" } else { "" })
+    }
+
+    pub fn interface(interface: &Interface, prefix: &str, indent: &str) -> String {
+        let mut result = format!("{prefix} interface {name} : Node {{\n", prefix=prefix, name=interface.name().to_str());
+        {
+            let prefix = format!("{prefix}{indent}",
+                prefix=prefix,
+                indent=indent);
+            for field in interface.contents().fields() {
+                if let Some(ref doc) = field.doc() {
+                    result.push_str(&format!("{prefix}// {doc}\n", prefix = prefix, doc = doc));
+                }
+                result.push_str(&format!("{prefix}{description} {name};\n",
+                    prefix = prefix,
+                    name = field.name().to_str(),
+                    description = Self::type_(field.type_(), &prefix, indent)
+                ));
+                if field.doc().is_some() {
+                    result.push_str("\n");
+                }
+            }
+        }
+        result.push_str(&format!("{prefix} }}\n", prefix=prefix));
+        result
+    }
+}
+pub struct CPPExporter {
+    syntax: Spec,
+    rules: GenerationRules,
+    list_parsers_to_generate: Vec<(NodeName, (/* supports_empty */ bool, NodeName))>,
+    option_parsers_to_generate: Vec<(NodeName, NodeName)>,
+
+    /// A mapping from string enum symbol (e.g. "delete")
+    /// to its name in BinVariant (e.g. "UnaryOperatorDelete").
+    variants_by_symbol: HashMap<String, String>,
+}
+
+impl CPPExporter {
+    pub fn new(deanonymizer: TypeDeanonymizer, options: SpecOptions) -> Self {
+        let syntax = deanonymizer.into_spec(options);
+
+        let mut list_parsers_to_generate = vec![];
+        let mut option_parsers_to_generate = vec![];
+        for (parser_node_name, typedef) in syntax.typedefs_by_name() {
+            if typedef.is_optional() {
+                let content_name = TypeName::type_spec(typedef.spec()); // FIXME: Wait, do we have an implementation of type names in two places?
+                let content_node_name = syntax.get_node_name(&content_name)
+                    .unwrap_or_else(|| panic!("While generating an option parser, could not find node name {}", content_name))
+                    .clone();
+                debug!(target: "generate_spidermonkey", "CPPExporter::new adding optional typedef {:?} => {:?} => {:?}",
+                    parser_node_name,
+                    content_name,
+                    content_node_name);
+                option_parsers_to_generate.push((parser_node_name.clone(), content_node_name));
+            } else if let TypeSpec::Array { ref contents, ref supports_empty } = *typedef.spec() {
+                let content_name = TypeName::type_(&**contents); // FIXME: Wait, do we have an implementation of type names in two places?
+                let content_node_name = syntax.get_node_name(&content_name)
+                    .unwrap_or_else(|| panic!("While generating an array parser, could not find node name {}", content_name))
+                    .clone();
+                list_parsers_to_generate.push((parser_node_name.clone(), (*supports_empty, content_node_name)));
+            }
+        }
+        list_parsers_to_generate.sort_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+        option_parsers_to_generate.sort_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+
+        // Prepare variant_by_symbol, which will let us lookup the BinVariant name of
+        // a symbol. Since some symbols can appear in several enums (e.g. "+"
+        // is both a unary and a binary operator), we need to collect all the
+        // string enums that contain each symbol and come up with a unique name.
+        let mut enum_by_string : HashMap<String, Vec<std::rc::Rc<String>>> = HashMap::new();
+        for (name, enum_) in syntax.string_enums_by_name().iter() {
+            let name = std::rc::Rc::new(name.to_string().clone());
+            for string in enum_.strings().iter() {
+                let vec = enum_by_string.entry(string.clone())
+                    .or_insert_with(|| vec![]);
+                vec.push(name.clone());
+            }
+        }
+        let variants_by_symbol = enum_by_string.drain()
+            .map(|(string, names)| {
+                let expanded = format!("{names}{symbol}",
+                    names = names.iter().format("Or"),
+                    symbol = string.to_cpp_enum_case());
+                (string, expanded)
+            })
+            .collect();
+
+        CPPExporter {
+            syntax,
+            rules: GenerationRules::default(),
+            list_parsers_to_generate,
+            option_parsers_to_generate,
+            variants_by_symbol,
+        }
+    }
+
+    fn set_export_rules(&mut self, rules: GenerationRules) {
+        self.rules = rules;
+    }
+}
+
+// ----- Generating the header
+impl CPPExporter {
+    fn get_type_ok(&self, name: &NodeName, default: &str) -> String {
+        let rules_for_this_interface = self.rules.get(name);
+        // If the override is provided, use it.
+        if let Some(ref type_ok) = rules_for_this_interface.type_ok {
+            return type_ok.to_string()
+        }
+        default.to_string()
+    }
+
+    fn get_method_signature(&self, name: &NodeName, default_type_ok: &str, prefix: &str, args: &str) -> String {
+        let type_ok = self.get_type_ok(name, default_type_ok);
+        let kind = name.to_class_cases();
+        format!("    JS::Result<{type_ok}> parse{prefix}{kind}({args});",
+            prefix = prefix,
+            type_ok = type_ok,
+            kind = kind,
+            args = args,
+        )
+    }
+
+    fn get_method_definition_start(&self, name: &NodeName, default_type_ok: &str, prefix: &str, args: &str) -> String {
+        let type_ok = self.get_type_ok(name, default_type_ok);
+        let kind = name.to_class_cases();
+        format!("template<typename Tok> JS::Result<{type_ok}>\nBinASTParser<Tok>::parse{prefix}{kind}({args})",
+            prefix = prefix,
+            type_ok = type_ok,
+            kind = kind,
+            args = args,
+        )
+    }
+
+
+    /// Declaring enums for kinds and fields.
+    fn export_declare_kinds_and_fields_enums(&self, buffer: &mut String) {
+        buffer.push_str(&self.rules.hpp_tokens_header.reindent(""));
+
+        buffer.push_str("\n\n");
+        if self.rules.hpp_tokens_kind_doc.is_some() {
+            buffer.push_str(&self.rules.hpp_tokens_kind_doc.reindent(""));
+        }
+
+        let node_names = self.syntax.node_names()
+            .keys()
+            .sorted();
+        buffer.push_str(&format!("\n#define FOR_EACH_BIN_KIND(F) \\\n{nodes}",
+            nodes = node_names.iter()
+                .map(|name| format!("    F({name}, {name})",
+                    name = name))
+                .format(" \\\n")));
+        buffer.push_str("
+
+
+enum class BinKind {
+#define EMIT_ENUM(name, _) name,
+    FOR_EACH_BIN_KIND(EMIT_ENUM)
+#undef EMIT_ENUM
+};
+");
+
+        buffer.push_str(&format!("\n// The number of distinct values of BinKind.\nconst size_t BINKIND_LIMIT = {};\n", self.syntax.node_names().len()));
+        buffer.push_str("\n\n");
+        if self.rules.hpp_tokens_field_doc.is_some() {
+            buffer.push_str(&self.rules.hpp_tokens_field_doc.reindent(""));
+        }
+
+        let field_names = self.syntax.field_names()
+            .keys()
+            .sorted();
+        buffer.push_str(&format!("\n#define FOR_EACH_BIN_FIELD(F) \\\n{nodes}",
+            nodes = field_names.iter()
+                .map(|name| format!("    F({enum_name}, {spec_name})",
+                    spec_name = name,
+                    enum_name = name.to_cpp_enum_case()))
+                .format(" \\\n")));
+        buffer.push_str("
+
+
+enum class BinField {
+#define EMIT_ENUM(name, _) name,
+    FOR_EACH_BIN_FIELD(EMIT_ENUM)
+#undef EMIT_ENUM
+};
+");
+        buffer.push_str(&format!("\n// The number of distinct values of BinField.\nconst size_t BINFIELD_LIMIT = {};\n", self.syntax.field_names().len()));
+
+        if self.rules.hpp_tokens_variant_doc.is_some() {
+            buffer.push_str(&self.rules.hpp_tokens_variant_doc.reindent(""));
+        }
+
+        let mut enum_variants = self.variants_by_symbol
+            .iter()
+            .sorted_by(|&(ref symbol_1, ref name_1), &(ref symbol_2, ref name_2)| {
+                Ord::cmp(name_1, name_2)
+                    .then_with(|| Ord::cmp(symbol_1, symbol_2))
+            });
+
+        buffer.push_str(&format!("\n#define FOR_EACH_BIN_VARIANT(F) \\\n{nodes}",
+            nodes = enum_variants.drain(..)
+                .map(|(symbol, name)| format!("    F({variant_name}, \"{spec_name}\")",
+                    spec_name = symbol,
+                    variant_name = name))
+                .format(" \\\n")));
+        buffer.push_str("
+
+
+enum class BinVariant {
+#define EMIT_ENUM(name, _) name,
+    FOR_EACH_BIN_VARIANT(EMIT_ENUM)
+#undef EMIT_ENUM
+};
+");
+        buffer.push_str(&format!("\n// The number of distinct values of BinVariant.\nconst size_t BINVARIANT_LIMIT = {};\n", enum_variants.len()));
+
+        buffer.push_str(&self.rules.hpp_tokens_footer.reindent(""));
+        buffer.push_str("\n");
+    }
+
+    /// Declare string enums
+    fn export_declare_string_enums_classes(&self, buffer: &mut String) {
+        buffer.push_str("\n\n// ----- Declaring string enums (by lexicographical order)\n");
+        let string_enums_by_name = self.syntax.string_enums_by_name()
+            .iter()
+            .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+        for (name, enum_) in string_enums_by_name {
+            let rendered_cases = enum_.strings()
+                .iter()
+                .map(|str| format!("{case:<20}      /* \"{original}\" */",
+                    case = str.to_cpp_enum_case(),
+                    original = str))
+                .format(",\n    ");
+            let rendered = format!("enum class {name} {{\n    {cases}\n}};\n\n",
+                cases = rendered_cases,
+                name = name.to_class_cases());
+            buffer.push_str(&rendered);
+        }
+    }
+
+    fn export_declare_sums_of_interface_methods(&self, buffer: &mut String) {
+        let sums_of_interfaces = self.syntax.resolved_sums_of_interfaces_by_name()
+            .iter()
+            .sorted_by(|a, b| a.0.cmp(&b.0));
+        buffer.push_str("\n\n// ----- Sums of interfaces (by lexicographical order)\n");
+        buffer.push_str("// Implementations are autogenerated\n");
+        buffer.push_str("// `ParseNode*` may never be nullptr\n");
+        for &(ref name, _) in &sums_of_interfaces {
+            let rendered = self.get_method_signature(name, "ParseNode*", "", "");
+            buffer.push_str(&rendered.reindent(""));
+            buffer.push_str("\n");
+        }
+        for (name, _) in sums_of_interfaces {
+            let rendered = self.get_method_signature(name, "ParseNode*", "Sum", "const size_t start, const BinKind kind, const BinFields& fields");
+            buffer.push_str(&rendered.reindent(""));
+            buffer.push_str("\n");
+        }
+    }
+
+    fn export_declare_single_interface_methods(&self, buffer: &mut String) {
+        buffer.push_str("\n\n// ----- Interfaces (by lexicographical order)\n");
+        buffer.push_str("// Implementations are autogenerated\n");
+        buffer.push_str("// `ParseNode*` may never be nullptr\n");
+        let interfaces_by_name = self.syntax.interfaces_by_name()
+            .iter()
+            .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+
+        let mut outer_parsers = Vec::with_capacity(interfaces_by_name.len());
+        let mut inner_parsers = Vec::with_capacity(interfaces_by_name.len());
+
+        for &(name, _) in &interfaces_by_name {
+            let outer = self.get_method_signature(name, "ParseNode*", "", "");
+            let inner = self.get_method_signature(name, "ParseNode*", "Interface", "const size_t start, const BinKind kind, const BinFields& fields");
+            outer_parsers.push(outer.reindent(""));
+            inner_parsers.push(inner.reindent(""));
+        }
+
+        for parser in outer_parsers.drain(..) {
+            buffer.push_str(&parser);
+            buffer.push_str("\n");
+        }
+
+        for parser in inner_parsers.drain(..) {
+            buffer.push_str(&parser);
+            buffer.push_str("\n");
+        }
+    }
+
+    fn export_declare_string_enums_methods(&self, buffer: &mut String) {
+        buffer.push_str("\n\n// ----- String enums (by lexicographical order)\n");
+        buffer.push_str("// Implementations are autogenerated\n");
+        let string_enums_by_name = self.syntax.string_enums_by_name()
+            .iter()
+            .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+        for (kind, _) in string_enums_by_name {
+            let type_ok = format!("typename BinASTParser<Tok>::{kind}", kind = kind.to_class_cases());
+            let rendered = self.get_method_signature(kind, &type_ok, "", "");
+            buffer.push_str(&rendered.reindent(""));
+            buffer.push_str("\n");
+        }
+    }
+
+    fn export_declare_list_methods(&self, buffer: &mut String) {
+        buffer.push_str("\n\n// ----- Lists (by lexicographical order)\n");
+        buffer.push_str("// Implementations are autogenerated\n");
+        for &(ref kind, _) in &self.list_parsers_to_generate {
+            let rendered = self.get_method_signature(kind, "ParseNode*", "", "");
+            buffer.push_str(&rendered.reindent(""));
+            buffer.push_str("\n");
+        }
+    }
+
+    fn export_declare_option_methods(&self, buffer: &mut String) {
+        buffer.push_str("\n\n// ----- Default values (by lexicographical order)\n");
+        buffer.push_str("// Implementations are autogenerated\n");
+        for &(ref kind, _) in &self.option_parsers_to_generate {
+            let rendered = self.get_method_signature(kind, "ParseNode*", "", "");
+            buffer.push_str(&rendered.reindent(""));
+            buffer.push_str("\n");
+        }
+    }
+
+    fn generate_autogenerated_warning(&self) -> String {
+        let warning = format!("// This file was autogenerated by binjs_generate_spidermonkey,
+// please DO NOT EDIT BY HAND.
+");
+        warning
+    }
+
+    /// Generate C++ headers for SpiderMonkey
+    pub fn to_spidermonkey_token_hpp(&self) -> String {
+        let mut buffer = String::new();
+
+        buffer.push_str(&self.generate_autogenerated_warning());
+
+        self.export_declare_kinds_and_fields_enums(&mut buffer);
+
+        buffer.push_str("\n");
+        buffer
+    }
+    pub fn to_spidermonkey_class_hpp(&self) -> String {
+        let mut buffer = String::new();
+
+        buffer.push_str(&self.generate_autogenerated_warning());
+
+        buffer.push_str(&self.rules.hpp_class_header.reindent(""));
+        buffer.push_str("\n");
+
+        self.export_declare_string_enums_classes(&mut buffer);
+        self.export_declare_sums_of_interface_methods(&mut buffer);
+        self.export_declare_single_interface_methods(&mut buffer);
+        self.export_declare_string_enums_methods(&mut buffer);
+        self.export_declare_list_methods(&mut buffer);
+        self.export_declare_option_methods(&mut buffer);
+
+        buffer.push_str("\n");
+        buffer
+    }
+}
+
+impl CPPExporter {
+    /// Generate implementation of a single typesum.
+    fn generate_implement_sum(&self, buffer: &mut String, name: &NodeName, nodes: &HashSet<NodeName>) {
+        // Generate comments (FIXME: We should use the actual webidl, not the resolved sum)
+        let nodes = nodes.iter()
+            .sorted();
+        let kind = name.to_class_cases();
+        let rendered_bnf = format!("/*\n{name} ::= {nodes}\n*/",
+            nodes = nodes.iter()
+                .format("\n    "),
+            name = name.to_str());
+
+        // Generate outer method
+        buffer.push_str(&format!("{bnf}
+{first_line}
+{{
+    BinKind kind;
+    BinFields fields((cx_));
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSum{kind}(start, kind, fields));
+
+    MOZ_TRY(guard.done());
+    return result;
+}}\n",
+                bnf = rendered_bnf,
+                kind = kind,
+                first_line = self.get_method_definition_start(name, "ParseNode*", "", "")
+        ));
+
+        // Generate inner method
+        let mut buffer_cases = String::new();
+        for node in nodes {
+            buffer_cases.push_str(&format!("
+      case BinKind::{kind}:
+        MOZ_TRY_VAR(result, parseInterface{kind}(start, kind, fields));
+        break;",
+                kind = node.to_class_cases()));
+            }
+            buffer.push_str(&format!("\n{first_line}
+{{
+    {type_ok} result;
+    switch(kind) {{{cases}
+      default:
+        return raiseInvalidKind(\"{kind}\", kind);
+    }}
+    return result;
+}}
+
+",
+        kind = kind,
+        cases = buffer_cases,
+        first_line = self.get_method_definition_start(name, "ParseNode*", "Sum", "const size_t start, const BinKind kind, const BinFields& fields"),
+        type_ok = self.get_type_ok(name, "ParseNode*")
+    ));
+    }
+
+    /// Generate the implementation of a single list parser
+    fn generate_implement_list(&self, buffer: &mut String, name: &NodeName, supports_empty: bool, contents: &NodeName) {
+        let rules_for_this_list = self.rules.get(name);
+        let kind = name.to_class_cases();
+        let first_line = self.get_method_definition_start(name, "ParseNode*", "", "");
+
+        let init = match rules_for_this_list.start {
+            Some(str) => str.reindent("    "),
+            None => {
+                // We cannot generate the method if we don't know how to initialize the list.
+                let rendered = format!("
+{first_line}
+{{
+    return raiseError(\"FIXME: Not implemented yet ({kind})\");
+}}\n",
+                    first_line = first_line,
+                    kind = kind,
+                );
+                buffer.push_str(&rendered);
+                return;
+            }
+        };
+        let append = match rules_for_this_list.append {
+            Some(str) => format!("{}", str.reindent("        ")),
+            None => "        result->appendWithoutOrderAssumption(item);".to_string()
+        };
+
+
+        let rendered = format!("\n{first_line}
+{{
+    uint32_t length;
+    AutoList guard(*tokenizer_);
+
+    const auto start = tokenizer_->offset();
+    MOZ_TRY(tokenizer_->enterList(length, guard));{empty_check}
+{init}
+
+    for (uint32_t i = 0; i < length; ++i) {{
+        MOZ_TRY_DECL(item, parse{inner}());
+{append}
+    }}
+
+    MOZ_TRY(guard.done());
+    return result;
+}}\n",
+            first_line = first_line,
+            empty_check =
+                if supports_empty {
+                    "".to_string()
+                } else {
+                    format!("\n    if (length == 0)\n         return raiseEmpty(\"{kind}\");\n",
+                        kind = kind)
+                },
+            inner = contents.to_class_cases(),
+            init = init,
+            append = append);
+        buffer.push_str(&rendered);
+    }
+
+    fn generate_implement_option(&self, buffer: &mut String, name: &NodeName, contents: &NodeName) {
+        debug!(target: "generate_spidermonkey", "Implementing optional value {} backed by {}",
+            name.to_str(), contents.to_str());
+
+        let rules_for_this_node = self.rules.get(name);
+
+        let type_ok = self.get_type_ok(name, "ParseNode*");
+        let default_value =
+            if type_ok == "Ok" {
+                "Ok()"
+            } else {
+                "nullptr"
+            }.to_string();
+
+        // At this stage, thanks to deanonymization, `contents`
+        // is something like `OptionalFooBar`.
+        let named_implementation =
+            if let Some(NamedType::Typedef(ref typedef)) = self.syntax.get_type_by_name(&name) {
+                assert!(typedef.is_optional());
+                if let TypeSpec::NamedType(ref named) = *typedef.spec() {
+                    self.syntax.get_type_by_name(named)
+                        .unwrap()
+                } else {
+                    panic!()
+                }
+            } else {
+                panic!()
+            };
+        match named_implementation {
+            NamedType::Interface(_) => {
+                buffer.push_str(&format!("{first_line}
+{{
+    BinKind kind;
+    BinFields fields((cx_));
+    AutoTaggedTuple guard(*tokenizer_);
+
+    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    {type_ok} result;
+    if (kind == BinKind::{null}) {{
+        result = {default_value};
+    }} else {{
+        const auto start = tokenizer_->offset();
+        MOZ_TRY_VAR(result, parseInterface{contents}(start, kind, fields));
+    }}
+    MOZ_TRY(guard.done());
+
+    return result;
+}}
+
+",
+                    first_line = self.get_method_definition_start(name, "ParseNode*", "", ""),
+                    null = self.syntax.get_null_name().to_str(),
+                    contents = contents.to_class_cases(),
+                    type_ok = type_ok,
+                    default_value = default_value,
+                ));
+            }
+            NamedType::Typedef(ref type_) => {
+                match type_.spec() {
+                    &TypeSpec::TypeSum(_) => {
+                buffer.push_str(&format!("{first_line}
+{{
+    BinKind kind;
+    BinFields fields((cx_));
+    AutoTaggedTuple guard(*tokenizer_);
+
+    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    {type_ok} result;
+    if (kind == BinKind::_Null) {{
+        result = {default_value};
+    }} else {{
+        const auto start = tokenizer_->offset();
+        MOZ_TRY_VAR(result, parseSum{contents}(start, kind, fields));
+    }}
+    MOZ_TRY(guard.done());
+
+    return result;
+}}
+
+",
+                            first_line = self.get_method_definition_start(name, "ParseNode*", "", ""),
+                            contents = contents.to_class_cases(),
+                            type_ok = type_ok,
+                            default_value = default_value,
+                        ));
+                    }
+                    &TypeSpec::String => {
+                        let build_result = rules_for_this_node.start.reindent("    ");
+
+                        buffer.push_str(&format!("{first_line}
+{{
+    RootedAtom string((cx_));
+    MOZ_TRY_VAR(string, tokenizer_->readMaybeAtom());
+
+{build}
+
+    {return_}
+}}
+
+",
+                            first_line = self.get_method_definition_start(name, "ParseNode*", "", ""),
+                            build = build_result,
+                            return_ = if build_result.len() == 0 {
+                                format!("return raiseError(\"FIXME: Not implemented yet ({kind})\");\n",
+                                    kind = name.to_str())
+                            } else {
+                                "return result;".to_string()
+                            }
+                        ));
+                    }
+                    _else => unimplemented!("{:?}", _else)
+                }
+            }
+            NamedType::StringEnum(_) => {
+                unimplemented!()
+            }
+        }
+    }
+
+    fn generate_implement_interface(&self, buffer: &mut String, name: &NodeName, interface: &Interface) {
+        let rules_for_this_interface = self.rules.get(name);
+
+        // Generate comments
+        let comment = format!("\n/*\n{}*/\n", ToWebidl::interface(interface, "", "    "));
+        buffer.push_str(&comment);
+
+        // Generate public method
+        let kind = name.to_class_cases();
+        buffer.push_str(&format!("{first_line}
+{{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterface{kind}(start, kind, fields));
+    MOZ_TRY(guard.done());
+
+    return result;
+}}
+
+",
+            first_line = self.get_method_definition_start(name, "ParseNode*", "", ""),
+            kind = kind
+        ));
+
+        // Generate aux method
+        let number_of_fields = interface.contents().fields().len();
+        let first_line = self.get_method_definition_start(name, "ParseNode*", "Interface", "const size_t start, const BinKind kind, const BinFields& fields");
+
+        let fields_type_list = format!("{{ {} }}", interface.contents()
+            .fields()
+            .iter()
+            .map(|field| format!("BinField::{}", field.name().to_cpp_enum_case()))
+            .format(", "));
+
+        let mut fields_implem = String::new();
+        for field in interface.contents().fields() {
+            let rules_for_this_field = rules_for_this_interface.by_field.get(field.name());
+            let needs_block = if let Some(ref rule) = rules_for_this_field {
+                rule.block_before_field.is_some() || rule.block_after_field.is_some()
+            } else {
+                false
+            };
+
+            let var_name = field.name().to_cpp_field_case();
+            let (decl_var, parse_var) = match field.type_().get_primitive(&self.syntax) {
+                Some(IsNullable { is_nullable: false, content: Primitive::Number }) => {
+                    if needs_block {
+                        (Some(format!("double {var_name};", var_name = var_name)),
+                            Some(format!("MOZ_TRY_VAR({var_name}, tokenizer_->readDouble());", var_name = var_name)))
+                    } else {
+                        (None,
+                            Some(format!("MOZ_TRY_DECL({var_name}, tokenizer_->readDouble());", var_name = var_name)))
+                    }
+                }
+                Some(IsNullable { is_nullable: false, content: Primitive::Boolean }) => {
+                    if needs_block {
+                        (Some(format!("bool {var_name};", var_name = var_name)),
+                        Some(format!("MOZ_TRY_VAR({var_name}, tokenizer_->readBool());", var_name = var_name)))
+                    } else {
+                        (None,
+                        Some(format!("MOZ_TRY_DECL({var_name}, tokenizer_->readBool());", var_name = var_name)))
+                    }
+                }
+                Some(IsNullable { is_nullable: false, content: Primitive::Offset }) => {
+                    if needs_block {
+                        (Some(format!("uint32_t {var_name};", var_name = var_name)),
+                        Some(format!("MOZ_TRY_VAR({var_name}, tokenizer_->readOffset());", var_name = var_name)))
+                    } else {
+                        (None,
+                        Some(format!("MOZ_TRY_DECL({var_name}, tokenizer_->readOffset());", var_name = var_name)))
+                    }
+                }
+                Some(IsNullable { content: Primitive::Void, .. }) => {
+                    (Some(format!("// Skipping void field {}", field.name().to_str())),
+                        None)
+                }
+                Some(IsNullable { is_nullable: false, content: Primitive::String }) => {
+                    (Some(format!("RootedAtom {var_name}((cx_));", var_name = var_name)),
+                        Some(format!("MOZ_TRY_VAR({var_name}, tokenizer_->readAtom());", var_name = var_name)))
+                }
+                Some(IsNullable { content: Primitive::Interface(ref interface), ..})
+                    if &self.get_type_ok(interface.name(), "?") == "Ok" =>
+                {
+                    // Special case: `Ok` means that we shouldn't bind the return value.
+                    let typename = TypeName::type_(field.type_());
+                    (None,
+                        Some(format!("MOZ_TRY(parse{typename}());",
+                            typename = typename)))
+                }
+                _else => {
+                    let typename = TypeName::type_(field.type_());
+                    if needs_block {
+                        (Some(format!("{typename} {var_name};",
+                            var_name = var_name,
+                            typename = typename)),
+                            Some(format!("MOZ_TRY_VAR({var_name}, parse{typename}());",
+                            var_name = var_name,
+                            typename = typename)
+                        ))
+                    } else {
+                        (None,
+                            Some(format!("MOZ_TRY_DECL({var_name}, parse{typename}());",
+                            var_name = var_name,
+                            typename = typename)))
+                    }
+                }
+            };
+
+            let rendered = if let Some(ref rule) = rules_for_this_field {
+                if rule.replace.is_some() {
+                    rule.replace.reindent("    ")
+                        .newline()
+                } else {
+                    let before_field = rule.before_field.reindent("    ");
+                    let after_field = rule.after_field.reindent("    ");
+                    let decl_var = if rule.declare.is_some() {
+                        rule.declare.reindent("    ")
+                    } else {
+                        decl_var.reindent("    ")
+                    };
+                    if needs_block {
+                        let parse_var = parse_var.reindent("        ");
+                        format!("{before_field}
+{decl_var}
+    {{
+{block_before_field}
+{parse_var}
+{block_after_field}
+    }}
+{after_field}",
+                            before_field = before_field.reindent("    "),
+                            decl_var = decl_var.reindent("    "),
+                            parse_var = parse_var.reindent("        "),
+                            after_field = after_field.reindent("    "),
+                            block_before_field = rule.block_before_field.reindent("        "),
+                            block_after_field = rule.block_after_field.reindent("        "))
+                    } else {
+                        format!("
+{before_field}
+{decl_var}
+{parse_var}
+{after_field}
+",
+                            before_field = before_field.reindent("    "),
+                            decl_var = decl_var.reindent("    "),
+                            parse_var = parse_var.reindent("    "),
+                            after_field = after_field.reindent("    "))
+                    }
+                }
+            } else {
+                format!("
+{decl_var}
+{parse_var}
+",
+                    decl_var = decl_var.reindent("    "),
+                    parse_var = parse_var.reindent("    "))
+            };
+            fields_implem.push_str(&rendered);
+        }
+
+        let (start, build_result) =
+            (rules_for_this_interface.start.reindent("    "),
+             rules_for_this_interface.build_result.reindent("    "));
+
+        if build_result == "" {
+            buffer.push_str(&format!("{first_line}
+{{
+    return raiseError(\"FIXME: Not implemented yet ({})\");
+}}
+
+",
+                kind = kind.to_str(),
+                first_line = first_line,
+            ));
+        } else {
+            let check_fields = if number_of_fields == 0 {
+                format!("MOZ_TRY(tokenizer_->checkFields0(kind, fields));")
+            } else {
+                format!("MOZ_TRY(tokenizer_->checkFields(kind, fields, {fields_type_list}));",
+                    fields_type_list = fields_type_list)
+            };
+            buffer.push_str(&format!("{first_line}
+{{
+    MOZ_ASSERT(kind == BinKind::{kind});
+    {check_fields}
+{pre}{fields_implem}
+{post}
+    return result;
+}}
+
+",
+                check_fields = check_fields,
+                fields_implem = fields_implem,
+                pre = start,
+                post = build_result,
+                kind = kind,
+                first_line = first_line,
+            ));
+        }
+    }
+
+    /// Generate C++ code for SpiderMonkey
+    pub fn to_spidermonkey_cpp(&self) -> String {
+        let mut buffer = String::new();
+
+        buffer.push_str(&self.generate_autogenerated_warning());
+
+        // 0. Header
+        buffer.push_str(&self.rules.cpp_header.reindent(""));
+        buffer.push_str("\n");
+
+        // 1. Typesums
+        buffer.push_str("\n\n// ----- Sums of interfaces (autogenerated, by lexicographical order)\n");
+        buffer.push_str("// Sums of sums are flattened.\n");
+
+        let sums_of_interfaces = self.syntax.resolved_sums_of_interfaces_by_name()
+            .iter()
+            .sorted_by(|a, b| a.0.cmp(&b.0));
+
+        for &(ref name, ref nodes) in sums_of_interfaces.iter() {
+            self.generate_implement_sum(&mut buffer, name, nodes);
+        }
+
+        // 2. Single interfaces
+        buffer.push_str("\n\n// ----- Interfaces (autogenerated, by lexicographical order)\n");
+        buffer.push_str("// When fields have a non-trivial type, implementation is deanonymized and delegated to another parser.\n");
+        let interfaces_by_name = self.syntax.interfaces_by_name()
+            .iter()
+            .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+
+        for (name, interface) in interfaces_by_name {
+            self.generate_implement_interface(&mut buffer, name, interface);
+        }
+
+        // 3. String Enums
+        buffer.push_str("\n\n// ----- String enums (autogenerated, by lexicographical order)\n");
+        {
+            let string_enums_by_name = self.syntax.string_enums_by_name()
+                .iter()
+                .sorted_by(|a, b| str::cmp(a.0.to_str(), b.0.to_str()));
+            for (kind, enum_) in string_enums_by_name {
+                let convert = format!("    switch (variant) {{
+{cases}
+      default:
+        return raiseInvalidVariant(\"{kind}\", variant);
+    }}",
+                    kind = kind,
+                    cases = enum_.strings()
+                        .iter()
+                        .map(|symbol| {
+                            format!("      case BinVariant::{binvariant_variant}:
+        return {kind}::{specialized_variant};",
+                                kind = kind,
+                                specialized_variant = symbol.to_cpp_enum_case(),
+                                binvariant_variant  = self.variants_by_symbol.get(symbol)
+                                    .unwrap()
+                            )
+                        })
+                        .format("\n")
+                );
+
+                let rendered_doc = format!("/*\nenum {kind} {{\n{cases}\n}};\n*/\n",
+                    kind = kind,
+                    cases = enum_.strings()
+                            .iter()
+                            .map(|s| format!("    \"{}\"", s))
+                            .format(",\n")
+                );
+                buffer.push_str(&format!("{rendered_doc}{first_line}
+{{
+    MOZ_TRY_DECL(variant, tokenizer_->readVariant());
+
+{convert}
+}}
+
+",
+                    rendered_doc = rendered_doc,
+                    convert = convert,
+                    first_line = self.get_method_definition_start(kind, &format!("typename BinASTParser<Tok>::{kind}", kind = kind), "", "")
+                ));
+            }
+        }
+
+        // 4. Lists
+        buffer.push_str("\n\n// ----- Lists (autogenerated, by lexicographical order)\n");
+        for &(ref name, (supports_empty, ref contents)) in &self.list_parsers_to_generate {
+            self.generate_implement_list(&mut buffer, name, supports_empty, contents);
+        }
+
+        // 5. Optional values
+        buffer.push_str("\n\n    // ----- Default values (by lexicographical order)\n");
+        for &(ref name, ref contents) in &self.option_parsers_to_generate {
+            self.generate_implement_option(&mut buffer, name, contents);
+        }
+
+        buffer.push_str("\n");
+        buffer.push_str(&self.rules.cpp_footer.reindent(""));
+        buffer.push_str("\n");
+
+        buffer
+    }
+}
+
+fn update_rule(rule: &mut Option<String>, entry: &yaml_rust::Yaml) -> Option<Option<()>> {
+    if entry.is_badvalue() {
+        return Some(None)
+    } else if let Some(as_str) = entry.as_str() {
+        *rule = Some(as_str.to_string());
+        Some(Some(()))
+    } else {
+        None
+    }
+}
+
+
+fn main() {
+    env_logger::init();
+
+    let matches = App::new("BinJS import from webidl")
+        .author("David Teller, <dteller@mozilla.com>")
+        .about("Import a webidl defining the syntax of JavaScript.")
+        .args(&[
+            Arg::with_name("INPUT.webidl")
+                .required(true)
+                .help("Input webidl file to use. Must be a webidl source file."),
+            Arg::with_name("INPUT.yaml")
+                .required(true)
+                .help("Input rules file to use. Must be a yaml source file."),
+            Arg::with_name("OUT_HEADER_CLASS_FILE")
+                .long("out-class")
+                .required(true)
+                .takes_value(true)
+                .help("Output header file (.h, designed to be included from within the class file)"),
+            Arg::with_name("OUT_TOKEN_FILE")
+                .long("out-token")
+                .required(true)
+                .takes_value(true)
+                .help("Output token file (.h)"),
+            Arg::with_name("OUT_IMPL_FILE")
+                .long("out-impl")
+                .required(true)
+                .takes_value(true)
+                .help("Output implementation file (.cpp)"),
+            Arg::with_name("OUT_WEBIDL_FILE")
+                .long("out-webidl")
+                .required(false)
+                .takes_value(true)
+                .help("Path to copy the webidl source"),
+            Arg::with_name("OUT_YAML_FILE")
+                .long("out-yaml")
+                .required(false)
+                .takes_value(true)
+                .help("Path to copy the yaml source"),
+        ])
+    .get_matches();
+
+    let source_path = matches.value_of("INPUT.webidl")
+        .expect("Expected INPUT.webidl");
+
+    let mut file = File::open(source_path)
+        .expect("Could not open source");
+    let mut source = String::new();
+    file.read_to_string(&mut source)
+        .expect("Could not read source");
+
+    println!("...parsing webidl");
+    let parser = webidl::Parser::new();
+    let ast = parser.parse_string(&source)
+        .expect("Could not parse source");
+
+    println!("...verifying grammar");
+    let mut builder = Importer::import(&ast);
+    let fake_root = builder.node_name("@@ROOT@@"); // Unused
+    let null = builder.node_name(""); // Used
+    builder.add_interface(&null)
+        .unwrap();
+    let syntax = builder.into_spec(SpecOptions {
+        root: &fake_root,
+        null: &null,
+    });
+
+    let syntax_options = SpecOptions {
+        root: &fake_root,
+        null: &null,
+    };
+
+    let deanonymizer = TypeDeanonymizer::new(&syntax);
+
+    let mut generation_rules = GenerationRules::default();
+    if let Some(rules_source_path) = matches.value_of("INPUT.yaml") {
+        println!("...generating rules");
+        let mut file = File::open(rules_source_path)
+            .expect("Could not open rules");
+        let mut data = String::new();
+        file.read_to_string(&mut data)
+            .expect("Could not read rules");
+
+        let yaml = yaml_rust::YamlLoader::load_from_str(&data)
+            .expect("Could not parse rules");
+        assert_eq!(yaml.len(), 1);
+        let rules = yaml[0].as_hash()
+            .expect("Rules are not a dictionary");
+
+        for (node_key, node_entries) in rules.iter() {
+            let node_key = node_key.as_str()
+                .expect("Could not convert node_key to string");
+
+            match node_key {
+                "cpp" => {
+                    update_rule(&mut generation_rules.cpp_header, &node_entries["header"])
+                        .unwrap_or_else(|| panic!("Rule cpp.header must be a string"));
+                    update_rule(&mut generation_rules.cpp_footer, &node_entries["footer"])
+                        .unwrap_or_else(|| panic!("Rule cpp.footer must be a string"));
+                    continue;
+                }
+                "hpp" => {
+                    update_rule(&mut generation_rules.hpp_class_header, &node_entries["class"]["header"])
+                        .unwrap_or_else(|| panic!("Rule hpp.class.header must be a string"));
+                    update_rule(&mut generation_rules.hpp_tokens_header, &node_entries["tokens"]["header"])
+                        .unwrap_or_else(|| panic!("Rule hpp.tokens.header must be a string"));
+                    update_rule(&mut generation_rules.hpp_tokens_footer, &node_entries["tokens"]["footer"])
+                        .unwrap_or_else(|| panic!("Rule hpp.tokens.footer must be a string"));
+                    update_rule(&mut generation_rules.hpp_tokens_kind_doc, &node_entries["tokens"]["kind"]["doc"])
+                        .unwrap_or_else(|| panic!("Rule hpp.tokens.kind.doc must be a string"));
+                    update_rule(&mut generation_rules.hpp_tokens_variant_doc, &node_entries["tokens"]["variant"]["doc"])
+                        .unwrap_or_else(|| panic!("Rule hpp.tokens.variant.doc must be a string"));
+                    update_rule(&mut generation_rules.hpp_tokens_field_doc, &node_entries["tokens"]["field"]["doc"])
+                        .unwrap_or_else(|| panic!("Rule hpp.tokens.field.doc must be a string"));
+                    continue;
+                }
+                _ => {}
+            }
+
+
+            let node_name = deanonymizer.get_node_name(&node_key)
+                .unwrap_or_else(|| panic!("Unknown node name {}", node_key));
+
+            let hash = node_entries.as_hash()
+                .unwrap_or_else(|| panic!("Node {} isn't a dictionary"));
+
+            let mut node_rule = NodeParsingRules::default();
+            for (node_item_key, node_item_entry) in hash {
+                let as_string = node_item_key.as_str()
+                    .unwrap_or_else(|| panic!("Keys for rule {} must be strings", node_key));
+                match as_string {
+                    "inherits" => {
+                        let name = node_item_entry.as_str()
+                            .unwrap_or_else(|| panic!("Rule {}.{} must be a string", node_key, as_string));
+                        let inherits = deanonymizer.get_node_name(name)
+                            .unwrap_or_else(|| panic!("Unknown node name {}", node_key));
+                        node_rule.inherits = Some(inherits);
+                    }
+                    "init" => {
+                        update_rule(&mut node_rule.start, node_item_entry)
+                            .unwrap_or_else(|| panic!("Rule {}.{} must be a string", node_key, as_string));
+                    }
+                    "build" => {
+                        update_rule(&mut node_rule.build_result, node_item_entry)
+                            .unwrap_or_else(|| panic!("Rule {}.{} must be a string", node_key, as_string));
+                    }
+                    "append" => {
+                        update_rule(&mut node_rule.append, node_item_entry)
+                            .unwrap_or_else(|| panic!("Rule {}.{} must be a string", node_key, as_string));
+                    }
+                    "type-ok" => {
+                        update_rule(&mut node_rule.type_ok, node_item_entry)
+                            .unwrap_or_else(|| panic!("Rule {}.{} must be a string", node_key, as_string));
+                    }
+                    "fields" => {
+                        let fields = node_item_entry.as_hash()
+                            .unwrap_or_else(|| panic!("Rule {}.fields must be a hash, got {:?}", node_key, node_entries["fields"]));
+                        for (field_key, field_entry) in fields {
+                            let field_key = field_key.as_str()
+                                .unwrap_or_else(|| panic!("In rule {}, field entries must be field names",
+                                    node_key))
+                                .to_string();
+                            let field_name = syntax.get_field_name(&field_key)
+                                .unwrap_or_else(|| panic!("In rule {}, can't find field {}",
+                                    node_key,
+                                    field_key));
+
+                            let mut field_rule = FieldParsingRules::default();
+                            for (field_config_key, field_config_entry) in field_entry.as_hash()
+                                .unwrap_or_else(|| panic!("Rule {}.fields.{} must be a hash", node_key, field_key))
+                            {
+                                let field_config_key = field_config_key.as_str()
+                                    .expect("Expected a string as a key");
+                                match field_config_key
+                                {
+                                    "block" => {
+                                        update_rule(&mut field_rule.declare, &field_config_entry["declare"])
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{}.{} must be a string", node_key, field_key, field_config_key, "declare"));
+
+                                        update_rule(&mut field_rule.replace, &field_config_entry["replace"])
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{}.{} must be a string", node_key, field_key, field_config_key, "replace"));
+
+                                        update_rule(&mut field_rule.block_before_field, &field_config_entry["before"])
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{}.{} must be a string", node_key, field_key, field_config_key, "before"));
+
+                                        update_rule(&mut field_rule.block_after_field, &field_config_entry["after"])
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{}.{} must be a string", node_key, field_key, field_config_key, "after"));
+                                    }
+                                    "before" => {
+                                        update_rule(&mut field_rule.before_field, &field_config_entry)
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{} must be a string", node_key, field_key, field_config_key));
+                                    }
+                                    "after" => {
+                                        update_rule(&mut field_rule.after_field, &field_config_entry)
+                                            .unwrap_or_else(|| panic!("Rule {}.fields.{}.{} must be a string", node_key, field_key, field_config_key));
+                                    }
+                                    _ => {
+                                        panic!("Unexpected {}.fields.{}.{}", node_key, field_key, field_config_key)
+                                    }
+                                }
+                            }
+                            node_rule.by_field.insert(field_name.clone(), field_rule);
+                        }
+                    }
+                    _ => panic!("Unexpected node_item_key {}.{}", node_key, as_string)
+                }
+            }
+
+            generation_rules.per_node.insert(node_name.clone(), node_rule);
+            // FIXME: Check that rules are only for interfaces.
+        }
+    } else {
+        println!("...skipping rules");
+    }
+
+    let mut exporter = CPPExporter::new(deanonymizer,
+        syntax_options);
+    exporter.set_export_rules(generation_rules);
+
+    let write_to = |description, arg, data: &String| {
+        let dest_path = matches.value_of(arg)
+            .unwrap();
+        println!("...exporting {description}: {path}",
+            description = description,
+            path = dest_path);
+        let mut dest = File::create(&dest_path)
+            .unwrap_or_else(|e| panic!("Could not create {description} at {path}: {error}",
+                            description = description,
+                            path = dest_path,
+                            error = e));
+        dest.write_all(data.as_bytes())
+            .unwrap_or_else(|e| panic!("Could not write {description} at {path}: {error}",
+                            description = description,
+                            path = dest_path,
+                            error = e));
+    };
+
+    write_to("C++ class header code", "OUT_HEADER_CLASS_FILE",
+        &exporter.to_spidermonkey_class_hpp());
+    write_to("C++ token header code", "OUT_TOKEN_FILE",
+        &exporter.to_spidermonkey_token_hpp());
+    write_to("C++ token implementation code", "OUT_IMPL_FILE",
+        &exporter.to_spidermonkey_cpp());
+
+    println!("...done");
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/src/export.rs
@@ -0,0 +1,431 @@
+use spec::*;
+use util::*;
+
+use std::collections::{ HashSet };
+
+use itertools::Itertools;
+
+/// A tool designed to replace all anonymous types in a specification
+/// of the language by explicitly named types.
+///
+/// Consider the following mini-specifications for JSON:
+///
+/// ```idl
+/// interface Value {
+///     attribute (Object or String or Number or Array or Boolean)? value;
+/// }
+/// interface Object {
+///     attribute FrozenArray<Property> properties;
+/// }
+/// interface Property {
+///     attribute DOMString name;
+///     attribute Value value;
+/// }
+/// interface Array {
+///     attribute FrozenArray<Value?> items;
+/// }
+/// // ... Skipping definitions of String, Number, Boolean
+/// ```
+///
+/// The deanonymizer will rewrite them as follows:
+///
+/// ```idl
+/// interface Value { // Deanonymized optional sum
+///     attribute OptionalObjectOrStringOrNumberOrArrayOrBoolean value;
+/// }
+/// interface Object { // Deanonymized list
+///     attribute ListOfProperty properties;
+/// }
+/// interface Property { // No change
+///     attribute DOMString name;
+///     attribute Value value;
+/// }
+/// interface Array { // Deanonymized list of options
+///     attribute ListOfOptionalValue items;
+/// }
+/// // ... Skipping definitions of String, Number, Boolean
+///
+/// typedef ObjectOrStringOrNumberOrArrayOrBoolean? OptionalObjectOrStringOrNumberOrArrayOrBoolean;
+/// typedef (Object
+///          or String
+///          or Number
+///          or Array
+///          or Boolean)
+///          ObjectOrStringOrNumberOrArrayOrBoolean;
+/// typedef FrozenArray<Property> ListOfProperty;
+/// typedef FrozenArray<OptionalValue> ListOfOptionalValue;
+/// typedef Value? Optionalvalue;
+/// ```
+///
+/// This deanonymization lets us cleanly define intermediate data structures and/or parsers
+/// implementing the webidl specification.
+pub struct TypeDeanonymizer {
+    builder: SpecBuilder,
+}
+impl TypeDeanonymizer {
+    /// Create an empty TypeDeanonymizer.
+    pub fn new(spec: &Spec) -> Self {
+        let mut result = TypeDeanonymizer {
+            builder: SpecBuilder::new(),
+        };
+        // Copy field names
+        for (_, name) in spec.field_names() {
+            result.builder.import_field_name(name)
+        }
+
+        // We may need to introduce name `offset`, we'll se.
+        let mut field_offset = None;
+
+        // Copy and deanonymize interfaces.
+        for (name, interface) in spec.interfaces_by_name() {
+            result.builder.import_node_name(name);
+            // Collect interfaces to copy them into the `builder`
+            // and walk through their fields to deanonymize types.
+
+            let mut fields = vec![];
+            // If the interface is skippable, introduce a first invisible field `_offset`.
+            if interface.is_skippable() {
+                let name = field_offset.get_or_insert_with(||
+                    result.builder.field_name("_offset")
+                );
+                fields.push(Field::new(
+                    name.clone(),
+                    Type::offset().required()
+                ))
+            }
+
+            // Copy other fields.
+            for field in interface.contents().fields() {
+                result.import_type(spec, field.type_(), None);
+                fields.push(field.clone());
+            }
+
+            // Copy the declaration.
+            let mut declaration = result.builder.add_interface(name)
+                .unwrap();
+            for field in fields.drain(..) {
+                declaration.with_field(field.name(), field.type_().clone());
+            }
+        }
+        // Copy and deanonymize typedefs
+        for (name, definition) in spec.typedefs_by_name() {
+            result.builder.import_node_name(name);
+            if result.builder.get_typedef(name).is_some() {
+                // Already imported by following links.
+                continue
+            }
+            result.import_type(spec, &definition, Some(name.clone()));
+        }
+        // Copy and deanonymize string enums
+        for (name, definition) in spec.string_enums_by_name() {
+            result.builder.import_node_name(name);
+            let mut strings: Vec<_> = definition.strings()
+                .iter()
+                .collect();
+            let mut declaration = result.builder.add_string_enum(name)
+                .unwrap();
+            for string in strings.drain(..) {
+                declaration.with_string(&string);
+            }
+        }
+        debug!(target: "export_utils", "Names: {:?}", result.builder.names().keys().format(", "));
+
+        result
+    }
+
+    /// Convert into a new specification.
+    pub fn into_spec(self, options: SpecOptions) -> Spec {
+        self.builder.into_spec(options)
+    }
+
+    /// If `name` is the name of a (deanonymized) type, return the corresponding type.
+    pub fn get_node_name(&self, name: &str) -> Option<NodeName> {
+        self.builder.get_node_name(name)
+    }
+
+    /// Returns `(sum, name)` where `sum` is `Some(names)` iff this type can be resolved to a sum of interfaces.
+    fn import_type(&mut self, spec: &Spec, type_: &Type, public_name: Option<NodeName>) -> (Option<HashSet<NodeName>>, NodeName) {
+        debug!(target: "export_utils", "import_type {:?} => {:?}", public_name, type_);
+        if type_.is_optional() {
+            let (_, spec_name) = self.import_typespec(spec, &type_.spec, None);
+            let my_name =
+                match public_name {
+                    None => self.builder.node_name(&format!("Optional{}", spec_name)),
+                    Some(ref name) => name.clone()
+                };
+            let deanonymized = Type::named(&spec_name).optional()
+                .unwrap(); // Named types can always be made optional.
+            if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                debug!(target: "export_utils", "import_type introduced {:?}", my_name);
+                typedef.with_type(deanonymized.clone());
+            } else {
+                debug!(target: "export_utils", "import_type: Attempting to redefine typedef {name}", name = my_name.to_str());
+            }
+            (None, my_name)
+        } else {
+            self.import_typespec(spec, &type_.spec, public_name)
+        }
+    }
+    fn import_typespec(&mut self, spec: &Spec, type_spec: &TypeSpec, public_name: Option<NodeName>) -> (Option<HashSet<NodeName>>, NodeName) {
+        debug!(target: "export_utils", "import_typespec {:?} => {:?}", public_name, type_spec);
+        match *type_spec {
+            TypeSpec::Boolean |
+            TypeSpec::Number |
+            TypeSpec::String |
+            TypeSpec::Offset |
+            TypeSpec::Void    => {
+                if let Some(ref my_name) = public_name {
+                    if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                        debug!(target: "export_utils", "import_typespec: Defining {name} (primitive)", name = my_name.to_str());
+                        typedef.with_type(type_spec.clone().required());
+                    } else {
+                        debug!(target: "export_utils", "import_typespec: Attempting to redefine typedef {name}", name = my_name.to_str());
+                    }
+                }
+                (None, self.builder.node_name("@@"))
+            }
+            TypeSpec::NamedType(ref link) => {
+                let resolved = spec.get_type_by_name(link)
+                    .unwrap_or_else(|| panic!("While deanonymizing, could not find the definition of {} in the original spec.", link.to_str()));
+                let (sum, rewrite, primitive) = match resolved {
+                    NamedType::StringEnum(_) => {
+                        // - Can't use in a sum
+                        // - No rewriting happened.
+                        (None, None, None)
+                    }
+                    NamedType::Typedef(ref type_) => {
+                        // - Might use in a sum.
+                        // - Might be rewritten.
+                        let (sum, name) = self.import_type(spec, type_, Some(link.clone()));
+                        (sum, Some(name), type_.get_primitive(spec))
+                    }
+                    NamedType::Interface(_) => {
+                        // - May use in a sum.
+                        // - If a rewriting takes place, it didn't change the names.
+                        let sum = [link.clone()].iter()
+                            .cloned()
+                            .collect();
+                        (Some(sum), None, None)
+                    }
+                };
+                debug!(target: "export_utils", "import_typespec dealing with named type {}, public name {:?} => {:?}",
+                    link, public_name, rewrite);
+                if let Some(ref my_name) = public_name {
+                    // If we have a public name, alias it to `content`
+                    if let Some(content) = rewrite {
+                        let deanonymized = match primitive {
+                            None |
+                            Some(IsNullable { is_nullable: true, .. }) |
+                            Some(IsNullable { content: Primitive::Interface(_), .. }) => Type::named(&content).required(),
+                            Some(IsNullable { content: Primitive::String, .. }) => Type::string().required(),
+                            Some(IsNullable { content: Primitive::Number, .. }) => Type::number().required(),
+                            Some(IsNullable { content: Primitive::Boolean, .. }) => Type::bool().required(),
+                            Some(IsNullable { content: Primitive::Offset, .. }) => Type::offset().required(),
+                            Some(IsNullable { content: Primitive::Void, .. }) => Type::void().required()
+                        };
+                        debug!(target: "export_utils", "import_typespec aliasing {:?} => {:?}",
+                            my_name, deanonymized);
+                        if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                            debug!(target: "export_utils", "import_typespec: Defining {name} (name to content)", name = my_name.to_str());
+                            typedef.with_type(deanonymized.clone());
+                        } else {
+                            debug!(target: "export_utils", "import_typespec: Attempting to redefine typedef {name}", name = my_name.to_str());
+                        }
+                    }
+                    // Also, don't forget to copy the typedef and alias `link`
+                    let deanonymized = Type::named(link).required();
+                    if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                        debug!(target: "export_utils", "import_typespec: Defining {name} (name to link)", name = my_name.to_str());
+                        typedef.with_type(deanonymized.clone());
+                    } else {
+                        debug!(target: "export_utils", "import_typespec: Attempting to redefine typedef {name}", name = my_name.to_str());
+                    }
+                }
+                (sum, link.clone())
+            }
+            TypeSpec::Array {
+                ref contents,
+                ref supports_empty
+            } => {
+                let (_, contents_name) = self.import_type(spec, contents, None);
+                let my_name =
+                    match public_name {
+                        None => self.builder.node_name(&format!("{non_empty}ListOf{content}",
+                            non_empty =
+                                if *supports_empty {
+                                    ""
+                                } else {
+                                    "NonEmpty"
+                                },
+                            content = contents_name.to_str())),
+                        Some(ref name) => name.clone()
+                    };
+                let deanonymized =
+                    if *supports_empty {
+                        Type::named(&contents_name).array()
+                    } else {
+                        Type::named(&contents_name).non_empty_array()
+                    };
+                if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                    debug!(target: "export_utils", "import_typespec: Defining {name} (name to list)",
+                        name = my_name.to_str());
+                    typedef.with_type(deanonymized.clone());
+                } else {
+                    debug!(target: "export_utils", "import_typespec: Attempting to redefine typedef {name}", name = my_name.to_str());
+                }
+                (None, my_name)
+            }
+            TypeSpec::TypeSum(ref sum) => {
+                let mut full_sum = HashSet::new();
+                let mut names = vec![];
+                for sub_type in sum.types() {
+                    let (mut sub_sum, name) = self.import_typespec(spec, sub_type, None);
+                    let mut sub_sum = sub_sum.unwrap_or_else(
+                        || panic!("While treating {:?}, attempting to create a sum containing {}, which isn't an interface or a sum of interfaces", type_spec, name)
+                    );
+                    names.push(name);
+                    for item in sub_sum.drain() {
+                        full_sum.insert(item);
+                    }
+                }
+                let my_name =
+                    match public_name {
+                        None => self.builder.node_name(&format!("{}",
+                            names.drain(..).format("Or"))),
+                        Some(ref name) => name.clone()
+                    };
+                let sum : Vec<_> = full_sum.iter()
+                    .map(Type::named)
+                    .collect();
+                let deanonymized = Type::sum(&sum).required();
+                if let Some(ref mut typedef) = self.builder.add_typedef(&my_name) {
+                    debug!(target: "export_utils", "import_typespec: Defining {name} (name to sum)", name = my_name.to_str());
+                    typedef.with_type(deanonymized.clone());
+                } else {
+                    debug!(target: "export_utils", "import_type: Attempting to redefine typedef {name}", name = my_name.to_str());
+                }
+                (Some(full_sum), my_name)
+            }
+        }
+    }
+}
+
+/// Utility to give a name to a type or type spec.
+pub struct TypeName;
+impl TypeName {
+    pub fn type_(type_: &Type) -> String {
+        let spec_name = Self::type_spec(type_.spec());
+        if type_.is_optional() {
+            format!("Optional{}", spec_name)
+        } else {
+            spec_name
+        }
+    }
+
+    pub fn type_spec(spec: &TypeSpec) -> String {
+        match *spec {
+            TypeSpec::Array { ref contents, supports_empty: false } =>
+                format!("NonEmptyListOf{}", Self::type_(contents)),
+            TypeSpec::Array { ref contents, supports_empty: true } =>
+                format!("ListOf{}", Self::type_(contents)),
+            TypeSpec::NamedType(ref name) =>
+                name.to_string().clone(),
+            TypeSpec::Offset =>
+                "_Offset".to_string(),
+            TypeSpec::Boolean =>
+                "_Bool".to_string(),
+            TypeSpec::Number =>
+                "_Number".to_string(),
+            TypeSpec::String =>
+                "_String".to_string(),
+            TypeSpec::Void =>
+                "_Void".to_string(),
+            TypeSpec::TypeSum(ref sum) => {
+                format!("{}", sum.types()
+                    .iter()
+                    .map(Self::type_spec)
+                    .format("Or"))
+            }
+        }
+    }
+}
+
+/// Export a type specification as webidl.
+///
+/// Designed for generating documentation.
+pub struct ToWebidl;
+impl ToWebidl {
+    /// Export a TypeSpec.
+    pub fn spec(spec: &TypeSpec, prefix: &str, indent: &str) -> Option<String> {
+        let result = match *spec {
+            TypeSpec::Offset => {
+                return None;
+            }
+            TypeSpec::Array { ref contents, ref supports_empty } => {
+                match Self::type_(&*contents, prefix, indent) {
+                    None => { return None; }
+                    Some(description) => format!("{emptiness}FrozenArray<{}>",
+                        description,
+                        emptiness = if *supports_empty { "" } else {"[NonEmpty] "} ),
+                }
+            }
+            TypeSpec::Boolean =>
+                "bool".to_string(),
+            TypeSpec::String =>
+                "string".to_string(),
+            TypeSpec::Number =>
+                "number".to_string(),
+            TypeSpec::NamedType(ref name) =>
+                name.to_str().to_string(),
+            TypeSpec::TypeSum(ref sum) => {
+                format!("({})", sum.types()
+                    .iter()
+                    .filter_map(|x| Self::spec(x, "", indent))
+                    .format(" or "))
+            }
+            TypeSpec::Void => "void".to_string()
+        };
+        Some(result)
+    }
+
+    /// Export a Type
+    pub fn type_(type_: &Type, prefix: &str, indent: &str) -> Option<String> {
+        let pretty_type = Self::spec(type_.spec(), prefix, indent);
+        match pretty_type {
+            None => None,
+            Some(pretty_type) => Some(format!("{}{}",
+                pretty_type,
+                if type_.is_optional() { "?" } else { "" }))
+        }
+    }
+
+    /// Export an Interface
+    pub fn interface(interface: &Interface, prefix: &str, indent: &str) -> String {
+        let mut result = format!("{prefix} interface {name} : Node {{\n", prefix=prefix, name=interface.name().to_str());
+        {
+            let prefix = format!("{prefix}{indent}",
+                prefix=prefix,
+                indent=indent);
+            for field in interface.contents().fields() {
+                match Self::type_(field.type_(), &prefix, indent) {
+                    None => /* generated field, ignore */ {},
+                    Some(description) => {
+                        if let Some(ref doc) = field.doc() {
+                            result.push_str(&format!("{prefix}// {doc}\n", prefix = prefix, doc = doc));
+                        }
+                        result.push_str(&format!("{prefix}{description} {name};\n",
+                            prefix = prefix,
+                            name = field.name().to_str(),
+                            description = description
+                        ));
+                        if field.doc().is_some() {
+                            result.push_str("\n");
+                        }
+                    }
+                }
+            }
+        }
+        result.push_str(&format!("{prefix} }}\n", prefix=prefix));
+        result
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/src/import.rs
@@ -0,0 +1,155 @@
+use spec::{ self, SpecBuilder, TypeSum };
+
+use webidl::ast::*;
+
+pub struct Importer {
+    builder: SpecBuilder,
+}
+impl Importer {
+    /// Import an AST into a SpecBuilder.
+    ///
+    /// ```
+    /// extern crate binjs_meta;
+    /// extern crate webidl;
+    /// use webidl;
+    ///
+    /// let parser = webidl::Parser::new();
+    /// let ast = parser.parse_string("
+    ///    [Skippable] interface SkippableFoo {
+    ///       attribute EagerFoo eager;
+    ///    };
+    ///    interface EagerFoo {
+    ///       attribute bool value;
+    ///    };
+    /// ").expect("Could not parse");
+    ///
+    /// let mut builder = binjs_meta::import::Importer::import(&ast);
+    ///
+    /// let name_eager = builder.get_node_name("EagerFoo")
+    ///     .expect("Missing name EagerFoo");
+    /// let name_skippable = builder.get_node_name("SkippableFoo")
+    ///     .expect("Missing name SkippableFoo");
+    ///
+    /// {
+    ///     let interface_eager = builder.get_interface(&name_eager)
+    ///         .expect("Missing interface EagerFoo");
+    ///     assert_eq!(interface_eager.is_skippable(), false);
+    /// }
+    ///
+    /// {
+    ///     let interface_skippable = builder.get_interface(&name_skippable)
+    ///         .expect("Missing interface SkippableFoo");
+    ///     assert_eq!(interface_skippable.is_skippable(), true);
+    /// }
+    /// ```
+    pub fn import(ast: &AST) -> SpecBuilder {
+        let mut importer = Importer {
+            builder: SpecBuilder::new()
+        };
+        importer.import_ast(ast);
+        importer.builder
+    }
+    fn import_ast(&mut self, ast: &AST) {
+        for definition in ast {
+            self.import_definition(&definition)
+        }
+    }
+    fn import_definition(&mut self, def: &Definition) {
+        match *def {
+            Definition::Enum(ref enum_) => self.import_enum(enum_),
+            Definition::Typedef(ref typedef) => self.import_typedef(typedef),
+            Definition::Interface(ref interface) => self.import_interface(interface),
+            _ => panic!("Not implemented: importing {:?}", def)
+        }
+    }
+    fn import_enum(&mut self, enum_: &Enum) {
+        let name = self.builder.node_name(&enum_.name);
+        let mut node = self.builder.add_string_enum(&name)
+            .expect("Name already present");
+        for variant in &enum_.variants {
+            node.with_string(variant);
+        }
+    }
+    fn import_typedef(&mut self, typedef: &Typedef) {
+        let name = self.builder.node_name(&typedef.name);
+        let type_ = self.convert_type(&*typedef.type_);
+        let mut node = self.builder.add_typedef(&name)
+            .expect("Name already present");
+        assert!(!type_.is_optional());
+        node.with_spec(type_.spec);
+    }
+    fn import_interface(&mut self, interface: &Interface) {
+        let interface = if let &Interface::NonPartial(ref interface) = interface {
+            interface
+        } else {
+            panic!("Expected a non-partial interface, got {:?}", interface);
+        };
+        if interface.name == "Node" {
+            // We're not interested in the root interface.
+            return;
+        }
+        if let Some(ref parent) = interface.inherits {
+            assert_eq!(parent, "Node");
+        }
+        let mut fields = Vec::new();
+        for member in &interface.members {
+            if let InterfaceMember::Attribute(Attribute::Regular(ref attribute)) = *member {
+                let name = self.builder.field_name(&attribute.name);
+                let type_ = self.convert_type(&*attribute.type_);
+                fields.push((name, type_));
+            } else {
+                panic!("Expected an attribute, got {:?}", member);
+            }
+        }
+        let name = self.builder.node_name(&interface.name);
+        let mut node = self.builder.add_interface(&name)
+            .expect("Name already present");
+        for (field_name, field_type) in fields.drain(..) {
+            node.with_field(&field_name, field_type);
+        }
+
+        for extended_attribute in &interface.extended_attributes {
+            use webidl::ast::ExtendedAttribute::NoArguments;
+            use webidl::ast::Other::Identifier;
+            if let &NoArguments(Identifier(ref id)) = extended_attribute.as_ref() {
+                if &*id == "Skippable" {
+                    node.with_skippable(true);
+                }
+            }
+        }
+    }
+    fn convert_type(&mut self, t: &Type) -> spec::Type {
+        let spec = match t.kind {
+            TypeKind::Boolean => spec::TypeSpec::Boolean,
+            TypeKind::Identifier(ref id) => {
+                let name = self.builder.node_name(id);
+                spec::TypeSpec::NamedType(name.clone())
+            }
+            TypeKind::DOMString => spec::TypeSpec::String,
+            TypeKind::Union(ref types) => {
+                let mut dest = Vec::with_capacity(types.len());
+                for typ in types {
+                    dest.push(self.convert_type(&*typ).spec)
+                }
+                spec::TypeSpec::TypeSum(TypeSum::new(dest))
+            }
+            TypeKind::FrozenArray(ref type_) => {
+                spec::TypeSpec::Array {
+                    contents: Box::new(self.convert_type(&*type_)),
+                    supports_empty: true
+                }
+            }
+            TypeKind::RestrictedDouble =>
+                spec::TypeSpec::Number,
+            _ => {
+                panic!("I don't know how to import {:?} yet", t);
+            }
+        };
+        if t.nullable {
+            spec.optional()
+                .unwrap_or_else(|| panic!("This type could not be made optional {:?}", t))
+        } else {
+            spec.required()
+        }
+    }
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/src/lib.rs
@@ -0,0 +1,22 @@
+//! This crate offers tools designed to aid with the implementation
+//! of the JavaScript syntax and BinAST encoders/decoders/manipulators.
+
+extern crate inflector;
+extern crate itertools;
+
+#[macro_use]
+extern crate log;
+extern crate webidl;
+
+
+/// Generic tools for generating implementations of the Syntax.
+pub mod export;
+
+/// Import a specification of the Syntax.
+pub mod import;
+
+/// Manipulating the specifications of the language.
+pub mod spec;
+
+/// Misc. utilities.
+pub mod util;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/src/spec.rs
@@ -0,0 +1,1020 @@
+//! Definition of a spec for a version (or subset) of JavaScript.
+
+pub use util::ToStr;
+
+use std;
+use std::cell::*;
+use std::collections::{ HashMap, HashSet };
+use std::fmt::{ Debug, Display };
+use std::hash::*;
+use std::rc::*;
+
+
+/// The name of an interface or enum.
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NodeName(Rc<String>);
+impl NodeName {
+    pub fn to_string(&self) -> &String {
+        self.0.as_ref()
+    }
+}
+impl Debug for NodeName {
+    fn fmt(&self, formatter: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+        Debug::fmt(self.to_str(), formatter)
+    }
+}
+impl Display for NodeName {
+    fn fmt(&self, formatter: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+        Display::fmt(self.to_str(), formatter)
+    }
+}
+impl ToStr for NodeName {
+    fn to_str(&self) -> &str {
+        &self.0
+    }
+}
+
+
+/// The name of a field in an interface.
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct FieldName(Rc<String>);
+impl FieldName {
+    pub fn to_string(&self) -> &String {
+        self.0.as_ref()
+    }
+}
+impl Debug for FieldName {
+    fn fmt(&self, formatter: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+        Debug::fmt(self.to_str(), formatter)
+    }
+}
+impl ToStr for FieldName {
+    fn to_str(&self) -> &str {
+        self.0.as_ref()
+    }
+}
+
+/// An enumeration of strings.
+///
+/// A valid value is any of these strings.
+#[derive(Debug)]
+pub struct StringEnum {
+    name: NodeName,
+    // Invariant: values are distinct // FIXME: Not checked yet.
+    values: Vec<String>,
+}
+
+/// An enumeration of interfaces.
+#[derive(Clone, Debug, PartialEq, Eq)] // FIXME: Get rid of Eq
+pub struct TypeSum {
+    types: Vec<TypeSpec>,
+    /// Once we have called `into_spec`, this is guaranteed to resolve
+    /// to at least one Interface.
+    interfaces: HashSet<NodeName>,
+}
+impl TypeSum {
+    pub fn new(types: Vec<TypeSpec>) -> Self {
+        TypeSum {
+            types,
+            interfaces: HashSet::new()
+        }
+    }
+    pub fn types(&self) -> &[TypeSpec] {
+        &self.types
+    }
+    pub fn types_mut(&mut self) -> &mut [TypeSpec] {
+        &mut self.types
+    }
+    pub fn interfaces(&self) -> &HashSet<NodeName> {
+        &self.interfaces
+    }
+    pub fn get_interface(&self, spec: &Spec, name: &NodeName) -> Option<Rc<Interface>> {
+        debug!(target: "spec", "get_interface, looking for {:?} in sum {:?}", name, self);
+        for item in &self.types {
+            let result = item.get_interface(spec, name);
+            if result.is_some() {
+                return result
+            }
+        }
+        None
+    }
+}
+
+/// Representation of a field in an interface.
+#[derive(Clone, PartialEq, Eq, Debug)]
+pub struct Field {
+    name: FieldName,
+    type_: Type,
+    documentation: Option<String>,
+}
+impl Hash for Field {
+    fn hash<H>(&self, state: &mut H) where H: Hasher {
+        self.name.hash(state)
+    }
+}
+impl Field {
+    pub fn new(name: FieldName, type_: Type) -> Self {
+        Field {
+            name,
+            type_,
+            documentation: None,
+        }
+    }
+    pub fn name(&self) -> &FieldName {
+        &self.name
+    }
+    pub fn type_(&self) -> &Type {
+        &self.type_
+    }
+    pub fn doc(&self) -> Option<&str> {
+        match self.documentation {
+            None => None,
+            Some(ref s) => Some(&*s)
+        }
+    }
+}
+
+/// The contents of a type, typically that of a field.
+///
+/// Note that we generally use `Type`, to represent
+/// the fact that some fields accept `null` while
+/// others do not.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum TypeSpec {
+    /// An array of values of the same type.
+    Array {
+        /// The type of values in the array.
+        contents: Box<Type>,
+
+        /// If `true`, the array may be empty.
+        supports_empty: bool,
+    },
+
+    NamedType(NodeName),
+
+    TypeSum(TypeSum),
+
+    /// A boolean.
+    Boolean,
+
+    /// A string.
+    String,
+
+    /// A number, as per JavaScript specifications.
+    Number,
+
+    /// A number of bytes in the binary file.
+    ///
+    /// This spec is used only internally, as a hidden
+    /// field injected by deanonymization, to represent
+    /// Skippable nodes.
+    Offset,
+
+    /// Nothing.
+    ///
+    /// For the moment, this spec is used only internally.
+    Void,
+}
+
+#[derive(Clone, Debug)]
+pub enum NamedType {
+    Interface(Rc<Interface>),
+    Typedef(Rc<Type>), // FIXME: Check that there are no cycles.
+    StringEnum(Rc<StringEnum>),
+}
+
+impl NamedType {
+    pub fn as_interface(&self, spec: &Spec) -> Option<Rc<Interface>> {
+        match *self {
+            NamedType::Interface(ref result) => Some(result.clone()),
+            NamedType::Typedef(ref type_) => {
+                if let TypeSpec::NamedType(ref named) = *type_.spec() {
+                    let named = spec.get_type_by_name(named)
+                        .expect("Type not found");
+                    named.as_interface(spec)
+                } else {
+                    None
+                }
+            }
+            NamedType::StringEnum(_) => None,
+        }
+    }
+}
+
+impl TypeSpec {
+    pub fn array(self) -> Type {
+        TypeSpec::Array {
+            contents: Box::new(Type {
+                spec: self,
+                or_null: false
+            }),
+            supports_empty: true,
+        }.required()
+    }
+
+    pub fn non_empty_array(self) -> Type {
+        TypeSpec::Array {
+            contents: Box::new(Type {
+                spec: self,
+                or_null: false,
+            }),
+            supports_empty: false,
+        }.required()
+    }
+
+    pub fn optional(self) -> Option<Type> {
+        if let TypeSpec::Offset = self {
+            None
+        }  else {
+            Some(Type {
+                spec: self,
+                or_null: true
+            })
+        }
+    }
+
+    pub fn required(self) -> Type {
+        Type {
+            spec: self,
+            or_null: false
+        }
+    }
+
+    fn typespecs<'a>(&'a self) -> Vec<&'a TypeSpec> {
+        let mut result = Vec::new();
+        let mut stack = vec![self];
+        while let Some(current) = stack.pop() {
+            result.push(current);
+            match *current {
+                TypeSpec::Array { ref contents, .. } => {
+                    stack.push(contents.spec());
+                }
+                TypeSpec::TypeSum(ref sum) => {
+                    for item in sum.types() {
+                        stack.push(item)
+                    }
+                }
+                _ => {}
+            }
+        }
+        result
+    }
+
+    pub fn typenames<'a>(&'a self) -> HashSet<&'a NodeName> {
+        let mut result = HashSet::new();
+        for spec in self.typespecs() {
+            if let TypeSpec::NamedType(ref name) = *spec {
+                result.insert(name);
+            }
+        }
+        result
+    }
+
+    pub fn get_primitive(&self, spec: &Spec) -> Option<IsNullable<Primitive>> {
+        match *self {
+            TypeSpec::Boolean => Some(IsNullable::non_nullable(Primitive::Boolean)),
+            TypeSpec::Void => Some(IsNullable::non_nullable(Primitive::Void)),
+            TypeSpec::Number => Some(IsNullable::non_nullable(Primitive::Number)),
+            TypeSpec::String => Some(IsNullable::non_nullable(Primitive::String)),
+            TypeSpec::Offset => Some(IsNullable::non_nullable(Primitive::Offset)),
+            TypeSpec::NamedType(ref name) => {
+                match spec.get_type_by_name(name).unwrap() {
+                    NamedType::Interface(ref interface) =>
+                        Some(IsNullable::non_nullable(Primitive::Interface(interface.clone()))),
+                    NamedType::Typedef(ref type_) =>
+                        type_.get_primitive(spec),
+                    NamedType::StringEnum(_) => None
+                }
+            }
+            _ => None
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct IsNullable<T> {
+    pub is_nullable: bool,
+    pub content: T,
+}
+impl<T> IsNullable<T> {
+    fn non_nullable(value: T) -> Self {
+        IsNullable {
+            is_nullable: false,
+            content: value
+        }
+    }
+}
+
+#[derive(Debug)]
+pub enum Primitive {
+    String,
+    Boolean,
+    Void,
+    Number,
+    Offset,
+    Interface(Rc<Interface>),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Type {
+    pub spec: TypeSpec,
+    or_null: bool,
+}
+impl Eq for Type {}
+
+impl Type {
+    pub fn or_null(&mut self) -> &mut Self {
+        self.or_null = true;
+        self
+    }
+
+    pub fn with_spec(&mut self, spec: TypeSpec) -> &mut Self {
+        self.spec = spec;
+        self
+    }
+
+    pub fn with_type(&mut self, type_: Type) -> &mut Self {
+        self.spec = type_.spec;
+        self.or_null = type_.or_null;
+        self
+    }
+
+    pub fn spec(&self) -> &TypeSpec {
+        &self.spec
+    }
+    pub fn spec_mut(&mut self) -> &mut TypeSpec {
+        &mut self.spec
+    }
+    pub fn is_optional(&self) -> bool {
+        self.or_null
+    }
+
+    /// Shorthand constructors.
+    pub fn named(name: &NodeName) -> TypeSpec {
+        TypeSpec::NamedType(name.clone())
+    }
+    pub fn sum(types: &[TypeSpec]) -> TypeSpec {
+        let specs = types.iter()
+            .cloned()
+            .collect();
+        TypeSpec::TypeSum(TypeSum::new(specs))
+    }
+    pub fn string() -> TypeSpec {
+        TypeSpec::String
+    }
+    pub fn number() -> TypeSpec {
+        TypeSpec::Number
+    }
+    pub fn bool() -> TypeSpec {
+        TypeSpec::Boolean
+    }
+    pub fn void() -> TypeSpec {
+        TypeSpec::Void
+    }
+
+    /// An `offset` type, holding a number of bytes in the binary file.
+    pub fn offset() -> TypeSpec {
+        TypeSpec::Offset
+    }
+
+    pub fn array(self) -> TypeSpec {
+        TypeSpec::Array {
+            contents: Box::new(self),
+            supports_empty: true,
+        }
+    }
+
+    pub fn non_empty_array(self) -> TypeSpec {
+        TypeSpec::Array {
+            contents: Box::new(self),
+            supports_empty: false,
+        }
+    }
+
+    pub fn get_primitive(&self, spec: &Spec) -> Option<IsNullable<Primitive>> {
+        if let Some(mut primitive) = self.spec.get_primitive(spec) {
+            primitive.is_nullable = primitive.is_nullable || self.or_null;
+            Some(primitive)
+        } else {
+            None
+        }
+    }
+}
+
+/// Representation of an object, i.e. a set of fields.
+///
+/// Field order is *not* specified, but is expected to remain stable during encoding
+/// operations and during decoding operations. Note in particular that the order may
+/// change between encoding and decoding.
+#[derive(Clone, Debug)]
+pub struct Obj {
+    fields: Vec<Field>,
+}
+impl PartialEq for Obj {
+    fn eq(&self, other: &Self) -> bool {
+        // Normalize order before comparing.
+        let me : HashSet<_> = self.fields.iter().collect();
+        let other : HashSet<_> = other.fields.iter().collect();
+        me == other
+    }
+}
+impl Eq for Obj {}
+
+impl Obj {
+    /// Create a new empty structure
+    pub fn new() -> Self {
+        Obj {
+            fields: Vec::new()
+        }
+    }
+    /// A list of the fields in the structure.
+    pub fn fields<'a>(&'a self) -> &'a [Field] {
+        &self.fields
+    }
+    /// Fetch a specific field in the structure
+    pub fn field<'a>(&'a self, name: &FieldName) -> Option<&'a Field> {
+        self.fields.iter().find(|field| &field.name == name)
+    }
+
+    pub fn with_full_field(&mut self, field: Field) -> &mut Self {
+        if self.field(field.name()).is_some() {
+            warn!("Field: attempting to overwrite {:?}", field.name());
+            return self
+        }
+        self.fields.push(field);
+        self
+    }
+
+    fn with_field_aux(self, name: &FieldName, type_: Type, doc: Option<&str>) -> Self {
+        if self.field(name).is_some() {
+            warn!("Field: attempting to overwrite {:?}", name);
+            return self
+        }
+        let mut fields = self.fields;
+        fields.push(Field {
+            name: name.clone(),
+            type_,
+            documentation: doc.map(str::to_string),
+        });
+        Obj {
+            fields
+        }
+
+    }
+
+    /// Extend a structure with a field.
+    pub fn with_field(self, name: &FieldName, type_: Type) -> Self {
+        self.with_field_aux(name, type_, None)
+    }
+
+    pub fn with_field_doc(self, name: &FieldName, type_: Type, doc: &str) -> Self {
+        self.with_field_aux(name, type_, Some(doc))
+    }
+}
+
+impl StringEnum {
+    pub fn name(&self) -> &NodeName {
+        &self.name
+    }
+
+    pub fn strings(&self) -> &[String] {
+        &self.values
+    }
+
+    /// Add a string to the enum. Idempotent.
+    pub fn with_string(&mut self, string: &str) -> &mut Self {
+        let string = string.to_string();
+        if self.values.iter().find(|x| **x == string).is_none() {
+            self.values.push(string.to_string())
+        }
+        self
+    }
+    /// Add several enums to the list. Idempotent.
+    pub fn with_strings(&mut self, strings: &[&str]) -> &mut Self {
+        for string in strings {
+            self.with_string(string);
+        }
+        self
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct InterfaceDeclaration {
+    /// The name of the interface, e.g. `Node`.
+    name: NodeName,
+
+    /// The contents of this interface, excluding the contents of parent interfaces.
+    contents: Obj,
+
+    /// If `true`, objects of this interface may be skipped during parsing.
+    is_skippable: bool,
+}
+
+impl InterfaceDeclaration {
+    pub fn with_full_field(&mut self, contents: Field) -> &mut Self {
+        let _ = self.contents.with_full_field(contents);
+        self
+    }
+    pub fn with_field(&mut self, name: &FieldName, type_: Type) -> &mut Self {
+        self.with_field_aux(name, type_, None)
+    }
+    pub fn with_field_doc(&mut self, name: &FieldName, type_: Type, doc: &str) -> &mut Self {
+        self.with_field_aux(name, type_, Some(doc))
+    }
+    fn with_field_aux(&mut self, name: &FieldName, type_: Type, doc: Option<&str>) -> &mut Self {
+        let mut contents = Obj::new();
+        std::mem::swap(&mut self.contents, &mut contents);
+        self.contents = contents.with_field_aux(name, type_, doc);
+        self
+    }
+    pub fn with_skippable(&mut self, value: bool) -> &mut Self {
+        self.is_skippable = value;
+        self
+    }
+    pub fn is_skippable(&self) -> bool {
+        self.is_skippable
+    }
+}
+
+/// A data structure used to progressively construct the `Spec`.
+pub struct SpecBuilder {
+    /// All the interfaces entered so far.
+    interfaces_by_name: HashMap<NodeName, RefCell<InterfaceDeclaration>>,
+
+    /// All the enums entered so far.
+    string_enums_by_name: HashMap<NodeName, RefCell<StringEnum>>,
+
+    typedefs_by_name: HashMap<NodeName, RefCell<Type>>,
+
+    names: HashMap<String, Rc<String>>,
+}
+
+impl SpecBuilder {
+    pub fn new() -> Self {
+        SpecBuilder {
+            interfaces_by_name: HashMap::new(),
+            string_enums_by_name: HashMap::new(),
+            typedefs_by_name: HashMap::new(),
+            names: HashMap::new()
+        }
+    }
+
+    pub fn names(&self) -> &HashMap<String, Rc<String>> {
+        &self.names
+    }
+
+    /// Return an `NodeName` for a name. Equality comparison
+    /// on `NodeName` can be performed by checking physical
+    /// equality.
+    pub fn node_name(&mut self, name: &str) -> NodeName {
+        if let Some(result) = self.names.get(name) {
+            return NodeName(result.clone())
+        }
+        let shared = Rc::new(name.to_string());
+        let result = NodeName(shared.clone());
+        self.names.insert(name.to_string(), shared);
+        result
+    }
+    pub fn get_node_name(&self, name: &str) -> Option<NodeName> {
+        self.names.get(name)
+            .map(|hit| NodeName(hit.clone()))
+    }
+    pub fn import_node_name(&mut self, node_name: &NodeName) {
+        self.names.insert(node_name.to_string().clone(), node_name.0.clone());
+    }
+
+    pub fn field_name(&mut self, name: &str) -> FieldName {
+        if let Some(result) = self.names.get(name) {
+            return FieldName(result.clone());
+        }
+        let shared = Rc::new(name.to_string());
+        let result = FieldName(shared.clone());
+        self.names.insert(name.to_string(), shared);
+        result
+    }
+    pub fn import_field_name(&mut self, field_name: &FieldName) {
+        self.names.insert(field_name.to_string().clone(), field_name.0.clone());
+    }
+
+    pub fn add_interface(&mut self, name: &NodeName) -> Option<RefMut<InterfaceDeclaration>> {
+        if self.interfaces_by_name.get(name).is_some() {
+            return None;
+        }
+        let result = RefCell::new(InterfaceDeclaration {
+            name: name.clone(),
+            contents: Obj::new(),
+            is_skippable: false,
+        });
+        self.interfaces_by_name.insert(name.clone(), result);
+        self.interfaces_by_name.get(name)
+            .map(RefCell::borrow_mut)
+    }
+    pub fn get_interface(&mut self, name: &NodeName) -> Option<RefMut<InterfaceDeclaration>> {
+        self.interfaces_by_name.get(name)
+            .map(RefCell::borrow_mut)
+    }
+
+    /// Add a named enumeration.
+    pub fn add_string_enum(&mut self, name: &NodeName) -> Option<RefMut<StringEnum>> {
+        if self.string_enums_by_name.get(name).is_some() {
+            return None;
+        }
+        let e = RefCell::new(StringEnum {
+            name: name.clone(),
+            values: vec![]
+        });
+        self.string_enums_by_name.insert(name.clone(), e);
+        self.string_enums_by_name.get(name).map(RefCell::borrow_mut)
+    }
+
+    pub fn add_typedef(&mut self, name: &NodeName) -> Option<RefMut<Type>> {
+        if self.typedefs_by_name.get(name).is_some() {
+            return None;
+        }
+        let e = RefCell::new(TypeSpec::Void.required());
+        self.typedefs_by_name.insert(name.clone(), e);
+        self.typedefs_by_name.get(name).map(RefCell::borrow_mut)
+    }
+
+    pub fn get_typedef(&self, name: &NodeName) -> Option<Ref<Type>> {
+        self.typedefs_by_name.get(name).
+            map(RefCell::borrow)
+    }
+
+    /// Generate the graph.
+    pub fn into_spec<'a>(self, options: SpecOptions<'a>) -> Spec {
+        // 1. Collect node names.
+        let mut interfaces_by_name = self.interfaces_by_name;
+        let interfaces_by_name : HashMap<_, _> = interfaces_by_name.drain()
+            .map(|(k, v)| (k, Rc::new(Interface {
+                declaration: RefCell::into_inner(v)
+            })))
+            .collect();
+        let mut string_enums_by_name = self.string_enums_by_name;
+        let string_enums_by_name : HashMap<_, _> = string_enums_by_name.drain()
+            .map(|(k, v)| (k, Rc::new(RefCell::into_inner(v))))
+            .collect();
+        let mut typedefs_by_name = self.typedefs_by_name;
+        let typedefs_by_name : HashMap<_, _> = typedefs_by_name.drain()
+            .map(|(k, v)| (k, Rc::new(RefCell::into_inner(v))))
+            .collect();
+
+        let mut node_names = HashMap::new();
+        for name in interfaces_by_name.keys().chain(string_enums_by_name.keys()).chain(typedefs_by_name.keys()) {
+            node_names.insert(name.to_string().clone(), name.clone());
+        }
+
+        // 2. Collect all field names.
+        let mut fields = HashMap::new();
+        for interface in interfaces_by_name.values() {
+            for field in &interface.declaration.contents.fields {
+                fields.insert(field.name.to_string().clone(), field.name.clone());
+            }
+        }
+
+        let mut resolved_type_sums_by_name : HashMap<NodeName, HashSet<NodeName>> = HashMap::new();
+        {
+            // 3. Check that node names are used but not duplicated.
+            for name in node_names.values() {
+                let mut instances = 0;
+                if interfaces_by_name.contains_key(name) {
+                    instances += 1;
+                }
+                if string_enums_by_name.contains_key(name) {
+                    instances += 1;
+                }
+                if typedefs_by_name.contains_key(name) {
+                    instances += 1;
+                }
+                assert!(instances > 0, "Type name {} is never used", name.to_str());
+                assert_eq!(instances, 1, "Duplicate type name {}", name.to_str());
+            }
+
+            // 4. Check that all instances of `TypeSpec::NamedType` refer to an existing name.
+            let mut used_typenames = HashSet::new();
+            for type_ in typedefs_by_name.values() {
+                for name in type_.spec().typenames() {
+                    used_typenames.insert(name);
+                }
+            }
+            for interface in interfaces_by_name.values() {
+                for field in interface.declaration.contents.fields() {
+                    for name in field.type_().spec().typenames() {
+                        used_typenames.insert(name);
+                    }
+                }
+            }
+            for name in &used_typenames {
+                if typedefs_by_name.contains_key(name) {
+                    continue;
+                }
+                if interfaces_by_name.contains_key(name) {
+                    continue;
+                }
+                if string_enums_by_name.contains_key(name) {
+                    continue;
+                }
+                panic!("No definition for type {}", name.to_str());
+            }
+
+            #[derive(Clone, Debug)]
+            enum TypeClassification {
+                SumOfInterfaces(HashSet<NodeName>),
+                Array,
+                Primitive,
+                StringEnum,
+                Optional,
+            }
+
+            // 5. Classify typedefs between
+            // - stuff that can only be put in a sum of interfaces (interfaces, sums of interfaces, typedefs thereof);
+            // - stuff that can never be put in a sum of interfaces (other stuff)
+            // - bad stuff that attempts to mix both
+
+            // name => unbound if we haven't seen the name yet
+            //      => `None` if we are currently classifying (used to detect cycles),
+            //      => `Some(SumOfInterfaces(set))` if the name describes a sum of interfaces
+            //      => `Some(BadForSumOfInterfaces)` if the name describes something that can't be summed with an interface
+            let mut classification : HashMap<NodeName, Option<TypeClassification>> = HashMap::new();
+            fn classify_type(typedefs_by_name: &HashMap<NodeName, Rc<Type>>,
+                string_enums_by_name: &HashMap<NodeName, Rc<StringEnum>>,
+                interfaces_by_name: &HashMap<NodeName, Rc<Interface>>,
+                cache: &mut HashMap<NodeName, Option<TypeClassification>>, type_: &TypeSpec, name: &NodeName) -> TypeClassification
+            {
+                debug!(target: "spec", "classify_type for {:?}: walking {:?}", name, type_);
+                match *type_ {
+                    TypeSpec::Array { ref contents, .. } => {
+                        // Check that the contents are correct.
+                        let _ = classify_type(typedefs_by_name, string_enums_by_name, interfaces_by_name, cache, contents.spec(), name);
+                        // Regardless, the result is bad for a sum of interfaces.
+                        debug!(target: "spec", "classify_type => don't put me in an interface");
+                        TypeClassification::Array
+                    },
+                    TypeSpec::Boolean | TypeSpec::Number | TypeSpec::String | TypeSpec::Void | TypeSpec::Offset => {
+                        debug!(target: "spec", "classify_type => don't put me in an interface");
+                        TypeClassification::Primitive
+                    }
+                    TypeSpec::NamedType(ref name) => {
+                        if let Some(fetch) = cache.get(name) {
+                            if let Some(ref result) = *fetch {
+                                debug!(target: "spec", "classify_type {:?} => (cached) {:?}", name, result);
+                                return result.clone();
+                            } else {
+                                panic!("Cycle detected while examining {}", name.to_str());
+                            }
+                        }
+                        // Start lookup for this name.
+                        cache.insert(name.clone(), None);
+                        let result = if interfaces_by_name.contains_key(name) {
+                            let mut names = HashSet::new();
+                            names.insert(name.clone());
+                            TypeClassification::SumOfInterfaces(names)
+                        } else if string_enums_by_name.contains_key(name) {
+                            TypeClassification::StringEnum
+                        } else {
+                            let type_ = typedefs_by_name.get(name)
+                                .unwrap(); // Completeness checked abover in this method.
+                            classify_type(typedefs_by_name, string_enums_by_name, interfaces_by_name, cache, type_.spec(), name)
+                        };
+                        debug!(target: "spec", "classify_type {:?} => (inserting in cache) {:?}", name, result);
+                        cache.insert(name.clone(), Some(result.clone()));
+                        result
+                    }
+                    TypeSpec::TypeSum(ref sum) => {
+                        let mut names = HashSet::new();
+                        for type_ in sum.types() {
+                            match classify_type(typedefs_by_name, string_enums_by_name, interfaces_by_name, cache, type_, name) {
+                                TypeClassification::SumOfInterfaces(sum) => {
+                                    names.extend(sum);
+                                }
+                                class =>
+                                    panic!("In type {name}, there is a non-interface type {class:?} ({type_:?}) in a sum {sum:?}",
+                                        name = name.to_str(),
+                                        class = class,
+                                        sum = sum,
+                                        type_ = type_),
+                            }
+                        }
+                        debug!(target: "spec", "classify_type => built sum {:?}", names);
+                        TypeClassification::SumOfInterfaces(names)
+                    }
+                }
+            }
+            for (name, type_) in &typedefs_by_name {
+                classification.insert(name.clone(), None);
+                let class = classify_type(&typedefs_by_name, &string_enums_by_name, &interfaces_by_name, &mut classification, type_.spec(), name);
+                if !type_.is_optional() {
+                    classification.insert(name.clone(), Some(class));
+                } else {
+                    // FIXME: That looks weird.
+                    classification.insert(name.clone(), Some(TypeClassification::Optional));
+                }
+            }
+
+            // 6. Using this classification, check that the attributes of interfaces don't mix
+            // poorly items of both kinds.
+            for (name, interface) in &interfaces_by_name {
+                for field in interface.declaration.contents.fields() {
+                    classify_type(&typedefs_by_name, &string_enums_by_name, &interfaces_by_name, &mut classification, field.type_().spec(), name);
+                }
+            }
+
+            // 7. Fill resolved_type_sums_by_name, for later use.
+            for (name, class) in classification.drain() {
+                if !typedefs_by_name.contains_key(&name) {
+                    continue;
+                }
+                if let Some(TypeClassification::SumOfInterfaces(sum)) = class {
+                    resolved_type_sums_by_name.insert(name, sum);
+                }
+            }
+        }
+
+        let spec = Spec {
+            interfaces_by_name,
+            string_enums_by_name,
+            typedefs_by_name,
+            resolved_type_sums_by_name,
+            node_names,
+            fields,
+            root: options.root.clone(),
+            null: options.null.clone(),
+        };
+
+        spec
+    }
+}
+
+/// Representation of an interface in a grammar declaration.
+///
+/// Interfaces represent nodes in the AST. Each interface
+/// has a name, a type, defines properties (also known as
+/// `attribute` in webidl) which hold values. Interfaces
+/// may also have meta-properties, such as their skippability.
+#[derive(Debug)]
+pub struct Interface {
+    declaration: InterfaceDeclaration,
+}
+
+impl Interface {
+    /// Returns the full list of fields for this structure.
+    /// This method is in charge of:
+    /// - ensuring that the fields of parent structures are properly accounted for;
+    /// - disregarding ignored fields (i.e. `position`, `type`);
+    /// - disregarding fields with a single possible value.
+    pub fn contents(&self) -> &Obj {
+        &self.declaration.contents
+    }
+
+    /// Returns the name of the interface.
+    pub fn name(&self) -> &NodeName {
+        &self.declaration.name
+    }
+
+    /// Returns a type specification for this interface.
+    ///
+    /// The result is a `NamedType` with this interface's name.
+    pub fn spec(&self) -> TypeSpec {
+        TypeSpec::NamedType(self.name().clone())
+    }
+
+    pub fn type_(&self) -> Type {
+        self.spec().required()
+    }
+
+    pub fn get_field_by_name(&self, name: &FieldName) -> Option<&Field> {
+        for field in self.contents().fields() {
+            if name == field.name() {
+                return Some(field)
+            }
+        }
+        None
+    }
+
+    /// `true` if parsers should have the ability to skip instances of this
+    /// interface.
+    pub fn is_skippable(&self) -> bool {
+        self.declaration.is_skippable
+    }
+}
+
+/// Immutable representation of the spec.
+pub struct Spec {
+    interfaces_by_name: HashMap<NodeName, Rc<Interface>>,
+    string_enums_by_name: HashMap<NodeName, Rc<StringEnum>>,
+    typedefs_by_name: HashMap<NodeName, Rc<Type>>,
+
+    resolved_type_sums_by_name: HashMap<NodeName, HashSet<NodeName>>,
+
+    node_names: HashMap<String, NodeName>,
+    fields: HashMap<String, FieldName>,
+    root: NodeName,
+    null: NodeName,
+}
+
+impl Spec {
+    pub fn get_interface_by_name(&self, name: &NodeName) -> Option<&Interface> {
+        self.interfaces_by_name.get(name)
+            .map(std::borrow::Borrow::borrow)
+    }
+    pub fn interfaces_by_name(&self) -> &HashMap<NodeName, Rc<Interface>> {
+        &self.interfaces_by_name
+    }
+    pub fn string_enums_by_name(&self) -> &HashMap<NodeName, Rc<StringEnum>> {
+        &self.string_enums_by_name
+    }
+    pub fn typedefs_by_name(&self) -> &HashMap<NodeName, Rc<Type>> {
+        &self.typedefs_by_name
+    }
+    pub fn resolved_sums_of_interfaces_by_name(&self) -> &HashMap<NodeName, HashSet<NodeName>> {
+        &self.resolved_type_sums_by_name
+    }
+
+    pub fn get_type_by_name(&self, name: &NodeName) -> Option<NamedType> {
+        if let Some(interface) = self.interfaces_by_name
+            .get(name) {
+            return Some(NamedType::Interface(interface.clone()))
+        }
+        if let Some(strings_enum) = self.string_enums_by_name
+            .get(name) {
+            return Some(NamedType::StringEnum(strings_enum.clone()))
+        }
+        if let Some(type_) = self.typedefs_by_name
+            .get(name) {
+            return Some(NamedType::Typedef(type_.clone()))
+        }
+        None
+    }
+    pub fn get_field_name(&self, name: &str) -> Option<&FieldName> {
+        self.fields
+            .get(name)
+    }
+    pub fn get_node_name(&self, name: &str) -> Option<&NodeName> {
+        self.node_names
+            .get(name)
+    }
+    pub fn node_names(&self) -> &HashMap<String, NodeName> {
+        &self.node_names
+    }
+    pub fn field_names(&self) -> &HashMap<String, FieldName> {
+        &self.fields
+    }
+    pub fn get_root_name(&self) -> &NodeName {
+        &self.root
+    }
+    pub fn get_null_name(&self) -> &NodeName {
+        &self.null
+    }
+
+    /// The starting point for parsing.
+    pub fn get_root(&self) -> NamedType {
+        self.get_type_by_name(&self.root)
+            .unwrap()
+    }
+}
+
+/// Informations passed during the creation of a `Spec` object.
+pub struct SpecOptions<'a> {
+    /// The name of the node used to start encoding.
+    pub root: &'a NodeName,
+    pub null: &'a NodeName,
+}
+
+pub trait HasInterfaces {
+    fn get_interface(&self, spec: &Spec, name: &NodeName) -> Option<Rc<Interface>>;
+}
+
+impl HasInterfaces for NamedType {
+    fn get_interface(&self, spec: &Spec, name: &NodeName) -> Option<Rc<Interface>> {
+        debug!(target: "spec", "get_interface, looking for {:?} in named type {:?}", name, self);
+        match *self {
+            NamedType::Interface(_) => None,
+            NamedType::StringEnum(_) => None,
+            NamedType::Typedef(ref type_) =>
+                type_.spec().get_interface(spec, name)
+        }
+    }
+}
+
+impl HasInterfaces for TypeSpec {
+    fn get_interface(&self, spec: &Spec, name: &NodeName) -> Option<Rc<Interface>> {
+        debug!(target: "spec", "get_interface, looking for {:?} in spec {:?}", name, self);
+        match *self {
+            TypeSpec::NamedType(ref my_name) => {
+                let follow = spec.get_type_by_name(my_name);
+                if let Some(follow) = follow {
+                    if name == my_name {
+                        follow.as_interface(spec)
+                    } else {
+                        follow.get_interface(spec, name)
+                    }
+                } else {
+                    None
+                }
+            },
+            TypeSpec::TypeSum(ref sum) =>
+                sum.get_interface(spec, name),
+            _ => None
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/binjs_meta/src/util.rs
@@ -0,0 +1,498 @@
+//! Miscellaneous utilities.
+
+extern crate inflector;
+
+pub trait ToStr {
+    /// Return the value as a `str`.
+    fn to_str(&self) -> &str;
+    fn newline(&self) -> String {
+        format!("{}\n", self.to_str())
+    }
+}
+
+impl<'a> ToStr for &'a str {
+    fn to_str(&self) -> &str {
+        *self
+    }
+}
+
+impl ToStr for str {
+    fn to_str(&self) -> &str {
+        self
+    }
+}
+
+impl ToStr for String {
+    fn to_str(&self) -> &str {
+        &self
+    }
+}
+
+/// A string or string-like construction that can be
+/// converted to upper case, lower case, class case, etc
+pub trait ToCases: ToStr {
+    /// Return the value in class case, e.g.
+    ///
+    /// ```
+    /// use binjs_meta::util::ToCases;
+    ///
+    /// assert_eq!(&"foo_bar".to_class_cases(), "FooBar");
+    /// assert_eq!(&"fooBars".to_class_cases(), "FooBars");
+    /// ```
+    fn to_class_cases(&self) -> String {
+        self.to_str().to_class_cases()
+    }
+
+    /// Return the value in a format suitable for use as a cpp `enum`
+    /// variants.
+    ///
+    /// ```
+    /// use binjs_meta::util::ToCases;
+    ///
+    /// assert_eq!(&"foo_bar".to_cpp_enum_case(), "FooBar");
+    /// assert_eq!(&"fooBars".to_cpp_enum_case(), "FooBars");
+    /// assert_eq!(&"+=".to_cpp_enum_case(), "PlusAssign");
+    /// ```
+    fn to_cpp_enum_case(&self) -> String {
+        self.to_str().to_cpp_enum_case()
+    }
+
+    /// Return the value in a format suitable for use as a C++ field name
+    /// or identifier.
+    ///
+    /// ```
+    /// use binjs_meta::util::ToCases;
+    ///
+    /// assert_eq!(&"foo_bar".to_cpp_field_case(), "fooBar");
+    /// assert_eq!(&"fooBars".to_cpp_field_case(), "fooBars");
+    /// assert_eq!(&"class".to_cpp_field_case(), "class_");
+    /// ```
+    fn to_cpp_field_case(&self) -> String {
+        self.to_str().to_cpp_field_case()
+    }
+
+    /// Return the value in a format suitable for use as a Rust field name
+    /// or identifier.
+    ///
+    /// ```
+    /// use binjs_meta::util::ToCases;
+    ///
+    /// assert_eq!(&"foo_bar".to_rust_identifier_case(), "foo_bar");
+    /// assert_eq!(&"fooBars".to_rust_identifier_case(), "foo_bars");
+    /// assert_eq!(&"self".to_rust_identifier_case(), "self_");
+    /// ```
+    fn to_rust_identifier_case(&self) -> String {
+        self.to_str().to_rust_identifier_case()
+    }
+}
+
+impl<T> ToCases for T where T: ToStr {
+    fn to_class_cases(&self) -> String {
+        match self.to_str() {
+            "" => "Null".to_string(),
+            other => {
+                let result = inflector::cases::pascalcase::to_pascal_case(other);
+                assert!(result.to_str().len() != 0, "Could not convert '{}' to class case", other );
+                result
+            }
+        }
+    }
+    fn to_cpp_enum_case(&self) -> String {
+        match self.to_str() {
+            "+=" => "PlusAssign".to_string(),
+            "-=" => "MinusAssign".to_string(),
+            "*=" => "MulAssign".to_string(),
+            "/=" => "DivAssign".to_string(),
+            "%=" => "ModAssign".to_string(),
+            "**=" => "PowAssign".to_string(),
+            "<<=" => "LshAssign".to_string(),
+            ">>=" => "RshAssign".to_string(),
+            ">>>=" => "UrshAssign".to_string(),
+            "|=" => "BitOrAssign".to_string(),
+            "^=" => "BitXorAssign".to_string(),
+            "&=" => "BitAndAssign".to_string(),
+            "," => "Comma".to_string(),
+            "||" => "LogicalOr".to_string(),
+            "&&" => "LogicalAnd".to_string(),
+            "|" => "BitOr".to_string(),
+            "^" => "BitXor".to_string(),
+            "&" => "BitAnd".to_string(),
+            "==" => "Eq".to_string(),
+            "!=" => "Neq".to_string(),
+            "===" => "StrictEq".to_string(),
+            "!==" => "StrictNeq".to_string(),
+            "<" => "LessThan".to_string(),
+            "<=" => "LeqThan".to_string(),
+            ">" => "GreaterThan".to_string(),
+            ">=" => "GeqThan".to_string(),
+            "<<" => "Lsh".to_string(),
+            ">>" => "Rsh".to_string(),
+            ">>>" => "Ursh".to_string(),
+            "+" => "Plus".to_string(),
+            "-" => "Minus".to_string(),
+            "~" => "BitNot".to_string(),
+            "*" => "Mul".to_string(),
+            "/" => "Div".to_string(),
+            "%" => "Mod".to_string(),
+            "**" => "Pow".to_string(),
+            "!" => "Not".to_string(),
+            "++" => "Incr".to_string(),
+            "--" => "Decr".to_string(),
+            "" => "_Null".to_string(),
+            _ => {
+                let class_cased = self.to_class_cases();
+                assert!(&class_cased != "", "FIXME: `to_class_cases` does not handle {} yet", self.to_str());
+                class_cased
+            }
+        }
+    }
+    fn to_cpp_field_case(&self) -> String {
+        let snake = inflector::cases::camelcase::to_camel_case(self.to_str());
+        match &snake as &str {
+            "class" => "class_".to_string(),
+            "operator" => "operator_".to_string(),
+            "const" => "const_".to_string(),
+            "void" => "void_".to_string(),
+            "delete" => "delete_".to_string(),
+            "in" => "in_".to_string(),
+            // Names reserved by us
+            "result" => "result_".to_string(),
+            "kind" => "kind_".to_string(),
+            // Special cases
+            "" => unimplemented!("FIXME: `to_cpp_field_case` does not handle {} yet", self.to_str()),
+            _ => snake
+        }
+    }
+    fn to_rust_identifier_case(&self) -> String {
+        let snake = inflector::cases::snakecase::to_snake_case(self.to_str());
+        match &snake as &str {
+            "self" => "self_".to_string(),
+            "super" => "super_".to_string(),
+            "type" => "type_".to_string(),
+            "" if self.to_str() == "" => "null".to_string(),
+            "" => unimplemented!("FIXME: `to_rust_identifier_case` does not handle {} yet", self.to_str()),
+            _ => snake
+        }
+    }
+}
+
+/// A string or string-like construction that can be reindented.
+pub trait Reindentable {
+    /// Remove leading whitespace, replace it with `prefix`.
+    ///
+    /// If `self` spans more than one line, the leading whitespace
+    /// is computed from the first line and extracted from all lines
+    /// and `prefix` is added to all lines.
+    ///
+    /// ```
+    /// use binjs_meta::util::Reindentable;
+    ///
+    /// assert_eq!(&"abc".reindent("   "), "   abc");
+    /// assert_eq!(&" def".reindent("   "), "   def");
+    /// assert_eq!(&"  ghi".reindent("   "), "   ghi");
+    /// assert_eq!(&" jkl\n    mno".reindent("   "), "   jkl\n      mno");
+    /// ```
+    fn reindent(&self, prefix: &str) -> String;
+
+    /// Remove leading whitespace, replace it with `prefix`,
+    /// ensure that the text fits within `width` columns.
+    ///
+    /// If `self` spans more than one line, the leading whitespace
+    /// is computed from the first line and extracted from all lines.
+    /// and `prefix` is added to all lines.
+    ///
+    /// If the result goes past `width` columns, `self` is split
+    /// into several lines to try and fit within `width` columns.
+    ///
+    /// ```
+    /// use binjs_meta::util::Reindentable;
+    ///
+    /// assert_eq!(&"abc".fit("// ", 30), "// abc");
+    /// assert_eq!(&" def".fit("// ", 30), "// def");
+    /// assert_eq!(&"  ghi".fit("// ", 30), "// ghi");
+    /// assert_eq!(&" jkl\n    mno".fit("// ", 30), "// jkl\n//    mno");
+    /// assert_eq!(&"abc def ghi".fit("// ", 8), "// abc\n// def\n// ghi");
+    /// assert_eq!(&"abc def ghi".fit("// ", 5), "// abc\n// def\n// ghi");
+    /// ```
+    fn fit(&self, prefix: &str, width: usize) -> String;
+}
+
+impl<T> Reindentable for T where T: ToStr {
+    fn reindent(&self, prefix: &str) -> String {
+        use itertools::Itertools;
+
+        let str = self.to_str();
+
+        // Determine the number of whitespace chars on the first line.
+        // Trim that many whitespace chars on the following lines.
+        if let Some(first_line) = str.lines().next() {
+            let indent_len = first_line.chars()
+                .take_while(|c| char::is_whitespace(*c))
+                .count();
+            format!("{}", str.lines()
+                .map(|line|
+                    if line.len() > indent_len {
+                        format!("{prefix}{text}",
+                            prefix = prefix,
+                            text = line[indent_len..].to_string())
+                    } else {
+                        "".to_string()
+                    })
+                .format("\n"))
+        } else {
+            "".to_string()
+        }
+    }
+
+    fn fit(&self, prefix: &str, columns: usize) -> String {
+        use itertools::Itertools;
+
+        let str = self.to_str();
+        // Determine the number of whitespace chars on the first line.
+        // Trim that many whitespace chars on the following lines.
+        if let Some(first_line) = str.lines().next() {
+            let indent_len = first_line.chars()
+                .take_while(|c| char::is_whitespace(*c))
+                .count();
+            let mut lines = vec![];
+            'per_line: for line in str.lines() {
+                eprintln!("Inspecting line {}", line);
+                let text = &line[indent_len..];
+                let mut gobbled = 0;
+                while text.len() > gobbled {
+                    let mut rest = &text[gobbled..];
+                    eprintln!("Line still contains {} ({})", rest, gobbled);
+                    if rest.len() + prefix.len() > columns {
+                        // Try and find the largest prefix of `text` that fits within `columns`.
+                        let mut iterator = rest.chars()
+                            .enumerate()
+                            .filter(|&(_, c)| char::is_whitespace(c));
+                        let mut last_whitespace_before_break = None;
+                        let mut first_whitespace_after_break = None;
+                        while let Some((found_pos, _)) = iterator.next() {
+                            if found_pos + prefix.len() <= columns {
+                                last_whitespace_before_break = Some(found_pos);
+                            } else {
+                                first_whitespace_after_break = Some(found_pos);
+                                break;
+                            }
+                        }
+
+                        match (last_whitespace_before_break, first_whitespace_after_break) {
+                            (None, None) => {
+                                eprintln!("Ok, string didn't contain any whitespace: '{}'", rest);
+                                // Oh, `rest` does not contain any whitespace. Well, use everything.
+                                lines.push(format!("{prefix}{rest}",
+                                    prefix = prefix,
+                                    rest = rest));
+                                continue 'per_line
+                            }
+                            (Some(pos), _) | (None, Some(pos)) if pos != 0 => {
+                                eprintln!("Best whitespace found at {}", pos);
+                                // Use `rest[0..pos]`, trimmed right.
+                                gobbled += pos + 1;
+                                let line = format!("{prefix}{rest}",
+                                    prefix = prefix,
+                                    rest = rest[0..pos].trim_right());
+                                lines.push(line)
+                            }
+                            _else => {
+                                panic!("{:?}", _else)
+                            }
+                        }
+                    } else {
+                        let line = format!("{prefix}{rest}",
+                            prefix = prefix,
+                            rest = rest);
+                        lines.push(line);
+                        continue 'per_line
+                    }
+                }
+            }
+            format!("{lines}",
+                lines = lines.iter()
+                    .format("\n"))
+        } else {
+            "".to_string()
+        }
+
+    }
+}
+
+impl Reindentable for Option<String> {
+    fn reindent(&self, prefix: &str) -> String {
+        match *self {
+            None => "".to_string(),
+            Some(ref string) => string.reindent(prefix)
+        }
+    }
+    fn fit(&self, prefix: &str, columns: usize) -> String {
+        match *self {
+            None => "".to_string(),
+            Some(ref string) => string.fit(prefix, columns)
+        }
+    }
+}
+
+pub mod name_sorter {
+    use std;
+    use std::collections::HashMap;
+
+    /// A type used to sort names by length, then prefixes, to speed
+    /// up lookups.
+    pub struct NameSorter<T> {
+        per_length: HashMap<usize, Node<T>>,
+        len: usize,
+    }
+    impl<T> NameSorter<T> {
+        pub fn new() -> Self {
+            NameSorter {
+                per_length: HashMap::new(),
+                len: 0,
+            }
+        }
+
+        /// Return the number of items in the sorter.
+        pub fn len(&self) -> usize {
+            debug_assert!( {
+                // Let's check that the length is always the sum of sublengths.
+                let len = self.per_length.values()
+                    .map(|v| {
+                        match v {
+                            &Node::Leaf(Some(_)) => 1,
+                            &Node::Leaf(_) => panic!("Invariant error: empty leaf!"),
+                            &Node::Internal { ref len, .. } => *len
+                        }
+                    })
+                    .fold(0, |x, y| (x + y));
+                len == self.len
+            });
+            self.len
+        }
+
+        /// Insert a value in a sorter.
+        ///
+        /// ```
+        /// let mut sorter = binjs_meta::util::name_sorter::NameSorter::new();
+        /// assert_eq!(sorter.len(), 0);
+        ///
+        /// assert!(sorter.insert("abcd", 0).is_none());
+        /// assert_eq!(sorter.len(), 1);
+        /// assert_eq!(*sorter.get("abcd").unwrap(), 0);
+        /// assert!(sorter.get("dbca").is_none());
+        /// assert!(sorter.get("").is_none());
+        ///
+        /// assert!(sorter.insert("dcba", 1).is_none());
+        /// assert_eq!(sorter.len(), 2);
+        /// assert_eq!(*sorter.get("abcd").unwrap(), 0);
+        /// assert_eq!(*sorter.get("dcba").unwrap(), 1);
+        /// assert!(sorter.get("").is_none());
+        ///
+        /// assert_eq!(sorter.insert("abcd", 3).unwrap(), 0);
+        /// assert_eq!(sorter.len(), 2);
+        /// assert_eq!(*sorter.get("abcd").unwrap(), 3);
+        /// assert_eq!(*sorter.get("dcba").unwrap(), 1);
+        /// assert!(sorter.get("").is_none());
+        ///
+        /// assert!(sorter.insert("", 4).is_none());
+        /// assert_eq!(sorter.len(), 3);
+        /// assert_eq!(*sorter.get("abcd").unwrap(), 3);
+        /// assert_eq!(*sorter.get("dcba").unwrap(), 1);
+        /// assert_eq!(*sorter.get("").unwrap(), 4);
+        ///
+        /// assert_eq!(sorter.insert("", 5).unwrap(), 4);
+        /// assert_eq!(sorter.len(), 3);
+        /// assert_eq!(*sorter.get("abcd").unwrap(), 3);
+        /// assert_eq!(*sorter.get("dcba").unwrap(), 1);
+        /// assert_eq!(*sorter.get("").unwrap(), 5);
+        /// ```
+        pub fn insert(&mut self, key: &str, value: T) -> Option<T> {
+            if let Some(node) = self.per_length.get_mut(&key.len()) {
+                let result = node.insert(key, value);
+                if result.is_none() {
+                    self.len += 1;
+                }
+                return result;
+            }
+            let node = Node::new(key, value);
+            self.per_length.insert(key.len(), node);
+            self.len += 1;
+            None
+        }
+
+        pub fn iter(&self) -> impl Iterator<Item = (usize, &Node<T>)> {
+            self.per_length.iter()
+                .map(|(&len, node)| (len, node))
+        }
+
+        pub fn get(&self, key: &str) -> Option<&T> {
+            self.per_length.get(&key.len())
+                .and_then(|node| node.get(key))
+        }
+    }
+
+    pub enum Node<T> {
+        Leaf(Option<T>),
+        Internal {
+            /// The children of this node.
+            ///
+            /// Invariant: May only be empty during a call to `insert()`.
+            children: HashMap<char, Node<T>>,
+
+            /// Number of leaves in this subtree.
+            len: usize,
+        }
+    }
+    impl<T> Node<T> {
+        fn get(&self, key: &str) -> Option<&T> {
+            match (self, key.chars().next()) {
+                (&Node::Leaf(Some(ref result)), None) => Some(result),
+                (&Node::Internal { ref children, ..}, Some(c)) => {
+                    debug_assert!(children.len() != 0);
+                    children.get(&c)
+                        .and_then(|node| node.get(&key[1..]))
+                }
+                _ => panic!("Invariant error: length")
+            }
+        }
+
+        fn insert(&mut self, key: &str, value: T) -> Option<T> {
+            match (self, key.chars().next()) {
+                (&mut Node::Leaf(ref mut old), None) => {
+                    // We have reached the end of `name`.
+                    let mut data = Some(value);
+                    std::mem::swap(&mut data, old);
+                    data
+                }
+                (&mut Node::Internal { ref mut children, ref mut len }, Some(c)) => {
+                    let result = {
+                        let entry = if key.len() == 1 {
+                            children.entry(c)
+                                .or_insert_with(|| Node::Leaf(None))
+                        } else {
+                            children.entry(c)
+                                .or_insert_with(|| Node::Internal { children: HashMap::new(), len: 0})
+                        };
+                        entry.insert(&key[1..], value)
+                    };
+                    if result.is_none() {
+                        *len += 1;
+                    }
+                    debug_assert!(*len > 0);
+                    debug_assert!(children.len() != 0);
+                    result
+                }
+                _ => panic!("Invariant error: length")
+            }
+        }
+        fn new(key: &str, value: T) -> Self {
+            if key.len() == 0 {
+                Node::Leaf(Some(value))
+            } else {
+                let mut node = Node::Internal { children: HashMap::new(), len : 0};
+                assert!(node.insert(key, value).is_none());
+                node
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"e684c9479b485343f5b932e8f9de7ac046accfb4c1e3c534e6e0fb9e0c8d919b","Cargo.toml":"a30078c3db5bccf6a567ad9ae78a6258d18b990034eda7e4ce8f4b3041ff2aa9","LICENSE-APACHE":"8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"d3a2993cd15ac201b30c86fe69f2bb692b386875eace571715007637d7ca7abf","deploy-docs.sh":"7b66111b124c1c7e59cb84cf110d98b5cb783bd35a676e970d9b3035e55f7dfd","src/lib.rs":"7276279f7008dd633d0bb90cc0ff73de170b89d69644fb21c35728c94e913c4d"},"package":"d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/.travis.yml
@@ -0,0 +1,18 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: stable
+    - rust: nightly
+      env: FEATURES="--features nightly"
+script:
+    - cargo build $FEATURES
+    - cargo test $FEATURES
+    - cargo doc --no-deps
+after_success: |
+    [ "$TRAVIS_RUST_VERSION" = nightly ] &&
+    [ "$TRAVIS_BRANCH" = master ] &&
+    [ "$TRAVIS_PULL_REQUEST" = false ] &&
+    bash deploy-docs.sh
+notifications:
+    webhooks: http://huon.me:54857/travis
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "bit-set"
+version = "0.4.0"
+authors = ["Alexis Beingessner <a.beingessner@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "A set of bits"
+repository = "https://github.com/contain-rs/bit-set"
+homepage = "https://github.com/contain-rs/bit-set"
+documentation = "https://contain-rs.github.io/bit-set/bit_set"
+keywords = ["data-structures", "bitset"]
+readme = "README.md"
+
+[dev-dependencies]
+rand = "0.3"
+
+[dependencies]
+bit-vec = "0.4"
+
+[features]
+nightly = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/README.md
@@ -0,0 +1,6 @@
+A Set of bits.
+
+Documentation is available at https://contain-rs.github.io/bit-set/bit_set.
+
+[![Build Status](https://travis-ci.org/contain-rs/bit-set.svg?branch=master)](https://travis-ci.org/contain-rs/bit-set)
+[![crates.io](http://meritbadge.herokuapp.com/bit-set)](https://crates.io/crates/bit-set)
new file mode 100755
--- /dev/null
+++ b/third_party/rust/bit-set/deploy-docs.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+rev=$(git rev-parse --short HEAD)
+
+cd target/doc
+
+git init
+git config user.email 'FlashCat@users.noreply.github.com'
+git config user.name 'FlashCat'
+git remote add upstream "https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git"
+git fetch upstream gh-pages
+git reset upstream/gh-pages
+
+touch .
+
+git add -A .
+git commit -m "rebuild pages at ${rev}"
+git push -q upstream HEAD:gh-pages
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-set/src/lib.rs
@@ -0,0 +1,1436 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! An implementation of a set using a bit vector as an underlying
+//! representation for holding unsigned numerical elements.
+//!
+//! It should also be noted that the amount of storage necessary for holding a
+//! set of objects is proportional to the maximum of the objects when viewed
+//! as a `usize`.
+//!
+//! # Examples
+//!
+//! ```
+//! use bit_set::BitSet;
+//!
+//! // It's a regular set
+//! let mut s = BitSet::new();
+//! s.insert(0);
+//! s.insert(3);
+//! s.insert(7);
+//!
+//! s.remove(7);
+//!
+//! if !s.contains(7) {
+//!     println!("There is no 7");
+//! }
+//!
+//! // Can initialize from a `BitVec`
+//! let other = BitSet::from_bytes(&[0b11010000]);
+//!
+//! s.union_with(&other);
+//!
+//! // Print 0, 1, 3 in some order
+//! for x in s.iter() {
+//!     println!("{}", x);
+//! }
+//!
+//! // Can convert back to a `BitVec`
+//! let bv = s.into_bit_vec();
+//! assert!(bv[3]);
+//! ```
+
+#![cfg_attr(all(test, feature = "nightly"), feature(test))]
+#[cfg(all(test, feature = "nightly"))] extern crate test;
+#[cfg(all(test, feature = "nightly"))] extern crate rand;
+extern crate bit_vec;
+
+use bit_vec::{BitVec, Blocks, BitBlock};
+use std::cmp::Ordering;
+use std::cmp;
+use std::fmt;
+use std::hash;
+use std::iter::{self, Chain, Enumerate, FromIterator, Repeat, Skip, Take};
+
+type MatchWords<'a, B> = Chain<Enumerate<Blocks<'a, B>>, Skip<Take<Enumerate<Repeat<B>>>>>;
+
+/// Computes how many blocks are needed to store that many bits
+fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
+    // If we want 17 bits, dividing by 32 will produce 0. So we add 1 to make sure we
+    // reserve enough. But if we want exactly a multiple of 32, this will actually allocate
+    // one too many. So we need to check if that's the case. We can do that by computing if
+    // bitwise AND by `32 - 1` is 0. But LLVM should be able to optimize the semantically
+    // superior modulo operator on a power of two to this.
+    //
+    // Note that we can technically avoid this branch with the expression
+    // `(nbits + BITS - 1) / 32::BITS`, but if nbits is almost usize::MAX this will overflow.
+    if bits % B::bits() == 0 {
+        bits / B::bits()
+    } else {
+        bits / B::bits() + 1
+    }
+}
+
+// Take two BitVec's, and return iterators of their words, where the shorter one
+// has been padded with 0's
+fn match_words<'a, 'b, B: BitBlock>(a: &'a BitVec<B>, b: &'b BitVec<B>)
+    -> (MatchWords<'a, B>, MatchWords<'b, B>)
+{
+    let a_len = a.storage().len();
+    let b_len = b.storage().len();
+
+    // have to uselessly pretend to pad the longer one for type matching
+    if a_len < b_len {
+        (a.blocks().enumerate().chain(iter::repeat(B::zero()).enumerate().take(b_len).skip(a_len)),
+         b.blocks().enumerate().chain(iter::repeat(B::zero()).enumerate().take(0).skip(0)))
+    } else {
+        (a.blocks().enumerate().chain(iter::repeat(B::zero()).enumerate().take(0).skip(0)),
+         b.blocks().enumerate().chain(iter::repeat(B::zero()).enumerate().take(a_len).skip(b_len)))
+    }
+}
+
+pub struct BitSet<B = u32> {
+    bit_vec: BitVec<B>,
+}
+
+impl<B: BitBlock> Clone for BitSet<B> {
+    fn clone(&self) -> Self {
+        BitSet {
+            bit_vec: self.bit_vec.clone(),
+        }
+    }
+
+    fn clone_from(&mut self, other: &Self) {
+        self.bit_vec.clone_from(&other.bit_vec);
+    }
+}
+
+impl<B: BitBlock> Default for BitSet<B> {
+    #[inline]
+    fn default() -> Self { BitSet { bit_vec: Default::default() } }
+}
+
+impl<B: BitBlock> FromIterator<usize> for BitSet<B> {
+    fn from_iter<I: IntoIterator<Item = usize>>(iter: I) -> Self {
+        let mut ret = Self::default();
+        ret.extend(iter);
+        ret
+    }
+}
+
+impl<B: BitBlock> Extend<usize> for BitSet<B> {
+    #[inline]
+    fn extend<I: IntoIterator<Item = usize>>(&mut self, iter: I) {
+        for i in iter {
+            self.insert(i);
+        }
+    }
+}
+
+impl<B: BitBlock> PartialOrd for BitSet<B> {
+    #[inline]
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        self.iter().partial_cmp(other)
+    }
+}
+
+impl<B: BitBlock> Ord for BitSet<B> {
+    #[inline]
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.iter().cmp(other)
+    }
+}
+
+impl<B: BitBlock> PartialEq for BitSet<B> {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.iter().eq(other)
+    }
+}
+
+impl<B: BitBlock> Eq for BitSet<B> {}
+
+impl BitSet<u32> {
+    /// Creates a new empty `BitSet`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// ```
+    #[inline]
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    /// Creates a new `BitSet` with initially no contents, able to
+    /// hold `nbits` elements without resizing.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::with_capacity(100);
+    /// assert!(s.capacity() >= 100);
+    /// ```
+    #[inline]
+    pub fn with_capacity(nbits: usize) -> Self {
+        let bit_vec = BitVec::from_elem(nbits, false);
+        Self::from_bit_vec(bit_vec)
+    }
+
+    /// Creates a new `BitSet` from the given bit vector.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// extern crate bit_vec;
+    /// extern crate bit_set;
+    ///
+    /// fn main() {
+    ///     use bit_vec::BitVec;
+    ///     use bit_set::BitSet;
+    ///
+    ///     let bv = BitVec::from_bytes(&[0b01100000]);
+    ///     let s = BitSet::from_bit_vec(bv);
+    ///
+    ///     // Print 1, 2 in arbitrary order
+    ///     for x in s.iter() {
+    ///         println!("{}", x);
+    ///     }
+    /// }
+    /// ```
+    #[inline]
+    pub fn from_bit_vec(bit_vec: BitVec) -> Self {
+        BitSet { bit_vec: bit_vec }
+    }
+
+    pub fn from_bytes(bytes: &[u8]) -> Self {
+        BitSet { bit_vec: BitVec::from_bytes(bytes) }
+    }
+}
+
+impl<B: BitBlock> BitSet<B> {
+
+    /// Returns the capacity in bits for this bit vector. Inserting any
+    /// element less than this amount will not trigger a resizing.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::with_capacity(100);
+    /// assert!(s.capacity() >= 100);
+    /// ```
+    #[inline]
+    pub fn capacity(&self) -> usize {
+        self.bit_vec.capacity()
+    }
+
+    /// Reserves capacity for the given `BitSet` to contain `len` distinct elements. In the case
+    /// of `BitSet` this means reallocations will not occur as long as all inserted elements
+    /// are less than `len`.
+    ///
+    /// The collection may reserve more space to avoid frequent reallocations.
+    ///
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// s.reserve_len(10);
+    /// assert!(s.capacity() >= 10);
+    /// ```
+    pub fn reserve_len(&mut self, len: usize) {
+        let cur_len = self.bit_vec.len();
+        if len >= cur_len {
+            self.bit_vec.reserve(len - cur_len);
+        }
+    }
+
+    /// Reserves the minimum capacity for the given `BitSet` to contain `len` distinct elements.
+    /// In the case of `BitSet` this means reallocations will not occur as long as all inserted
+    /// elements are less than `len`.
+    ///
+    /// Note that the allocator may give the collection more space than it requests. Therefore
+    /// capacity can not be relied upon to be precisely minimal. Prefer `reserve_len` if future
+    /// insertions are expected.
+    ///
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// s.reserve_len_exact(10);
+    /// assert!(s.capacity() >= 10);
+    /// ```
+    pub fn reserve_len_exact(&mut self, len: usize) {
+        let cur_len = self.bit_vec.len();
+        if len >= cur_len {
+            self.bit_vec.reserve_exact(len - cur_len);
+        }
+    }
+
+    /// Consumes this set to return the underlying bit vector.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// s.insert(0);
+    /// s.insert(3);
+    ///
+    /// let bv = s.into_bit_vec();
+    /// assert!(bv[0]);
+    /// assert!(bv[3]);
+    /// ```
+    #[inline]
+    pub fn into_bit_vec(self) -> BitVec<B> {
+        self.bit_vec
+    }
+
+    /// Returns a reference to the underlying bit vector.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// s.insert(0);
+    ///
+    /// let bv = s.get_ref();
+    /// assert_eq!(bv[0], true);
+    /// ```
+    #[inline]
+    pub fn get_ref(&self) -> &BitVec<B> {
+        &self.bit_vec
+    }
+
+    #[inline]
+    fn other_op<F>(&mut self, other: &Self, mut f: F) where F: FnMut(B, B) -> B {
+        // Unwrap BitVecs
+        let self_bit_vec = &mut self.bit_vec;
+        let other_bit_vec = &other.bit_vec;
+
+        let self_len = self_bit_vec.len();
+        let other_len = other_bit_vec.len();
+
+        // Expand the vector if necessary
+        if self_len < other_len {
+            self_bit_vec.grow(other_len - self_len, false);
+        }
+
+        // virtually pad other with 0's for equal lengths
+        let other_words = {
+            let (_, result) = match_words(self_bit_vec, other_bit_vec);
+            result
+        };
+
+        // Apply values found in other
+        for (i, w) in other_words {
+            let old = self_bit_vec.storage()[i];
+            let new = f(old, w);
+            unsafe {
+                self_bit_vec.storage_mut()[i] = new;
+            }
+        }
+    }
+
+    /// Truncates the underlying vector to the least length required.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut s = BitSet::new();
+    /// s.insert(32183231);
+    /// s.remove(32183231);
+    ///
+    /// // Internal storage will probably be bigger than necessary
+    /// println!("old capacity: {}", s.capacity());
+    ///
+    /// // Now should be smaller
+    /// s.shrink_to_fit();
+    /// println!("new capacity: {}", s.capacity());
+    /// ```
+    #[inline]
+    pub fn shrink_to_fit(&mut self) {
+        let bit_vec = &mut self.bit_vec;
+        // Obtain original length
+        let old_len = bit_vec.storage().len();
+        // Obtain coarse trailing zero length
+        let n = bit_vec.storage().iter().rev().take_while(|&&n| n == B::zero()).count();
+        // Truncate
+        let trunc_len = cmp::max(old_len - n, 1);
+        unsafe {
+            bit_vec.storage_mut().truncate(trunc_len);
+            bit_vec.set_len(trunc_len * B::bits());
+        }
+    }
+
+    /// Iterator over each usize stored in the `BitSet`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let s = BitSet::from_bytes(&[0b01001010]);
+    ///
+    /// // Print 1, 4, 6 in arbitrary order
+    /// for x in s.iter() {
+    ///     println!("{}", x);
+    /// }
+    /// ```
+    #[inline]
+    pub fn iter(&self) -> Iter<B> {
+        Iter(BlockIter::from_blocks(self.bit_vec.blocks()))
+    }
+
+    /// Iterator over each usize stored in `self` union `other`.
+    /// See [union_with](#method.union_with) for an efficient in-place version.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a = BitSet::from_bytes(&[0b01101000]);
+    /// let b = BitSet::from_bytes(&[0b10100000]);
+    ///
+    /// // Print 0, 1, 2, 4 in arbitrary order
+    /// for x in a.union(&b) {
+    ///     println!("{}", x);
+    /// }
+    /// ```
+    #[inline]
+    pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, B> {
+        fn or<B: BitBlock>(w1: B, w2: B) -> B { w1 | w2 }
+
+        Union(BlockIter::from_blocks(TwoBitPositions {
+            set: self.bit_vec.blocks(),
+            other: other.bit_vec.blocks(),
+            merge: or,
+        }))
+    }
+
+    /// Iterator over each usize stored in `self` intersect `other`.
+    /// See [intersect_with](#method.intersect_with) for an efficient in-place version.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a = BitSet::from_bytes(&[0b01101000]);
+    /// let b = BitSet::from_bytes(&[0b10100000]);
+    ///
+    /// // Print 2
+    /// for x in a.intersection(&b) {
+    ///     println!("{}", x);
+    /// }
+    /// ```
+    #[inline]
+    pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, B> {
+        fn bitand<B: BitBlock>(w1: B, w2: B) -> B { w1 & w2 }
+        let min = cmp::min(self.bit_vec.len(), other.bit_vec.len());
+
+        Intersection(BlockIter::from_blocks(TwoBitPositions {
+            set: self.bit_vec.blocks(),
+            other: other.bit_vec.blocks(),
+            merge: bitand,
+        }).take(min))
+    }
+
+    /// Iterator over each usize stored in the `self` setminus `other`.
+    /// See [difference_with](#method.difference_with) for an efficient in-place version.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a = BitSet::from_bytes(&[0b01101000]);
+    /// let b = BitSet::from_bytes(&[0b10100000]);
+    ///
+    /// // Print 1, 4 in arbitrary order
+    /// for x in a.difference(&b) {
+    ///     println!("{}", x);
+    /// }
+    ///
+    /// // Note that difference is not symmetric,
+    /// // and `b - a` means something else.
+    /// // This prints 0
+    /// for x in b.difference(&a) {
+    ///     println!("{}", x);
+    /// }
+    /// ```
+    #[inline]
+    pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, B> {
+        fn diff<B: BitBlock>(w1: B, w2: B) -> B { w1 & !w2 }
+
+        Difference(BlockIter::from_blocks(TwoBitPositions {
+            set: self.bit_vec.blocks(),
+            other: other.bit_vec.blocks(),
+            merge: diff,
+        }))
+    }
+
+    /// Iterator over each usize stored in the symmetric difference of `self` and `other`.
+    /// See [symmetric_difference_with](#method.symmetric_difference_with) for
+    /// an efficient in-place version.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a = BitSet::from_bytes(&[0b01101000]);
+    /// let b = BitSet::from_bytes(&[0b10100000]);
+    ///
+    /// // Print 0, 1, 4 in arbitrary order
+    /// for x in a.symmetric_difference(&b) {
+    ///     println!("{}", x);
+    /// }
+    /// ```
+    #[inline]
+    pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, B> {
+        fn bitxor<B: BitBlock>(w1: B, w2: B) -> B { w1 ^ w2 }
+
+        SymmetricDifference(BlockIter::from_blocks(TwoBitPositions {
+            set: self.bit_vec.blocks(),
+            other: other.bit_vec.blocks(),
+            merge: bitxor,
+        }))
+    }
+
+    /// Unions in-place with the specified other bit vector.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a   = 0b01101000;
+    /// let b   = 0b10100000;
+    /// let res = 0b11101000;
+    ///
+    /// let mut a = BitSet::from_bytes(&[a]);
+    /// let b = BitSet::from_bytes(&[b]);
+    /// let res = BitSet::from_bytes(&[res]);
+    ///
+    /// a.union_with(&b);
+    /// assert_eq!(a, res);
+    /// ```
+    #[inline]
+    pub fn union_with(&mut self, other: &Self) {
+        self.other_op(other, |w1, w2| w1 | w2);
+    }
+
+    /// Intersects in-place with the specified other bit vector.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a   = 0b01101000;
+    /// let b   = 0b10100000;
+    /// let res = 0b00100000;
+    ///
+    /// let mut a = BitSet::from_bytes(&[a]);
+    /// let b = BitSet::from_bytes(&[b]);
+    /// let res = BitSet::from_bytes(&[res]);
+    ///
+    /// a.intersect_with(&b);
+    /// assert_eq!(a, res);
+    /// ```
+    #[inline]
+    pub fn intersect_with(&mut self, other: &Self) {
+        self.other_op(other, |w1, w2| w1 & w2);
+    }
+
+    /// Makes this bit vector the difference with the specified other bit vector
+    /// in-place.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a   = 0b01101000;
+    /// let b   = 0b10100000;
+    /// let a_b = 0b01001000; // a - b
+    /// let b_a = 0b10000000; // b - a
+    ///
+    /// let mut bva = BitSet::from_bytes(&[a]);
+    /// let bvb = BitSet::from_bytes(&[b]);
+    /// let bva_b = BitSet::from_bytes(&[a_b]);
+    /// let bvb_a = BitSet::from_bytes(&[b_a]);
+    ///
+    /// bva.difference_with(&bvb);
+    /// assert_eq!(bva, bva_b);
+    ///
+    /// let bva = BitSet::from_bytes(&[a]);
+    /// let mut bvb = BitSet::from_bytes(&[b]);
+    ///
+    /// bvb.difference_with(&bva);
+    /// assert_eq!(bvb, bvb_a);
+    /// ```
+    #[inline]
+    pub fn difference_with(&mut self, other: &Self) {
+        self.other_op(other, |w1, w2| w1 & !w2);
+    }
+
+    /// Makes this bit vector the symmetric difference with the specified other
+    /// bit vector in-place.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let a   = 0b01101000;
+    /// let b   = 0b10100000;
+    /// let res = 0b11001000;
+    ///
+    /// let mut a = BitSet::from_bytes(&[a]);
+    /// let b = BitSet::from_bytes(&[b]);
+    /// let res = BitSet::from_bytes(&[res]);
+    ///
+    /// a.symmetric_difference_with(&b);
+    /// assert_eq!(a, res);
+    /// ```
+    #[inline]
+    pub fn symmetric_difference_with(&mut self, other: &Self) {
+        self.other_op(other, |w1, w2| w1 ^ w2);
+    }
+
+/*
+    /// Moves all elements from `other` into `Self`, leaving `other` empty.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut a = BitSet::new();
+    /// a.insert(2);
+    /// a.insert(6);
+    ///
+    /// let mut b = BitSet::new();
+    /// b.insert(1);
+    /// b.insert(3);
+    /// b.insert(6);
+    ///
+    /// a.append(&mut b);
+    ///
+    /// assert_eq!(a.len(), 4);
+    /// assert_eq!(b.len(), 0);
+    /// assert_eq!(a, BitSet::from_bytes(&[0b01110010]));
+    /// ```
+    pub fn append(&mut self, other: &mut Self) {
+        self.union_with(other);
+        other.clear();
+    }
+
+    /// Splits the `BitSet` into two at the given key including the key.
+    /// Retains the first part in-place while returning the second part.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_set::BitSet;
+    ///
+    /// let mut a = BitSet::new();
+    /// a.insert(2);
+    /// a.insert(6);
+    /// a.insert(1);
+    /// a.insert(3);
+    ///
+    /// let b = a.split_off(3);
+    ///
+    /// assert_eq!(a.len(), 2);
+    /// assert_eq!(b.len(), 2);
+    /// assert_eq!(a, BitSet::from_bytes(&[0b01100000]));
+    /// assert_eq!(b, BitSet::from_bytes(&[0b00010010]));
+    /// ```
+    pub fn split_off(&mut self, at: usize) -> Self {
+        let mut other = BitSet::new();
+
+        if at == 0 {
+            swap(self, &mut other);
+            return other;
+        } else if at >= self.bit_vec.len() {
+            return other;
+        }
+
+        // Calculate block and bit at which to split
+        let w = at / BITS;
+        let b = at % BITS;
+
+        // Pad `other` with `w` zero blocks,
+        // append `self`'s blocks in the range from `w` to the end to `other`
+        other.bit_vec.storage_mut().extend(repeat(0u32).take(w)
+                                     .chain(self.bit_vec.storage()[w..].iter().cloned()));
+        other.bit_vec.nbits = self.bit_vec.nbits;
+
+        if b > 0 {
+            other.bit_vec.storage_mut()[w] &= !0 << b;
+        }
+
+        // Sets `bit_vec.len()` and fixes the last block as well
+        self.bit_vec.truncate(at);
+
+        other
+    }
+*/
+
+    /// Returns the number of set bits in this set.
+    #[inline]
+    pub fn len(&self) -> usize  {
+        self.bit_vec.blocks().fold(0, |acc, n| acc + n.count_ones() as usize)
+    }
+
+    /// Returns whether there are no bits set in this set
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.bit_vec.none()
+    }
+
+    /// Clears all bits in this set
+    #[inline]
+    pub fn clear(&mut self) {
+        self.bit_vec.clear();
+    }
+
+    /// Returns `true` if this set contains the specified integer.
+    #[inline]
+    pub fn contains(&self, value: usize) -> bool {
+        let bit_vec = &self.bit_vec;
+        value < bit_vec.len() && bit_vec[value]
+    }
+
+    /// Returns `true` if the set has no elements in common with `other`.
+    /// This is equivalent to checking for an empty intersection.
+    #[inline]
+    pub fn is_disjoint(&self, other: &Self) -> bool {
+        self.intersection(other).next().is_none()
+    }
+
+    /// Returns `true` if the set is a subset of another.
+    #[inline]
+    pub fn is_subset(&self, other: &Self) -> bool {
+        let self_bit_vec = &self.bit_vec;
+        let other_bit_vec = &other.bit_vec;
+        let other_blocks = blocks_for_bits::<B>(other_bit_vec.len());
+
+        // Check that `self` intersect `other` is self
+        self_bit_vec.blocks().zip(other_bit_vec.blocks()).all(|(w1, w2)| w1 & w2 == w1) &&
+        // Make sure if `self` has any more blocks than `other`, they're all 0
+        self_bit_vec.blocks().skip(other_blocks).all(|w| w == B::zero())
+    }
+
+    /// Returns `true` if the set is a superset of another.
+    #[inline]
+    pub fn is_superset(&self, other: &Self) -> bool {
+        other.is_subset(self)
+    }
+
+    /// Adds a value to the set. Returns `true` if the value was not already
+    /// present in the set.
+    pub fn insert(&mut self, value: usize) -> bool {
+        if self.contains(value) {
+            return false;
+        }
+
+        // Ensure we have enough space to hold the new element
+        let len = self.bit_vec.len();
+        if value >= len {
+            self.bit_vec.grow(value - len + 1, false)
+        }
+
+        self.bit_vec.set(value, true);
+        return true;
+    }
+
+    /// Removes a value from the set. Returns `true` if the value was
+    /// present in the set.
+    pub fn remove(&mut self, value: usize) -> bool {
+        if !self.contains(value) {
+            return false;
+        }
+
+        self.bit_vec.set(value, false);
+
+        return true;
+    }
+}
+
+impl<B: BitBlock> fmt::Debug for BitSet<B> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        fmt.debug_set().entries(self).finish()
+    }
+}
+
+impl<B: BitBlock> hash::Hash for BitSet<B> {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        for pos in self {
+            pos.hash(state);
+        }
+    }
+}
+
+#[derive(Clone)]
+struct BlockIter<T, B> {
+    head: B,
+    head_offset: usize,
+    tail: T,
+}
+
+impl<T, B: BitBlock> BlockIter<T, B> where T: Iterator<Item=B> {
+    fn from_blocks(mut blocks: T) -> BlockIter<T, B> {
+        let h = blocks.next().unwrap_or(B::zero());
+        BlockIter {tail: blocks, head: h, head_offset: 0}
+    }
+}
+
+/// An iterator combining two `BitSet` iterators.
+#[derive(Clone)]
+struct TwoBitPositions<'a, B: 'a> {
+    set: Blocks<'a, B>,
+    other: Blocks<'a, B>,
+    merge: fn(B, B) -> B,
+}
+
+/// An iterator for `BitSet`.
+#[derive(Clone)]
+pub struct Iter<'a, B: 'a>(BlockIter<Blocks<'a, B>, B>);
+#[derive(Clone)]
+pub struct Union<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
+#[derive(Clone)]
+pub struct Intersection<'a, B: 'a>(Take<BlockIter<TwoBitPositions<'a, B>, B>>);
+#[derive(Clone)]
+pub struct Difference<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
+#[derive(Clone)]
+pub struct SymmetricDifference<'a, B: 'a>(BlockIter<TwoBitPositions<'a, B>, B>);
+
+impl<'a, T, B: BitBlock> Iterator for BlockIter<T, B> where T: Iterator<Item=B> {
+    type Item = usize;
+
+    fn next(&mut self) -> Option<usize> {
+        while self.head == B::zero() {
+            match self.tail.next() {
+                Some(w) => self.head = w,
+                None => return None
+            }
+            self.head_offset += B::bits();
+        }
+
+        // from the current block, isolate the
+        // LSB and subtract 1, producing k:
+        // a block with a number of set bits
+        // equal to the index of the LSB
+        let k = (self.head & (!self.head + B::one())) - B::one();
+        // update block, removing the LSB
+        self.head = self.head & (self.head - B::one());
+        // return offset + (index of LSB)
+        Some(self.head_offset + (B::count_ones(k) as usize))
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        match self.tail.size_hint() {
+            (_, Some(h)) => (0, Some(1 + h * B::bits())),
+            _ => (0, None)
+        }
+    }
+}
+
+impl<'a, B: BitBlock> Iterator for TwoBitPositions<'a, B> {
+    type Item = B;
+
+    fn next(&mut self) -> Option<B> {
+        match (self.set.next(), self.other.next()) {
+            (Some(a), Some(b)) => Some((self.merge)(a, b)),
+            (Some(a), None) => Some((self.merge)(a, B::zero())),
+            (None, Some(b)) => Some((self.merge)(B::zero(), b)),
+            _ => return None
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (a, au) = self.set.size_hint();
+        let (b, bu) = self.other.size_hint();
+
+        let upper = match (au, bu) {
+            (Some(au), Some(bu)) => Some(cmp::max(au, bu)),
+            _ => None
+        };
+
+        (cmp::max(a, b), upper)
+    }
+}
+
+impl<'a, B: BitBlock> Iterator for Iter<'a, B> {
+    type Item = usize;
+
+    #[inline] fn next(&mut self) -> Option<usize> { self.0.next() }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
+}
+
+impl<'a, B: BitBlock> Iterator for Union<'a, B> {
+    type Item = usize;
+
+    #[inline] fn next(&mut self) -> Option<usize> { self.0.next() }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
+}
+
+impl<'a, B: BitBlock> Iterator for Intersection<'a, B> {
+    type Item = usize;
+
+    #[inline] fn next(&mut self) -> Option<usize> { self.0.next() }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
+}
+
+impl<'a, B: BitBlock> Iterator for Difference<'a, B> {
+    type Item = usize;
+
+    #[inline] fn next(&mut self) -> Option<usize> { self.0.next() }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
+}
+
+impl<'a, B: BitBlock> Iterator for SymmetricDifference<'a, B> {
+    type Item = usize;
+
+    #[inline] fn next(&mut self) -> Option<usize> { self.0.next() }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
+}
+
+impl<'a, B: BitBlock> IntoIterator for &'a BitSet<B> {
+    type Item = usize;
+    type IntoIter = Iter<'a, B>;
+
+    fn into_iter(self) -> Iter<'a, B> {
+        self.iter()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::cmp::Ordering::{Equal, Greater, Less};
+    use super::BitSet;
+    use bit_vec::BitVec;
+
+    #[test]
+    fn test_bit_set_show() {
+        let mut s = BitSet::new();
+        s.insert(1);
+        s.insert(10);
+        s.insert(50);
+        s.insert(2);
+        assert_eq!("{1, 2, 10, 50}", format!("{:?}", s));
+    }
+
+    #[test]
+    fn test_bit_set_from_usizes() {
+        let usizes = vec![0, 2, 2, 3];
+        let a: BitSet = usizes.into_iter().collect();
+        let mut b = BitSet::new();
+        b.insert(0);
+        b.insert(2);
+        b.insert(3);
+        assert_eq!(a, b);
+    }
+
+    #[test]
+    fn test_bit_set_iterator() {
+        let usizes = vec![0, 2, 2, 3];
+        let bit_vec: BitSet = usizes.into_iter().collect();
+
+        let idxs: Vec<_> = bit_vec.iter().collect();
+        assert_eq!(idxs, [0, 2, 3]);
+
+        let long: BitSet = (0..10000).filter(|&n| n % 2 == 0).collect();
+        let real: Vec<_> = (0..10000/2).map(|x| x*2).collect();
+
+        let idxs: Vec<_> = long.iter().collect();
+        assert_eq!(idxs, real);
+    }
+
+    #[test]
+    fn test_bit_set_frombit_vec_init() {
+        let bools = [true, false];
+        let lengths = [10, 64, 100];
+        for &b in &bools {
+            for &l in &lengths {
+                let bitset = BitSet::from_bit_vec(BitVec::from_elem(l, b));
+                assert_eq!(bitset.contains(1), b);
+                assert_eq!(bitset.contains((l-1)), b);
+                assert!(!bitset.contains(l));
+            }
+        }
+    }
+
+    #[test]
+    fn test_bit_vec_masking() {
+        let b = BitVec::from_elem(140, true);
+        let mut bs = BitSet::from_bit_vec(b);
+        assert!(bs.contains(139));
+        assert!(!bs.contains(140));
+        assert!(bs.insert(150));
+        assert!(!bs.contains(140));
+        assert!(!bs.contains(149));
+        assert!(bs.contains(150));
+        assert!(!bs.contains(151));
+    }
+
+    #[test]
+    fn test_bit_set_basic() {
+        let mut b = BitSet::new();
+        assert!(b.insert(3));
+        assert!(!b.insert(3));
+        assert!(b.contains(3));
+        assert!(b.insert(4));
+        assert!(!b.insert(4));
+        assert!(b.contains(3));
+        assert!(b.insert(400));
+        assert!(!b.insert(400));
+        assert!(b.contains(400));
+        assert_eq!(b.len(), 3);
+    }
+
+    #[test]
+    fn test_bit_set_intersection() {
+        let mut a = BitSet::new();
+        let mut b = BitSet::new();
+
+        assert!(a.insert(11));
+        assert!(a.insert(1));
+        assert!(a.insert(3));
+        assert!(a.insert(77));
+        assert!(a.insert(103));
+        assert!(a.insert(5));
+
+        assert!(b.insert(2));
+        assert!(b.insert(11));
+        assert!(b.insert(77));
+        assert!(b.insert(5));
+        assert!(b.insert(3));
+
+        let expected = [3, 5, 11, 77];
+        let actual: Vec<_> = a.intersection(&b).collect();
+        assert_eq!(actual, expected);
+    }
+
+    #[test]
+    fn test_bit_set_difference() {
+        let mut a = BitSet::new();
+        let mut b = BitSet::new();
+
+        assert!(a.insert(1));
+        assert!(a.insert(3));
+        assert!(a.insert(5));
+        assert!(a.insert(200));
+        assert!(a.insert(500));
+
+        assert!(b.insert(3));
+        assert!(b.insert(200));
+
+        let expected = [1, 5, 500];
+        let actual: Vec<_> = a.difference(&b).collect();
+        assert_eq!(actual, expected);
+    }
+
+    #[test]
+    fn test_bit_set_symmetric_difference() {
+        let mut a = BitSet::new();
+        let mut b = BitSet::new();
+
+        assert!(a.insert(1));
+        assert!(a.insert(3));
+        assert!(a.insert(5));
+        assert!(a.insert(9));
+        assert!(a.insert(11));
+
+        assert!(b.insert(3));
+        assert!(b.insert(9));
+        assert!(b.insert(14));
+        assert!(b.insert(220));
+
+        let expected = [1, 5, 11, 14, 220];
+        let actual: Vec<_> = a.symmetric_difference(&b).collect();
+        assert_eq!(actual, expected);
+    }
+
+    #[test]
+    fn test_bit_set_union() {
+        let mut a = BitSet::new();
+        let mut b = BitSet::new();
+        assert!(a.insert(1));
+        assert!(a.insert(3));
+        assert!(a.insert(5));
+        assert!(a.insert(9));
+        assert!(a.insert(11));
+        assert!(a.insert(160));
+        assert!(a.insert(19));
+        assert!(a.insert(24));
+        assert!(a.insert(200));
+
+        assert!(b.insert(1));
+        assert!(b.insert(5));
+        assert!(b.insert(9));
+        assert!(b.insert(13));
+        assert!(b.insert(19));
+
+        let expected = [1, 3, 5, 9, 11, 13, 19, 24, 160, 200];
+        let actual: Vec<_> = a.union(&b).collect();
+        assert_eq!(actual, expected);
+    }
+
+    #[test]
+    fn test_bit_set_subset() {
+        let mut set1 = BitSet::new();
+        let mut set2 = BitSet::new();
+
+        assert!(set1.is_subset(&set2)); //  {}  {}
+        set2.insert(100);
+        assert!(set1.is_subset(&set2)); //  {}  { 1 }
+        set2.insert(200);
+        assert!(set1.is_subset(&set2)); //  {}  { 1, 2 }
+        set1.insert(200);
+        assert!(set1.is_subset(&set2)); //  { 2 }  { 1, 2 }
+        set1.insert(300);
+        assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 1, 2 }
+        set2.insert(300);
+        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3 }
+        set2.insert(400);
+        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3, 4 }
+        set2.remove(100);
+        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 2, 3, 4 }
+        set2.remove(300);
+        assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 2, 4 }
+        set1.remove(300);
+        assert!(set1.is_subset(&set2)); // { 2 }  { 2, 4 }
+    }
+
+    #[test]
+    fn test_bit_set_is_disjoint() {
+        let a = BitSet::from_bytes(&[0b10100010]);
+        let b = BitSet::from_bytes(&[0b01000000]);
+        let c = BitSet::new();
+        let d = BitSet::from_bytes(&[0b00110000]);
+
+        assert!(!a.is_disjoint(&d));
+        assert!(!d.is_disjoint(&a));
+
+        assert!(a.is_disjoint(&b));
+        assert!(a.is_disjoint(&c));
+        assert!(b.is_disjoint(&a));
+        assert!(b.is_disjoint(&c));
+        assert!(c.is_disjoint(&a));
+        assert!(c.is_disjoint(&b));
+    }
+
+    #[test]
+    fn test_bit_set_union_with() {
+        //a should grow to include larger elements
+        let mut a = BitSet::new();
+        a.insert(0);
+        let mut b = BitSet::new();
+        b.insert(5);
+        let expected = BitSet::from_bytes(&[0b10000100]);
+        a.union_with(&b);
+        assert_eq!(a, expected);
+
+        // Standard
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let mut b = BitSet::from_bytes(&[0b01100010]);
+        let c = a.clone();
+        a.union_with(&b);
+        b.union_with(&c);
+        assert_eq!(a.len(), 4);
+        assert_eq!(b.len(), 4);
+    }
+
+    #[test]
+    fn test_bit_set_intersect_with() {
+        // Explicitly 0'ed bits
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let mut b = BitSet::from_bytes(&[0b00000000]);
+        let c = a.clone();
+        a.intersect_with(&b);
+        b.intersect_with(&c);
+        assert!(a.is_empty());
+        assert!(b.is_empty());
+
+        // Uninitialized bits should behave like 0's
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let mut b = BitSet::new();
+        let c = a.clone();
+        a.intersect_with(&b);
+        b.intersect_with(&c);
+        assert!(a.is_empty());
+        assert!(b.is_empty());
+
+        // Standard
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let mut b = BitSet::from_bytes(&[0b01100010]);
+        let c = a.clone();
+        a.intersect_with(&b);
+        b.intersect_with(&c);
+        assert_eq!(a.len(), 2);
+        assert_eq!(b.len(), 2);
+    }
+
+    #[test]
+    fn test_bit_set_difference_with() {
+        // Explicitly 0'ed bits
+        let mut a = BitSet::from_bytes(&[0b00000000]);
+        let b = BitSet::from_bytes(&[0b10100010]);
+        a.difference_with(&b);
+        assert!(a.is_empty());
+
+        // Uninitialized bits should behave like 0's
+        let mut a = BitSet::new();
+        let b = BitSet::from_bytes(&[0b11111111]);
+        a.difference_with(&b);
+        assert!(a.is_empty());
+
+        // Standard
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let mut b = BitSet::from_bytes(&[0b01100010]);
+        let c = a.clone();
+        a.difference_with(&b);
+        b.difference_with(&c);
+        assert_eq!(a.len(), 1);
+        assert_eq!(b.len(), 1);
+    }
+
+    #[test]
+    fn test_bit_set_symmetric_difference_with() {
+        //a should grow to include larger elements
+        let mut a = BitSet::new();
+        a.insert(0);
+        a.insert(1);
+        let mut b = BitSet::new();
+        b.insert(1);
+        b.insert(5);
+        let expected = BitSet::from_bytes(&[0b10000100]);
+        a.symmetric_difference_with(&b);
+        assert_eq!(a, expected);
+
+        let mut a = BitSet::from_bytes(&[0b10100010]);
+        let b = BitSet::new();
+        let c = a.clone();
+        a.symmetric_difference_with(&b);
+        assert_eq!(a, c);
+
+        // Standard
+        let mut a = BitSet::from_bytes(&[0b11100010]);
+        let mut b = BitSet::from_bytes(&[0b01101010]);
+        let c = a.clone();
+        a.symmetric_difference_with(&b);
+        b.symmetric_difference_with(&c);
+        assert_eq!(a.len(), 2);
+        assert_eq!(b.len(), 2);
+    }
+
+    #[test]
+    fn test_bit_set_eq() {
+        let a = BitSet::from_bytes(&[0b10100010]);
+        let b = BitSet::from_bytes(&[0b00000000]);
+        let c = BitSet::new();
+
+        assert!(a == a);
+        assert!(a != b);
+        assert!(a != c);
+        assert!(b == b);
+        assert!(b == c);
+        assert!(c == c);
+    }
+
+    #[test]
+    fn test_bit_set_cmp() {
+        let a = BitSet::from_bytes(&[0b10100010]);
+        let b = BitSet::from_bytes(&[0b00000000]);
+        let c = BitSet::new();
+
+        assert_eq!(a.cmp(&b), Greater);
+        assert_eq!(a.cmp(&c), Greater);
+        assert_eq!(b.cmp(&a), Less);
+        assert_eq!(b.cmp(&c), Equal);
+        assert_eq!(c.cmp(&a), Less);
+        assert_eq!(c.cmp(&b), Equal);
+    }
+
+    #[test]
+    fn test_bit_vec_remove() {
+        let mut a = BitSet::new();
+
+        assert!(a.insert(1));
+        assert!(a.remove(1));
+
+        assert!(a.insert(100));
+        assert!(a.remove(100));
+
+        assert!(a.insert(1000));
+        assert!(a.remove(1000));
+        a.shrink_to_fit();
+    }
+
+    #[test]
+    fn test_bit_vec_clone() {
+        let mut a = BitSet::new();
+
+        assert!(a.insert(1));
+        assert!(a.insert(100));
+        assert!(a.insert(1000));
+
+        let mut b = a.clone();
+
+        assert!(a == b);
+
+        assert!(b.remove(1));
+        assert!(a.contains(1));
+
+        assert!(a.remove(1000));
+        assert!(b.contains(1000));
+    }
+
+/*
+    #[test]
+    fn test_bit_set_append() {
+        let mut a = BitSet::new();
+        a.insert(2);
+        a.insert(6);
+
+        let mut b = BitSet::new();
+        b.insert(1);
+        b.insert(3);
+        b.insert(6);
+
+        a.append(&mut b);
+
+        assert_eq!(a.len(), 4);
+        assert_eq!(b.len(), 0);
+        assert!(b.capacity() >= 6);
+
+        assert_eq!(a, BitSet::from_bytes(&[0b01110010]));
+    }
+
+    #[test]
+    fn test_bit_set_split_off() {
+        // Split at 0
+        let mut a = BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                         0b00110011, 0b01101011, 0b10101101]);
+
+        let b = a.split_off(0);
+
+        assert_eq!(a.len(), 0);
+        assert_eq!(b.len(), 21);
+
+        assert_eq!(b, BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                           0b00110011, 0b01101011, 0b10101101]);
+
+        // Split behind last element
+        let mut a = BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                         0b00110011, 0b01101011, 0b10101101]);
+
+        let b = a.split_off(50);
+
+        assert_eq!(a.len(), 21);
+        assert_eq!(b.len(), 0);
+
+        assert_eq!(a, BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                           0b00110011, 0b01101011, 0b10101101]));
+
+        // Split at arbitrary element
+        let mut a = BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                         0b00110011, 0b01101011, 0b10101101]);
+
+        let b = a.split_off(34);
+
+        assert_eq!(a.len(), 12);
+        assert_eq!(b.len(), 9);
+
+        assert_eq!(a, BitSet::from_bytes(&[0b10100000, 0b00010010, 0b10010010,
+                                           0b00110011, 0b01000000]));
+        assert_eq!(b, BitSet::from_bytes(&[0, 0, 0, 0,
+                                           0b00101011, 0b10101101]));
+    }
+*/
+}
+
+#[cfg(all(test, feature = "nightly"))]
+mod bench {
+    use super::BitSet;
+    use bit_vec::BitVec;
+    use rand::{Rng, thread_rng, ThreadRng};
+
+    use test::{Bencher, black_box};
+
+    const BENCH_BITS: usize = 1 << 14;
+    const BITS: usize = 32;
+
+    fn rng() -> ThreadRng {
+        thread_rng()
+    }
+
+    #[bench]
+    fn bench_bit_vecset_small(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitSet::new();
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.insert((r.next_u32() as usize) % BITS);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_vecset_big(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitSet::new();
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.insert((r.next_u32() as usize) % BENCH_BITS);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_vecset_iter(b: &mut Bencher) {
+        let bit_vec = BitSet::from_bit_vec(BitVec::from_fn(BENCH_BITS,
+                                              |idx| {idx % 3 == 0}));
+        b.iter(|| {
+            let mut sum = 0;
+            for idx in &bit_vec {
+                sum += idx as usize;
+            }
+            sum
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"26dbdd3f33aeefa6216804c025626b8e2bef5c05103410faa5e6e93f20331cbe","Cargo.toml":"6376bd862fc4827a77190427180ccf86cda76907bf3bd935601840cd03ab48da","LICENSE-APACHE":"8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"2a42423b7acd5af0ee7f47dcc430b267cfe4661ced77131af2d6e97e6a15377a","benches/extern.rs":"30152d15cc55493d06396baf9eebb90c8f32b314f0dc77398ac8a121bd5ff917","crusader.sh":"e656dcb62d5122a64d55f837992e63cfd3beee37cf74c5ab6ff178a3c7ef943e","deploy-docs.sh":"7b66111b124c1c7e59cb84cf110d98b5cb783bd35a676e970d9b3035e55f7dfd","src/bench.rs":"a24345464fdbc70b5b877d13fa1b9da809ba4917e592d5de69f01b8b1340e8bb","src/lib.rs":"b784632ce3f6a16314d1d759310f297941fb5577192ba48a10ae3c6893dd5e24"},"package":"02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/.travis.yml
@@ -0,0 +1,19 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: stable
+    - rust: nightly
+      env: FEATURES="--features nightly"
+script:
+    - cargo build $FEATURES
+    - cargo test $FEATURES
+    - cargo doc --no-deps
+    - bash crusader.sh
+after_success: |
+    [ "$TRAVIS_RUST_VERSION" = nightly ] &&
+    [ "$TRAVIS_BRANCH" = master ] &&
+    [ "$TRAVIS_PULL_REQUEST" = false ] &&
+    bash deploy-docs.sh
+notifications:
+    webhooks: http://huon.me:54857/travis
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "bit-vec"
+version = "0.4.4"
+authors = ["Alexis Beingessner <a.beingessner@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "A vector of bits"
+repository = "https://github.com/contain-rs/bit-vec"
+homepage = "https://github.com/contain-rs/bit-vec"
+documentation = "https://contain-rs.github.io/bit-vec/bit_vec"
+keywords = ["data-structures", "bitvec", "bitmask", "bitmap", "bit"]
+readme = "README.md"
+
+[dev-dependencies]
+rand = "0.3.15"
+
+[features]
+nightly = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/README.md
@@ -0,0 +1,6 @@
+A Vec of bits.
+
+Documentation is available at https://contain-rs.github.io/bit-vec/bit_vec.
+
+[![Build Status](https://travis-ci.org/contain-rs/bit-vec.svg?branch=master)](https://travis-ci.org/contain-rs/bit-vec)
+[![crates.io](http://meritbadge.herokuapp.com/bit-vec)](https://crates.io/crates/bit-vec)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/benches/extern.rs
@@ -0,0 +1,22 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![cfg(all(test, feature = "nightly"))]
+
+#![feature(test)]
+
+extern crate test;
+extern crate rand;
+extern crate bit_vec;
+
+pub use bit_vec::BitVec;
+
+#[path = "../src/bench.rs"]
+mod bench;
new file mode 100755
--- /dev/null
+++ b/third_party/rust/bit-vec/crusader.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+git clone https://github.com/brson/cargo-crusader
+cd cargo-crusader
+cargo build --release
+export PATH=$PATH:`pwd`/target/release/
+cd ../
+
+cargo crusader
+
+exit
new file mode 100755
--- /dev/null
+++ b/third_party/rust/bit-vec/deploy-docs.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+rev=$(git rev-parse --short HEAD)
+
+cd target/doc
+
+git init
+git config user.email 'FlashCat@users.noreply.github.com'
+git config user.name 'FlashCat'
+git remote add upstream "https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git"
+git fetch upstream gh-pages
+git reset upstream/gh-pages
+
+touch .
+
+git add -A .
+git commit -m "rebuild pages at ${rev}"
+git push -q upstream HEAD:gh-pages
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/src/bench.rs
@@ -0,0 +1,116 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use super::BitVec;
+use rand::{Rng, weak_rng, XorShiftRng};
+
+use test::{Bencher, black_box};
+
+const BENCH_BITS : usize = 1 << 14;
+const U32_BITS: usize = 32;
+
+fn rng() -> XorShiftRng {
+    weak_rng()
+}
+
+#[bench]
+fn bench_usize_small(b: &mut Bencher) {
+    let mut r = rng();
+    let mut bit_vec = 0 as usize;
+    b.iter(|| {
+        for _ in 0..100 {
+            bit_vec |= 1 << ((r.next_u32() as usize) % U32_BITS);
+        }
+        black_box(&bit_vec);
+    });
+}
+
+#[bench]
+fn bench_bit_set_big_fixed(b: &mut Bencher) {
+    let mut r = rng();
+    let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
+    b.iter(|| {
+        for _ in 0..100 {
+            bit_vec.set((r.next_u32() as usize) % BENCH_BITS, true);
+        }
+        black_box(&bit_vec);
+    });
+}
+
+#[bench]
+fn bench_bit_set_big_variable(b: &mut Bencher) {
+    let mut r = rng();
+    let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
+    b.iter(|| {
+        for _ in 0..100 {
+            bit_vec.set((r.next_u32() as usize) % BENCH_BITS, r.gen());
+        }
+        black_box(&bit_vec);
+    });
+}
+
+#[bench]
+fn bench_bit_set_small(b: &mut Bencher) {
+    let mut r = rng();
+    let mut bit_vec = BitVec::from_elem(U32_BITS, false);
+    b.iter(|| {
+        for _ in 0..100 {
+            bit_vec.set((r.next_u32() as usize) % U32_BITS, true);
+        }
+        black_box(&bit_vec);
+    });
+}
+
+#[bench]
+fn bench_bit_vec_big_union(b: &mut Bencher) {
+    let mut b1 = BitVec::from_elem(BENCH_BITS, false);
+    let b2 = BitVec::from_elem(BENCH_BITS, false);
+    b.iter(|| {
+        b1.union(&b2)
+    })
+}
+
+#[bench]
+fn bench_bit_vec_small_iter(b: &mut Bencher) {
+    let bit_vec = BitVec::from_elem(U32_BITS, false);
+    b.iter(|| {
+        let mut sum = 0;
+        for _ in 0..10 {
+            for pres in &bit_vec {
+                sum += pres as usize;
+            }
+        }
+        sum
+    })
+}
+
+#[bench]
+fn bench_bit_vec_big_iter(b: &mut Bencher) {
+    let bit_vec = BitVec::from_elem(BENCH_BITS, false);
+    b.iter(|| {
+        let mut sum = 0;
+        for pres in &bit_vec {
+            sum += pres as usize;
+        }
+        sum
+    })
+}
+
+#[bench]
+fn bench_from_elem(b: &mut Bencher) {
+    let cap = black_box(BENCH_BITS);
+    let bit = black_box(true);
+    b.iter(|| {
+        // create a BitVec and popcount it
+        BitVec::from_elem(cap, bit).blocks()
+                                   .fold(0, |acc, b| acc + b.count_ones())
+    });
+    b.bytes = cap as u64 / 8;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bit-vec/src/lib.rs
@@ -0,0 +1,2111 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// FIXME(Gankro): BitVec and BitSet are very tightly coupled. Ideally (for
+// maintenance), they should be in separate files/modules, with BitSet only
+// using BitVec's public API. This will be hard for performance though, because
+// `BitVec` will not want to leak its internal representation while its internal
+// representation as `u32`s must be assumed for best performance.
+
+// FIXME(tbu-): `BitVec`'s methods shouldn't be `union`, `intersection`, but
+// rather `or` and `and`.
+
+// (1) Be careful, most things can overflow here because the amount of bits in
+//     memory can overflow `usize`.
+// (2) Make sure that the underlying vector has no excess length:
+//     E. g. `nbits == 16`, `storage.len() == 2` would be excess length,
+//     because the last word isn't used at all. This is important because some
+//     methods rely on it (for *CORRECTNESS*).
+// (3) Make sure that the unused bits in the last word are zeroed out, again
+//     other methods rely on it for *CORRECTNESS*.
+// (4) `BitSet` is tightly coupled with `BitVec`, so any changes you make in
+// `BitVec` will need to be reflected in `BitSet`.
+
+//! Collections implemented with bit vectors.
+//!
+//! # Examples
+//!
+//! This is a simple example of the [Sieve of Eratosthenes][sieve]
+//! which calculates prime numbers up to a given limit.
+//!
+//! [sieve]: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
+//!
+//! ```
+//! use bit_vec::BitVec;
+//!
+//! let max_prime = 10000;
+//!
+//! // Store the primes as a BitVec
+//! let primes = {
+//!     // Assume all numbers are prime to begin, and then we
+//!     // cross off non-primes progressively
+//!     let mut bv = BitVec::from_elem(max_prime, true);
+//!
+//!     // Neither 0 nor 1 are prime
+//!     bv.set(0, false);
+//!     bv.set(1, false);
+//!
+//!     for i in 2.. 1 + (max_prime as f64).sqrt() as usize {
+//!         // if i is a prime
+//!         if bv[i] {
+//!             // Mark all multiples of i as non-prime (any multiples below i * i
+//!             // will have been marked as non-prime previously)
+//!             for j in i.. {
+//!                 if i * j >= max_prime {
+//!                     break;
+//!                 }
+//!                 bv.set(i * j, false)
+//!             }
+//!         }
+//!     }
+//!     bv
+//! };
+//!
+//! // Simple primality tests below our max bound
+//! let print_primes = 20;
+//! print!("The primes below {} are: ", print_primes);
+//! for x in 0..print_primes {
+//!     if primes.get(x).unwrap_or(false) {
+//!         print!("{} ", x);
+//!     }
+//! }
+//! println!("");
+//!
+//! let num_primes = primes.iter().filter(|x| *x).count();
+//! println!("There are {} primes below {}", num_primes, max_prime);
+//! assert_eq!(num_primes, 1_229);
+//! ```
+
+#![cfg_attr(all(test, feature = "nightly"), feature(test))]
+#[cfg(all(test, feature = "nightly"))] extern crate test;
+#[cfg(all(test, feature = "nightly"))] extern crate rand;
+
+use std::cmp::Ordering;
+use std::cmp;
+use std::fmt;
+use std::hash;
+use std::iter::{Chain, Enumerate, Repeat, Skip, Take, repeat};
+use std::iter::FromIterator;
+use std::slice;
+use std::{u8, usize};
+
+type MutBlocks<'a, B> = slice::IterMut<'a, B>;
+type MatchWords<'a, B> = Chain<Enumerate<Blocks<'a, B>>, Skip<Take<Enumerate<Repeat<B>>>>>;
+
+use std::ops::*;
+
+/// Abstracts over a pile of bits (basically unsigned primitives)
+pub trait BitBlock:
+	Copy +
+	Add<Self, Output=Self> +
+	Sub<Self, Output=Self> +
+	Shl<usize, Output=Self> +
+	Shr<usize, Output=Self> +
+	Not<Output=Self> +
+	BitAnd<Self, Output=Self> +
+	BitOr<Self, Output=Self> +
+	BitXor<Self, Output=Self> +
+	Rem<Self, Output=Self> +
+	Eq +
+	Ord +
+	hash::Hash +
+{
+	/// How many bits it has
+    fn bits() -> usize;
+    /// How many bytes it has
+    #[inline]
+    fn bytes() -> usize { Self::bits() / 8 }
+    /// Convert a byte into this type (lowest-order bits set)
+    fn from_byte(byte: u8) -> Self;
+    /// Count the number of 1's in the bitwise repr
+    fn count_ones(self) -> usize;
+    /// Get `0`
+    fn zero() -> Self;
+    /// Get `1`
+    fn one() -> Self;
+}
+
+macro_rules! bit_block_impl {
+    ($(($t: ty, $size: expr)),*) => ($(
+        impl BitBlock for $t {
+            #[inline]
+            fn bits() -> usize { $size }
+            #[inline]
+            fn from_byte(byte: u8) -> Self { byte as $t }
+            #[inline]
+            fn count_ones(self) -> usize { self.count_ones() as usize }
+            #[inline]
+            fn one() -> Self { 1 }
+            #[inline]
+            fn zero() -> Self { 0 }
+        }
+    )*)
+}
+
+bit_block_impl!{
+    (u8, 8),
+    (u16, 16),
+    (u32, 32),
+    (u64, 64),
+    (usize, std::mem::size_of::<usize>() * 8)
+}
+
+
+fn reverse_bits(byte: u8) -> u8 {
+    let mut result = 0;
+    for i in 0..u8::bits() {
+        result = result | ((byte >> i) & 1) << (u8::bits() - 1 - i);
+    }
+    result
+}
+
+static TRUE: bool = true;
+static FALSE: bool = false;
+
+/// The bitvector type.
+///
+/// # Examples
+///
+/// ```
+/// use bit_vec::BitVec;
+///
+/// let mut bv = BitVec::from_elem(10, false);
+///
+/// // insert all primes less than 10
+/// bv.set(2, true);
+/// bv.set(3, true);
+/// bv.set(5, true);
+/// bv.set(7, true);
+/// println!("{:?}", bv);
+/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
+///
+/// // flip all values in bitvector, producing non-primes less than 10
+/// bv.negate();
+/// println!("{:?}", bv);
+/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
+///
+/// // reset bitvector to empty
+/// bv.clear();
+/// println!("{:?}", bv);
+/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
+/// ```
+pub struct BitVec<B=u32> {
+    /// Internal representation of the bit vector
+    storage: Vec<B>,
+    /// The number of valid bits in the internal representation
+    nbits: usize
+}
+
+// FIXME(Gankro): NopeNopeNopeNopeNope (wait for IndexGet to be a thing)
+impl<B: BitBlock> Index<usize> for BitVec<B> {
+    type Output = bool;
+
+    #[inline]
+    fn index(&self, i: usize) -> &bool {
+        if self.get(i).expect("index out of bounds") {
+            &TRUE
+        } else {
+            &FALSE
+        }
+    }
+}
+
+/// Computes how many blocks are needed to store that many bits
+fn blocks_for_bits<B: BitBlock>(bits: usize) -> usize {
+    // If we want 17 bits, dividing by 32 will produce 0. So we add 1 to make sure we
+    // reserve enough. But if we want exactly a multiple of 32, this will actually allocate
+    // one too many. So we need to check if that's the case. We can do that by computing if
+    // bitwise AND by `32 - 1` is 0. But LLVM should be able to optimize the semantically
+    // superior modulo operator on a power of two to this.
+    //
+    // Note that we can technically avoid this branch with the expression
+    // `(nbits + U32_BITS - 1) / 32::BITS`, but if nbits is almost usize::MAX this will overflow.
+    if bits % B::bits() == 0 {
+        bits / B::bits()
+    } else {
+        bits / B::bits() + 1
+    }
+}
+
+/// Computes the bitmask for the final word of the vector
+fn mask_for_bits<B: BitBlock>(bits: usize) -> B {
+    // Note especially that a perfect multiple of U32_BITS should mask all 1s.
+    (!B::zero()) >> ((B::bits() - bits % B::bits()) % B::bits())
+}
+
+type B = u32;
+
+impl BitVec<u32> {
+
+    /// Creates an empty `BitVec`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    /// let mut bv = BitVec::new();
+    /// ```
+    #[inline]
+    pub fn new() -> Self {
+        Default::default()
+    }
+
+    /// Creates a `BitVec` that holds `nbits` elements, setting each element
+    /// to `bit`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(10, false);
+    /// assert_eq!(bv.len(), 10);
+    /// for x in bv.iter() {
+    ///     assert_eq!(x, false);
+    /// }
+    /// ```
+    #[inline]
+    pub fn from_elem(nbits: usize, bit: bool) -> Self {
+        let nblocks = blocks_for_bits::<B>(nbits);
+        let mut bit_vec = BitVec {
+            storage: vec![if bit { !B::zero() } else { B::zero() }; nblocks],
+            nbits: nbits
+        };
+        bit_vec.fix_last_block();
+        bit_vec
+    }
+
+    /// Constructs a new, empty `BitVec` with the specified capacity.
+    ///
+    /// The bitvector will be able to hold at least `capacity` bits without
+    /// reallocating. If `capacity` is 0, it will not allocate.
+    ///
+    /// It is important to note that this function does not specify the
+    /// *length* of the returned bitvector, but only the *capacity*.
+    #[inline]
+    pub fn with_capacity(nbits: usize) -> Self {
+        BitVec {
+            storage: Vec::with_capacity(blocks_for_bits::<B>(nbits)),
+            nbits: 0,
+        }
+    }
+
+    /// Transforms a byte-vector into a `BitVec`. Each byte becomes eight bits,
+    /// with the most significant bits of each byte coming first. Each
+    /// bit becomes `true` if equal to 1 or `false` if equal to 0.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let bv = BitVec::from_bytes(&[0b10100000, 0b00010010]);
+    /// assert!(bv.eq_vec(&[true, false, true, false,
+    ///                     false, false, false, false,
+    ///                     false, false, false, true,
+    ///                     false, false, true, false]));
+    /// ```
+    pub fn from_bytes(bytes: &[u8]) -> Self {
+        let len = bytes.len().checked_mul(u8::bits()).expect("capacity overflow");
+        let mut bit_vec = BitVec::with_capacity(len);
+        let complete_words = bytes.len() / B::bytes();
+        let extra_bytes = bytes.len() % B::bytes();
+
+        bit_vec.nbits = len;
+
+        for i in 0..complete_words {
+            let mut accumulator = B::zero();
+            for idx in 0..B::bytes() {
+                accumulator = accumulator |
+                    (B::from_byte(reverse_bits(bytes[i * B::bytes() + idx])) << (idx * 8))
+            }
+            bit_vec.storage.push(accumulator);
+        }
+
+        if extra_bytes > 0 {
+            let mut last_word = B::zero();
+            for (i, &byte) in bytes[complete_words * B::bytes()..].iter().enumerate() {
+                last_word = last_word |
+                    (B::from_byte(reverse_bits(byte)) << (i * 8));
+            }
+            bit_vec.storage.push(last_word);
+        }
+
+        bit_vec
+    }
+
+    /// Creates a `BitVec` of the specified length where the value at each index
+    /// is `f(index)`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let bv = BitVec::from_fn(5, |i| { i % 2 == 0 });
+    /// assert!(bv.eq_vec(&[true, false, true, false, true]));
+    /// ```
+    #[inline]
+    pub fn from_fn<F>(len: usize, mut f: F) -> Self
+        where F: FnMut(usize) -> bool
+    {
+        let mut bit_vec = BitVec::from_elem(len, false);
+        for i in 0..len {
+            bit_vec.set(i, f(i));
+        }
+        bit_vec
+    }
+}
+
+impl<B: BitBlock> BitVec<B> {
+    /// Applies the given operation to the blocks of self and other, and sets
+    /// self to be the result. This relies on the caller not to corrupt the
+    /// last word.
+    #[inline]
+    fn process<F>(&mut self, other: &BitVec<B>, mut op: F) -> bool
+    		where F: FnMut(B, B) -> B {
+        assert_eq!(self.len(), other.len());
+        // This could theoretically be a `debug_assert!`.
+        assert_eq!(self.storage.len(), other.storage.len());
+        let mut changed_bits = B::zero();
+        for (a, b) in self.blocks_mut().zip(other.blocks()) {
+            let w = op(*a, b);
+            changed_bits = changed_bits | (*a ^ w);
+            *a = w;
+        }
+        changed_bits != B::zero()
+    }
+
+    /// Iterator over mutable refs to  the underlying blocks of data.
+    #[inline]
+    fn blocks_mut(&mut self) -> MutBlocks<B> {
+        // (2)
+        self.storage.iter_mut()
+    }
+
+    /// Iterator over the underlying blocks of data
+    #[inline]
+    pub fn blocks(&self) -> Blocks<B> {
+        // (2)
+        Blocks{iter: self.storage.iter()}
+    }
+
+    /// Exposes the raw block storage of this BitVec
+    ///
+    /// Only really intended for BitSet.
+    #[inline]
+    pub fn storage(&self) -> &[B] {
+    	&self.storage
+    }
+
+    /// Exposes the raw block storage of this BitVec
+    ///
+    /// Can probably cause unsafety. Only really intended for BitSet.
+    #[inline]
+    pub unsafe fn storage_mut(&mut self) -> &mut Vec<B> {
+    	&mut self.storage
+    }
+
+    /// An operation might screw up the unused bits in the last block of the
+    /// `BitVec`. As per (3), it's assumed to be all 0s. This method fixes it up.
+    fn fix_last_block(&mut self) {
+        let extra_bits = self.len() % B::bits();
+        if extra_bits > 0 {
+            let mask = (B::one() << extra_bits) - B::one();
+            let storage_len = self.storage.len();
+            let block = &mut self.storage[storage_len - 1];
+            *block = *block & mask;
+        }
+    }
+
+
+    /// Retrieves the value at index `i`, or `None` if the index is out of bounds.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let bv = BitVec::from_bytes(&[0b01100000]);
+    /// assert_eq!(bv.get(0), Some(false));
+    /// assert_eq!(bv.get(1), Some(true));
+    /// assert_eq!(bv.get(100), None);
+    ///
+    /// // Can also use array indexing
+    /// assert_eq!(bv[1], true);
+    /// ```
+    #[inline]
+    pub fn get(&self, i: usize) -> Option<bool> {
+        if i >= self.nbits {
+            return None;
+        }
+        let w = i / B::bits();
+        let b = i % B::bits();
+        self.storage.get(w).map(|&block|
+            (block & (B::one() << b)) != B::zero()
+        )
+    }
+
+    /// Sets the value of a bit at an index `i`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `i` is out of bounds.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(5, false);
+    /// bv.set(3, true);
+    /// assert_eq!(bv[3], true);
+    /// ```
+    #[inline]
+    pub fn set(&mut self, i: usize, x: bool) {
+        assert!(i < self.nbits, "index out of bounds: {:?} >= {:?}", i, self.nbits);
+        let w = i / B::bits();
+        let b = i % B::bits();
+        let flag = B::one() << b;
+        let val = if x { self.storage[w] | flag }
+                  else { self.storage[w] & !flag };
+        self.storage[w] = val;
+    }
+
+    /// Sets all bits to 1.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let before = 0b01100000;
+    /// let after  = 0b11111111;
+    ///
+    /// let mut bv = BitVec::from_bytes(&[before]);
+    /// bv.set_all();
+    /// assert_eq!(bv, BitVec::from_bytes(&[after]));
+    /// ```
+    #[inline]
+    pub fn set_all(&mut self) {
+        for w in &mut self.storage { *w = !B::zero(); }
+        self.fix_last_block();
+    }
+
+    /// Flips all bits.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let before = 0b01100000;
+    /// let after  = 0b10011111;
+    ///
+    /// let mut bv = BitVec::from_bytes(&[before]);
+    /// bv.negate();
+    /// assert_eq!(bv, BitVec::from_bytes(&[after]));
+    /// ```
+    #[inline]
+    pub fn negate(&mut self) {
+        for w in &mut self.storage { *w = !*w; }
+        self.fix_last_block();
+    }
+
+    /// Calculates the union of two bitvectors. This acts like the bitwise `or`
+    /// function.
+    ///
+    /// Sets `self` to the union of `self` and `other`. Both bitvectors must be
+    /// the same length. Returns `true` if `self` changed.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the bitvectors are of different lengths.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let a   = 0b01100100;
+    /// let b   = 0b01011010;
+    /// let res = 0b01111110;
+    ///
+    /// let mut a = BitVec::from_bytes(&[a]);
+    /// let b = BitVec::from_bytes(&[b]);
+    ///
+    /// assert!(a.union(&b));
+    /// assert_eq!(a, BitVec::from_bytes(&[res]));
+    /// ```
+    #[inline]
+    pub fn union(&mut self, other: &Self) -> bool {
+        self.process(other, |w1, w2| (w1 | w2))
+    }
+
+    /// Calculates the intersection of two bitvectors. This acts like the
+    /// bitwise `and` function.
+    ///
+    /// Sets `self` to the intersection of `self` and `other`. Both bitvectors
+    /// must be the same length. Returns `true` if `self` changed.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the bitvectors are of different lengths.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let a   = 0b01100100;
+    /// let b   = 0b01011010;
+    /// let res = 0b01000000;
+    ///
+    /// let mut a = BitVec::from_bytes(&[a]);
+    /// let b = BitVec::from_bytes(&[b]);
+    ///
+    /// assert!(a.intersect(&b));
+    /// assert_eq!(a, BitVec::from_bytes(&[res]));
+    /// ```
+    #[inline]
+    pub fn intersect(&mut self, other: &Self) -> bool {
+        self.process(other, |w1, w2| (w1 & w2))
+    }
+
+    /// Calculates the difference between two bitvectors.
+    ///
+    /// Sets each element of `self` to the value of that element minus the
+    /// element of `other` at the same index. Both bitvectors must be the same
+    /// length. Returns `true` if `self` changed.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the bitvectors are of different length.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let a   = 0b01100100;
+    /// let b   = 0b01011010;
+    /// let a_b = 0b00100100; // a - b
+    /// let b_a = 0b00011010; // b - a
+    ///
+    /// let mut bva = BitVec::from_bytes(&[a]);
+    /// let bvb = BitVec::from_bytes(&[b]);
+    ///
+    /// assert!(bva.difference(&bvb));
+    /// assert_eq!(bva, BitVec::from_bytes(&[a_b]));
+    ///
+    /// let bva = BitVec::from_bytes(&[a]);
+    /// let mut bvb = BitVec::from_bytes(&[b]);
+    ///
+    /// assert!(bvb.difference(&bva));
+    /// assert_eq!(bvb, BitVec::from_bytes(&[b_a]));
+    /// ```
+    #[inline]
+    pub fn difference(&mut self, other: &Self) -> bool {
+        self.process(other, |w1, w2| (w1 & !w2))
+    }
+
+    /// Returns `true` if all bits are 1.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(5, true);
+    /// assert_eq!(bv.all(), true);
+    ///
+    /// bv.set(1, false);
+    /// assert_eq!(bv.all(), false);
+    /// ```
+    #[inline]
+    pub fn all(&self) -> bool {
+        let mut last_word = !B::zero();
+        // Check that every block but the last is all-ones...
+        self.blocks().all(|elem| {
+            let tmp = last_word;
+            last_word = elem;
+            tmp == !B::zero()
+        // and then check the last one has enough ones
+        }) && (last_word == mask_for_bits(self.nbits))
+    }
+
+    /// Returns an iterator over the elements of the vector in order.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let bv = BitVec::from_bytes(&[0b01110100, 0b10010010]);
+    /// assert_eq!(bv.iter().filter(|x| *x).count(), 7);
+    /// ```
+    #[inline]
+    pub fn iter(&self) -> Iter<B> {
+        Iter { bit_vec: self, range: 0..self.nbits }
+    }
+
+/*
+    /// Moves all bits from `other` into `Self`, leaving `other` empty.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # #![feature(collections, bit_vec_append_split_off)]
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut a = BitVec::from_bytes(&[0b10000000]);
+    /// let mut b = BitVec::from_bytes(&[0b01100001]);
+    ///
+    /// a.append(&mut b);
+    ///
+    /// assert_eq!(a.len(), 16);
+    /// assert_eq!(b.len(), 0);
+    /// assert!(a.eq_vec(&[true, false, false, false, false, false, false, false,
+    ///                    false, true, true, false, false, false, false, true]));
+    /// ```
+    pub fn append(&mut self, other: &mut Self) {
+        let b = self.len() % B::bits();
+
+        self.nbits += other.len();
+        other.nbits = 0;
+
+        if b == 0 {
+            self.storage.append(&mut other.storage);
+        } else {
+            self.storage.reserve(other.storage.len());
+
+            for block in other.storage.drain(..) {
+            	{
+            		let last = self.storage.last_mut().unwrap();
+                	*last = *last | (block << b);
+                }
+                self.storage.push(block >> (B::bits() - b));
+            }
+        }
+    }
+
+    /// Splits the `BitVec` into two at the given bit,
+    /// retaining the first half in-place and returning the second one.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `at` is out of bounds.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # #![feature(collections, bit_vec_append_split_off)]
+    /// use bit_vec::BitVec;
+    /// let mut a = BitVec::new();
+    /// a.push(true);
+    /// a.push(false);
+    /// a.push(false);
+    /// a.push(true);
+    ///
+    /// let b = a.split_off(2);
+    ///
+    /// assert_eq!(a.len(), 2);
+    /// assert_eq!(b.len(), 2);
+    /// assert!(a.eq_vec(&[true, false]));
+    /// assert!(b.eq_vec(&[false, true]));
+    /// ```
+    pub fn split_off(&mut self, at: usize) -> Self {
+        assert!(at <= self.len(), "`at` out of bounds");
+
+        let mut other = BitVec::new();
+
+        if at == 0 {
+            swap(self, &mut other);
+            return other;
+        } else if at == self.len() {
+            return other;
+        }
+
+        let w = at / B::bits();
+        let b = at % B::bits();
+        other.nbits = self.nbits - at;
+        self.nbits = at;
+        if b == 0 {
+            // Split at block boundary
+            other.storage = self.storage.split_off(w);
+        } else {
+            other.storage.reserve(self.storage.len() - w);
+
+            {
+                let mut iter = self.storage[w..].iter();
+                let mut last = *iter.next().unwrap();
+                for &cur in iter {
+                    other.storage.push((last >> b) | (cur << (B::bits() - b)));
+                    last = cur;
+                }
+                other.storage.push(last >> b);
+            }
+
+            self.storage.truncate(w + 1);
+            self.fix_last_block();
+        }
+
+        other
+    }
+*/
+
+    /// Returns `true` if all bits are 0.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(10, false);
+    /// assert_eq!(bv.none(), true);
+    ///
+    /// bv.set(3, true);
+    /// assert_eq!(bv.none(), false);
+    /// ```
+    #[inline]
+    pub fn none(&self) -> bool {
+        self.blocks().all(|w| w == B::zero())
+    }
+
+    /// Returns `true` if any bit is 1.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(10, false);
+    /// assert_eq!(bv.any(), false);
+    ///
+    /// bv.set(3, true);
+    /// assert_eq!(bv.any(), true);
+    /// ```
+    #[inline]
+    pub fn any(&self) -> bool {
+        !self.none()
+    }
+
+    /// Organises the bits into bytes, such that the first bit in the
+    /// `BitVec` becomes the high-order bit of the first byte. If the
+    /// size of the `BitVec` is not a multiple of eight then trailing bits
+    /// will be filled-in with `false`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(3, true);
+    /// bv.set(1, false);
+    ///
+    /// assert_eq!(bv.to_bytes(), [0b10100000]);
+    ///
+    /// let mut bv = BitVec::from_elem(9, false);
+    /// bv.set(2, true);
+    /// bv.set(8, true);
+    ///
+    /// assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
+    /// ```
+    pub fn to_bytes(&self) -> Vec<u8> {
+    	// Oh lord, we're mapping this to bytes bit-by-bit!
+        fn bit<B: BitBlock>(bit_vec: &BitVec<B>, byte: usize, bit: usize) -> u8 {
+            let offset = byte * 8 + bit;
+            if offset >= bit_vec.nbits {
+                0
+            } else {
+                (bit_vec[offset] as u8) << (7 - bit)
+            }
+        }
+
+        let len = self.nbits / 8 +
+                  if self.nbits % 8 == 0 { 0 } else { 1 };
+        (0..len).map(|i|
+            bit(self, i, 0) |
+            bit(self, i, 1) |
+            bit(self, i, 2) |
+            bit(self, i, 3) |
+            bit(self, i, 4) |
+            bit(self, i, 5) |
+            bit(self, i, 6) |
+            bit(self, i, 7)
+        ).collect()
+    }
+
+    /// Compares a `BitVec` to a slice of `bool`s.
+    /// Both the `BitVec` and slice must have the same length.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the `BitVec` and slice are of different length.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let bv = BitVec::from_bytes(&[0b10100000]);
+    ///
+    /// assert!(bv.eq_vec(&[true, false, true, false,
+    ///                     false, false, false, false]));
+    /// ```
+    #[inline]
+    pub fn eq_vec(&self, v: &[bool]) -> bool {
+        assert_eq!(self.nbits, v.len());
+        self.iter().zip(v.iter().cloned()).all(|(b1, b2)| b1 == b2)
+    }
+
+    /// Shortens a `BitVec`, dropping excess elements.
+    ///
+    /// If `len` is greater than the vector's current length, this has no
+    /// effect.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_bytes(&[0b01001011]);
+    /// bv.truncate(2);
+    /// assert!(bv.eq_vec(&[false, true]));
+    /// ```
+    #[inline]
+    pub fn truncate(&mut self, len: usize) {
+        if len < self.len() {
+            self.nbits = len;
+            // This fixes (2).
+            self.storage.truncate(blocks_for_bits::<B>(len));
+            self.fix_last_block();
+        }
+    }
+
+    /// Reserves capacity for at least `additional` more bits to be inserted in the given
+    /// `BitVec`. The collection may reserve more space to avoid frequent reallocations.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the new capacity overflows `usize`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(3, false);
+    /// bv.reserve(10);
+    /// assert_eq!(bv.len(), 3);
+    /// assert!(bv.capacity() >= 13);
+    /// ```
+    #[inline]
+    pub fn reserve(&mut self, additional: usize) {
+        let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
+        let storage_len = self.storage.len();
+        if desired_cap > self.capacity() {
+            self.storage.reserve(blocks_for_bits::<B>(desired_cap) - storage_len);
+        }
+    }
+
+    /// Reserves the minimum capacity for exactly `additional` more bits to be inserted in the
+    /// given `BitVec`. Does nothing if the capacity is already sufficient.
+    ///
+    /// Note that the allocator may give the collection more space than it requests. Therefore
+    /// capacity can not be relied upon to be precisely minimal. Prefer `reserve` if future
+    /// insertions are expected.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the new capacity overflows `usize`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_elem(3, false);
+    /// bv.reserve(10);
+    /// assert_eq!(bv.len(), 3);
+    /// assert!(bv.capacity() >= 13);
+    /// ```
+    #[inline]
+    pub fn reserve_exact(&mut self, additional: usize) {
+        let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
+        let storage_len = self.storage.len();
+        if desired_cap > self.capacity() {
+            self.storage.reserve_exact(blocks_for_bits::<B>(desired_cap) - storage_len);
+        }
+    }
+
+    /// Returns the capacity in bits for this bit vector. Inserting any
+    /// element less than this amount will not trigger a resizing.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::new();
+    /// bv.reserve(10);
+    /// assert!(bv.capacity() >= 10);
+    /// ```
+    #[inline]
+    pub fn capacity(&self) -> usize {
+        self.storage.capacity().checked_mul(B::bits()).unwrap_or(usize::MAX)
+    }
+
+    /// Grows the `BitVec` in-place, adding `n` copies of `value` to the `BitVec`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the new len overflows a `usize`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_bytes(&[0b01001011]);
+    /// bv.grow(2, true);
+    /// assert_eq!(bv.len(), 10);
+    /// assert_eq!(bv.to_bytes(), [0b01001011, 0b11000000]);
+    /// ```
+    pub fn grow(&mut self, n: usize, value: bool) {
+        // Note: we just bulk set all the bits in the last word in this fn in multiple places
+        // which is technically wrong if not all of these bits are to be used. However, at the end
+        // of this fn we call `fix_last_block` at the end of this fn, which should fix this.
+
+        let new_nbits = self.nbits.checked_add(n).expect("capacity overflow");
+        let new_nblocks = blocks_for_bits::<B>(new_nbits);
+        let full_value = if value { !B::zero() } else { B::zero() };
+
+        // Correct the old tail word, setting or clearing formerly unused bits
+        let num_cur_blocks = blocks_for_bits::<B>(self.nbits);
+        if self.nbits % B::bits() > 0 {
+            let mask = mask_for_bits::<B>(self.nbits);
+            if value {
+            	let block = &mut self.storage[num_cur_blocks - 1];
+                *block = *block | !mask;
+            } else {
+                // Extra bits are already zero by invariant.
+            }
+        }
+
+        // Fill in words after the old tail word
+        let stop_idx = cmp::min(self.storage.len(), new_nblocks);
+        for idx in num_cur_blocks..stop_idx {
+            self.storage[idx] = full_value;
+        }
+
+        // Allocate new words, if needed
+        if new_nblocks > self.storage.len() {
+            let to_add = new_nblocks - self.storage.len();
+            self.storage.extend(repeat(full_value).take(to_add));
+        }
+
+        // Adjust internal bit count
+        self.nbits = new_nbits;
+
+        self.fix_last_block();
+    }
+
+    /// Removes the last bit from the BitVec, and returns it. Returns None if the BitVec is empty.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::from_bytes(&[0b01001001]);
+    /// assert_eq!(bv.pop(), Some(true));
+    /// assert_eq!(bv.pop(), Some(false));
+    /// assert_eq!(bv.len(), 6);
+    /// ```
+    #[inline]
+    pub fn pop(&mut self) -> Option<bool> {
+        if self.is_empty() {
+            None
+        } else {
+            let i = self.nbits - 1;
+            let ret = self[i];
+            // (3)
+            self.set(i, false);
+            self.nbits = i;
+            if self.nbits % B::bits() == 0 {
+                // (2)
+                self.storage.pop();
+            }
+            Some(ret)
+        }
+    }
+
+    /// Pushes a `bool` onto the end.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use bit_vec::BitVec;
+    ///
+    /// let mut bv = BitVec::new();
+    /// bv.push(true);
+    /// bv.push(false);
+    /// assert!(bv.eq_vec(&[true, false]));
+    /// ```
+    #[inline]
+    pub fn push(&mut self, elem: bool) {
+        if self.nbits % B::bits() == 0 {
+            self.storage.push(B::zero());
+        }
+        let insert_pos = self.nbits;
+        self.nbits = self.nbits.checked_add(1).expect("Capacity overflow");
+        self.set(insert_pos, elem);
+    }
+
+    /// Returns the total number of bits in this vector
+    #[inline]
+    pub fn len(&self) -> usize { self.nbits }
+
+    /// Sets the number of bits that this BitVec considers initialized.
+    ///
+    /// Almost certainly can cause bad stuff. Only really intended for BitSet.
+    #[inline]
+    pub unsafe fn set_len(&mut self, len: usize) {
+    	self.nbits = len;
+    }
+
+    /// Returns true if there are no bits in this vector
+    #[inline]
+    pub fn is_empty(&self) -> bool { self.len() == 0 }
+
+    /// Clears all bits in this vector.
+    #[inline]
+    pub fn clear(&mut self) {
+        for w in &mut self.storage { *w = B::zero(); }
+    }
+}
+
+impl<B: BitBlock> Default for BitVec<B> {
+    #[inline]
+    fn default() -> Self { BitVec { storage: Vec::new(), nbits: 0 } }
+}
+
+impl<B: BitBlock> FromIterator<bool> for BitVec<B> {
+    #[inline]
+    fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> Self {
+        let mut ret: Self = Default::default();
+        ret.extend(iter);
+        ret
+    }
+}
+
+impl<B: BitBlock> Extend<bool> for BitVec<B> {
+    #[inline]
+    fn extend<I: IntoIterator<Item=bool>>(&mut self, iterable: I) {
+        let iterator = iterable.into_iter();
+        let (min, _) = iterator.size_hint();
+        self.reserve(min);
+        for element in iterator {
+            self.push(element)
+        }
+    }
+}
+
+impl<B: BitBlock> Clone for BitVec<B> {
+    #[inline]
+    fn clone(&self) -> Self {
+        BitVec { storage: self.storage.clone(), nbits: self.nbits }
+    }
+
+    #[inline]
+    fn clone_from(&mut self, source: &Self) {
+        self.nbits = source.nbits;
+        self.storage.clone_from(&source.storage);
+    }
+}
+
+impl<B: BitBlock> PartialOrd for BitVec<B> {
+    #[inline]
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl<B: BitBlock> Ord for BitVec<B> {
+    #[inline]
+    fn cmp(&self, other: &Self) -> Ordering {
+        let mut a = self.iter();
+        let mut b = other.iter();
+        loop {
+            match (a.next(), b.next()) {
+                (Some(x), Some(y)) => match x.cmp(&y) {
+                    Ordering::Equal => {}
+                    otherwise => return otherwise,
+                },
+                (None, None) => return Ordering::Equal,
+                (None, _) => return Ordering::Less,
+                (_, None) => return Ordering::Greater,
+            }
+        }
+    }
+}
+
+impl<B: BitBlock> fmt::Debug for BitVec<B> {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        for bit in self {
+            try!(write!(fmt, "{}", if bit { 1 } else { 0 }));
+        }
+        Ok(())
+    }
+}
+
+impl<B: BitBlock> hash::Hash for BitVec<B> {
+    #[inline]
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        self.nbits.hash(state);
+        for elem in self.blocks() {
+            elem.hash(state);
+        }
+    }
+}
+
+impl<B: BitBlock> cmp::PartialEq for BitVec<B> {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        if self.nbits != other.nbits {
+            return false;
+        }
+        self.blocks().zip(other.blocks()).all(|(w1, w2)| w1 == w2)
+    }
+}
+
+impl<B: BitBlock> cmp::Eq for BitVec<B> {}
+
+/// An iterator for `BitVec`.
+#[derive(Clone)]
+pub struct Iter<'a, B: 'a = u32> {
+    bit_vec: &'a BitVec<B>,
+    range: Range<usize>,
+}
+
+impl<'a, B: BitBlock> Iterator for Iter<'a, B> {
+    type Item = bool;
+
+    #[inline]
+    fn next(&mut self) -> Option<bool> {
+        // NB: indexing is slow for extern crates when it has to go through &TRUE or &FALSE
+        // variables.  get is more direct, and unwrap is fine since we're sure of the range.
+        self.range.next().map(|i| self.bit_vec.get(i).unwrap())
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.range.size_hint()
+    }
+}
+
+impl<'a, B: BitBlock> DoubleEndedIterator for Iter<'a, B> {
+    #[inline]
+    fn next_back(&mut self) -> Option<bool> {
+        self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
+    }
+}
+
+impl<'a, B: BitBlock> ExactSizeIterator for Iter<'a, B> {}
+
+
+impl<'a, B: BitBlock> IntoIterator for &'a BitVec<B> {
+    type Item = bool;
+    type IntoIter = Iter<'a, B>;
+
+    #[inline]
+    fn into_iter(self) -> Iter<'a, B> {
+        self.iter()
+    }
+}
+
+
+pub struct IntoIter<B=u32> {
+    bit_vec: BitVec<B>,
+    range: Range<usize>,
+}
+
+impl<B: BitBlock> Iterator for IntoIter<B> {
+    type Item = bool;
+
+    #[inline]
+    fn next(&mut self) -> Option<bool> {
+        self.range.next().map(|i| self.bit_vec.get(i).unwrap())
+    }
+}
+
+impl<B: BitBlock> DoubleEndedIterator for IntoIter<B> {
+    #[inline]
+    fn next_back(&mut self) -> Option<bool> {
+        self.range.next_back().map(|i| self.bit_vec.get(i).unwrap())
+    }
+}
+
+impl<B: BitBlock> ExactSizeIterator for IntoIter<B> {}
+
+impl<B: BitBlock> IntoIterator for BitVec<B> {
+    type Item = bool;
+    type IntoIter = IntoIter<B>;
+
+    #[inline]
+    fn into_iter(self) -> IntoIter<B> {
+        let nbits = self.nbits;
+        IntoIter { bit_vec: self, range: 0..nbits }
+    }
+}
+
+/// An iterator over the blocks of a `BitVec`.
+#[derive(Clone)]
+pub struct Blocks<'a, B: 'a> {
+    iter: slice::Iter<'a, B>,
+}
+
+impl<'a, B: BitBlock> Iterator for Blocks<'a, B> {
+    type Item = B;
+
+    #[inline]
+    fn next(&mut self) -> Option<B> {
+        self.iter.next().cloned()
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+impl<'a, B: BitBlock> DoubleEndedIterator for Blocks<'a, B> {
+    #[inline]
+    fn next_back(&mut self) -> Option<B> {
+        self.iter.next_back().cloned()
+    }
+}
+
+impl<'a, B: BitBlock> ExactSizeIterator for Blocks<'a, B> {}
+
+
+
+
+
+
+
+
+
+
+
+#[cfg(test)]
+mod tests {
+    use super::{BitVec, Iter};
+
+    // This is stupid, but I want to differentiate from a "random" 32
+    const U32_BITS: usize = 32;
+
+    #[test]
+    fn test_to_str() {
+        let zerolen = BitVec::new();
+        assert_eq!(format!("{:?}", zerolen), "");
+
+        let eightbits = BitVec::from_elem(8, false);
+        assert_eq!(format!("{:?}", eightbits), "00000000")
+    }
+
+    #[test]
+    fn test_0_elements() {
+        let act = BitVec::new();
+        let exp = Vec::new();
+        assert!(act.eq_vec(&exp));
+        assert!(act.none() && act.all());
+    }
+
+    #[test]
+    fn test_1_element() {
+        let mut act = BitVec::from_elem(1, false);
+        assert!(act.eq_vec(&[false]));
+        assert!(act.none() && !act.all());
+        act = BitVec::from_elem(1, true);
+        assert!(act.eq_vec(&[true]));
+        assert!(!act.none() && act.all());
+    }
+
+    #[test]
+    fn test_2_elements() {
+        let mut b = BitVec::from_elem(2, false);
+        b.set(0, true);
+        b.set(1, false);
+        assert_eq!(format!("{:?}", b), "10");
+        assert!(!b.none() && !b.all());
+    }
+
+    #[test]
+    fn test_10_elements() {
+        let mut act;
+        // all 0
+
+        act = BitVec::from_elem(10, false);
+        assert!((act.eq_vec(
+                    &[false, false, false, false, false, false, false, false, false, false])));
+        assert!(act.none() && !act.all());
+        // all 1
+
+        act = BitVec::from_elem(10, true);
+        assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
+        assert!(!act.none() && act.all());
+        // mixed
+
+        act = BitVec::from_elem(10, false);
+        act.set(0, true);
+        act.set(1, true);
+        act.set(2, true);
+        act.set(3, true);
+        act.set(4, true);
+        assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(10, false);
+        act.set(5, true);
+        act.set(6, true);
+        act.set(7, true);
+        act.set(8, true);
+        act.set(9, true);
+        assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(10, false);
+        act.set(0, true);
+        act.set(3, true);
+        act.set(6, true);
+        act.set(9, true);
+        assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
+        assert!(!act.none() && !act.all());
+    }
+
+    #[test]
+    fn test_31_elements() {
+        let mut act;
+        // all 0
+
+        act = BitVec::from_elem(31, false);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false]));
+        assert!(act.none() && !act.all());
+        // all 1
+
+        act = BitVec::from_elem(31, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true]));
+        assert!(!act.none() && act.all());
+        // mixed
+
+        act = BitVec::from_elem(31, false);
+        act.set(0, true);
+        act.set(1, true);
+        act.set(2, true);
+        act.set(3, true);
+        act.set(4, true);
+        act.set(5, true);
+        act.set(6, true);
+        act.set(7, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(31, false);
+        act.set(16, true);
+        act.set(17, true);
+        act.set(18, true);
+        act.set(19, true);
+        act.set(20, true);
+        act.set(21, true);
+        act.set(22, true);
+        act.set(23, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, true, true, true, true, true, true, true,
+                  false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(31, false);
+        act.set(24, true);
+        act.set(25, true);
+        act.set(26, true);
+        act.set(27, true);
+        act.set(28, true);
+        act.set(29, true);
+        act.set(30, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, true, true, true, true, true, true, true]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(31, false);
+        act.set(3, true);
+        act.set(17, true);
+        act.set(30, true);
+        assert!(act.eq_vec(
+                &[false, false, false, true, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, false, false, false, false, false, false,
+                  false, false, false, false, false, false, true]));
+        assert!(!act.none() && !act.all());
+    }
+
+    #[test]
+    fn test_32_elements() {
+        let mut act;
+        // all 0
+
+        act = BitVec::from_elem(32, false);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false]));
+        assert!(act.none() && !act.all());
+        // all 1
+
+        act = BitVec::from_elem(32, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true, true]));
+        assert!(!act.none() && act.all());
+        // mixed
+
+        act = BitVec::from_elem(32, false);
+        act.set(0, true);
+        act.set(1, true);
+        act.set(2, true);
+        act.set(3, true);
+        act.set(4, true);
+        act.set(5, true);
+        act.set(6, true);
+        act.set(7, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(32, false);
+        act.set(16, true);
+        act.set(17, true);
+        act.set(18, true);
+        act.set(19, true);
+        act.set(20, true);
+        act.set(21, true);
+        act.set(22, true);
+        act.set(23, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, true, true, true, true, true, true, true,
+                  false, false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(32, false);
+        act.set(24, true);
+        act.set(25, true);
+        act.set(26, true);
+        act.set(27, true);
+        act.set(28, true);
+        act.set(29, true);
+        act.set(30, true);
+        act.set(31, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, true, true, true, true, true, true, true, true]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(32, false);
+        act.set(3, true);
+        act.set(17, true);
+        act.set(30, true);
+        act.set(31, true);
+        assert!(act.eq_vec(
+                &[false, false, false, true, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, false, false, false, false, false, false,
+                  false, false, false, false, false, false, true, true]));
+        assert!(!act.none() && !act.all());
+    }
+
+    #[test]
+    fn test_33_elements() {
+        let mut act;
+        // all 0
+
+        act = BitVec::from_elem(33, false);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false]));
+        assert!(act.none() && !act.all());
+        // all 1
+
+        act = BitVec::from_elem(33, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true, true, true, true, true, true, true, true, true,
+                  true, true, true, true, true, true, true]));
+        assert!(!act.none() && act.all());
+        // mixed
+
+        act = BitVec::from_elem(33, false);
+        act.set(0, true);
+        act.set(1, true);
+        act.set(2, true);
+        act.set(3, true);
+        act.set(4, true);
+        act.set(5, true);
+        act.set(6, true);
+        act.set(7, true);
+        assert!(act.eq_vec(
+                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(33, false);
+        act.set(16, true);
+        act.set(17, true);
+        act.set(18, true);
+        act.set(19, true);
+        act.set(20, true);
+        act.set(21, true);
+        act.set(22, true);
+        act.set(23, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, true, true, true, true, true, true, true,
+                  false, false, false, false, false, false, false, false, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(33, false);
+        act.set(24, true);
+        act.set(25, true);
+        act.set(26, true);
+        act.set(27, true);
+        act.set(28, true);
+        act.set(29, true);
+        act.set(30, true);
+        act.set(31, true);
+        assert!(act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, false, false, false, false, false, false,
+                  false, false, true, true, true, true, true, true, true, true, false]));
+        assert!(!act.none() && !act.all());
+        // mixed
+
+        act = BitVec::from_elem(33, false);
+        act.set(3, true);
+        act.set(17, true);
+        act.set(30, true);
+        act.set(31, true);
+        act.set(32, true);
+        assert!(act.eq_vec(
+                &[false, false, false, true, false, false, false, false, false, false, false, false,
+                  false, false, false, false, false, true, false, false, false, false, false, false,
+                  false, false, false, false, false, false, true, true, true]));
+        assert!(!act.none() && !act.all());
+    }
+
+    #[test]
+    fn test_equal_differing_sizes() {
+        let v0 = BitVec::from_elem(10, false);
+        let v1 = BitVec::from_elem(11, false);
+        assert!(v0 != v1);
+    }
+
+    #[test]
+    fn test_equal_greatly_differing_sizes() {
+        let v0 = BitVec::from_elem(10, false);
+        let v1 = BitVec::from_elem(110, false);
+        assert!(v0 != v1);
+    }
+
+    #[test]
+    fn test_equal_sneaky_small() {
+        let mut a = BitVec::from_elem(1, false);
+        a.set(0, true);
+
+        let mut b = BitVec::from_elem(1, true);
+        b.set(0, true);
+
+        assert_eq!(a, b);
+    }
+
+    #[test]
+    fn test_equal_sneaky_big() {
+        let mut a = BitVec::from_elem(100, false);
+        for i in 0..100 {
+            a.set(i, true);
+        }
+
+        let mut b = BitVec::from_elem(100, true);
+        for i in 0..100 {
+            b.set(i, true);
+        }
+
+        assert_eq!(a, b);
+    }
+
+    #[test]
+    fn test_from_bytes() {
+        let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
+        let str = concat!("10110110", "00000000", "11111111");
+        assert_eq!(format!("{:?}", bit_vec), str);
+    }
+
+    #[test]
+    fn test_to_bytes() {
+        let mut bv = BitVec::from_elem(3, true);
+        bv.set(1, false);
+        assert_eq!(bv.to_bytes(), [0b10100000]);
+
+        let mut bv = BitVec::from_elem(9, false);
+        bv.set(2, true);
+        bv.set(8, true);
+        assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
+    }
+
+    #[test]
+    fn test_from_bools() {
+        let bools = vec![true, false, true, true];
+        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+        assert_eq!(format!("{:?}", bit_vec), "1011");
+    }
+
+    #[test]
+    fn test_to_bools() {
+        let bools = vec![false, false, true, false, false, true, true, false];
+        assert_eq!(BitVec::from_bytes(&[0b00100110]).iter().collect::<Vec<bool>>(), bools);
+    }
+
+    #[test]
+    fn test_bit_vec_iterator() {
+        let bools = vec![true, false, true, true];
+        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+
+        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
+
+        let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
+        let bit_vec: BitVec = long.iter().map(|n| *n).collect();
+        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
+    }
+
+    #[test]
+    fn test_small_difference() {
+        let mut b1 = BitVec::from_elem(3, false);
+        let mut b2 = BitVec::from_elem(3, false);
+        b1.set(0, true);
+        b1.set(1, true);
+        b2.set(1, true);
+        b2.set(2, true);
+        assert!(b1.difference(&b2));
+        assert!(b1[0]);
+        assert!(!b1[1]);
+        assert!(!b1[2]);
+    }
+
+    #[test]
+    fn test_big_difference() {
+        let mut b1 = BitVec::from_elem(100, false);
+        let mut b2 = BitVec::from_elem(100, false);
+        b1.set(0, true);
+        b1.set(40, true);
+        b2.set(40, true);
+        b2.set(80, true);
+        assert!(b1.difference(&b2));
+        assert!(b1[0]);
+        assert!(!b1[40]);
+        assert!(!b1[80]);
+    }
+
+    #[test]
+    fn test_small_clear() {
+        let mut b = BitVec::from_elem(14, true);
+        assert!(!b.none() && b.all());
+        b.clear();
+        assert!(b.none() && !b.all());
+    }
+
+    #[test]
+    fn test_big_clear() {
+        let mut b = BitVec::from_elem(140, true);
+        assert!(!b.none() && b.all());
+        b.clear();
+        assert!(b.none() && !b.all());
+    }
+
+    #[test]
+    fn test_bit_vec_lt() {
+        let mut a = BitVec::from_elem(5, false);
+        let mut b = BitVec::from_elem(5, false);
+
+        assert!(!(a < b) && !(b < a));
+        b.set(2, true);
+        assert!(a < b);
+        a.set(3, true);
+        assert!(a < b);
+        a.set(2, true);
+        assert!(!(a < b) && b < a);
+        b.set(0, true);
+        assert!(a < b);
+    }
+
+    #[test]
+    fn test_ord() {
+        let mut a = BitVec::from_elem(5, false);
+        let mut b = BitVec::from_elem(5, false);
+
+        assert!(a <= b && a >= b);
+        a.set(1, true);
+        assert!(a > b && a >= b);
+        assert!(b < a && b <= a);
+        b.set(1, true);
+        b.set(2, true);
+        assert!(b > a && b >= a);
+        assert!(a < b && a <= b);
+    }
+
+
+    #[test]
+    fn test_small_bit_vec_tests() {
+        let v = BitVec::from_bytes(&[0]);
+        assert!(!v.all());
+        assert!(!v.any());
+        assert!(v.none());
+
+        let v = BitVec::from_bytes(&[0b00010100]);
+        assert!(!v.all());
+        assert!(v.any());
+        assert!(!v.none());
+
+        let v = BitVec::from_bytes(&[0xFF]);
+        assert!(v.all());
+        assert!(v.any());
+        assert!(!v.none());
+    }
+
+    #[test]
+    fn test_big_bit_vec_tests() {
+        let v = BitVec::from_bytes(&[ // 88 bits
+            0, 0, 0, 0,
+            0, 0, 0, 0,
+            0, 0, 0]);
+        assert!(!v.all());
+        assert!(!v.any());
+        assert!(v.none());
+
+        let v = BitVec::from_bytes(&[ // 88 bits
+            0, 0, 0b00010100, 0,
+            0, 0, 0, 0b00110100,
+            0, 0, 0]);
+        assert!(!v.all());
+        assert!(v.any());
+        assert!(!v.none());
+
+        let v = BitVec::from_bytes(&[ // 88 bits
+            0xFF, 0xFF, 0xFF, 0xFF,
+            0xFF, 0xFF, 0xFF, 0xFF,
+            0xFF, 0xFF, 0xFF]);
+        assert!(v.all());
+        assert!(v.any());
+        assert!(!v.none());
+    }
+
+    #[test]
+    fn test_bit_vec_push_pop() {
+        let mut s = BitVec::from_elem(5 * U32_BITS - 2, false);
+        assert_eq!(s.len(), 5 * U32_BITS - 2);
+        assert_eq!(s[5 * U32_BITS - 3], false);
+        s.push(true);
+        s.push(true);
+        assert_eq!(s[5 * U32_BITS - 2], true);
+        assert_eq!(s[5 * U32_BITS - 1], true);
+        // Here the internal vector will need to be extended
+        s.push(false);
+        assert_eq!(s[5 * U32_BITS], false);
+        s.push(false);
+        assert_eq!(s[5 * U32_BITS + 1], false);
+        assert_eq!(s.len(), 5 * U32_BITS + 2);
+        // Pop it all off
+        assert_eq!(s.pop(), Some(false));
+        assert_eq!(s.pop(), Some(false));
+        assert_eq!(s.pop(), Some(true));
+        assert_eq!(s.pop(), Some(true));
+        assert_eq!(s.len(), 5 * U32_BITS - 2);
+    }
+
+    #[test]
+    fn test_bit_vec_truncate() {
+        let mut s = BitVec::from_elem(5 * U32_BITS, true);
+
+        assert_eq!(s, BitVec::from_elem(5 * U32_BITS, true));
+        assert_eq!(s.len(), 5 * U32_BITS);
+        s.truncate(4 * U32_BITS);
+        assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
+        assert_eq!(s.len(), 4 * U32_BITS);
+        // Truncating to a size > s.len() should be a noop
+        s.truncate(5 * U32_BITS);
+        assert_eq!(s, BitVec::from_elem(4 * U32_BITS, true));
+        assert_eq!(s.len(), 4 * U32_BITS);
+        s.truncate(3 * U32_BITS - 10);
+        assert_eq!(s, BitVec::from_elem(3 * U32_BITS - 10, true));
+        assert_eq!(s.len(), 3 * U32_BITS - 10);
+        s.truncate(0);
+        assert_eq!(s, BitVec::from_elem(0, true));
+        assert_eq!(s.len(), 0);
+    }
+
+    #[test]
+    fn test_bit_vec_reserve() {
+        let mut s = BitVec::from_elem(5 * U32_BITS, true);
+        // Check capacity
+        assert!(s.capacity() >= 5 * U32_BITS);
+        s.reserve(2 * U32_BITS);
+        assert!(s.capacity() >= 7 * U32_BITS);
+        s.reserve(7 * U32_BITS);
+        assert!(s.capacity() >= 12 * U32_BITS);
+        s.reserve_exact(7 * U32_BITS);
+        assert!(s.capacity() >= 12 * U32_BITS);
+        s.reserve(7 * U32_BITS + 1);
+        assert!(s.capacity() >= 12 * U32_BITS + 1);
+        // Check that length hasn't changed
+        assert_eq!(s.len(), 5 * U32_BITS);
+        s.push(true);
+        s.push(false);
+        s.push(true);
+        assert_eq!(s[5 * U32_BITS - 1], true);
+        assert_eq!(s[5 * U32_BITS - 0], true);
+        assert_eq!(s[5 * U32_BITS + 1], false);
+        assert_eq!(s[5 * U32_BITS + 2], true);
+    }
+
+    #[test]
+    fn test_bit_vec_grow() {
+        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
+        bit_vec.grow(32, true);
+        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                     0xFF, 0xFF, 0xFF, 0xFF]));
+        bit_vec.grow(64, false);
+        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                     0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0]));
+        bit_vec.grow(16, true);
+        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                     0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF]));
+    }
+
+    #[test]
+    fn test_bit_vec_extend() {
+        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
+        let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
+        bit_vec.extend(ext.iter());
+        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111,
+                                     0b01001001, 0b10010010, 0b10111101]));
+    }
+
+/* nightly
+    #[test]
+    fn test_bit_vec_append() {
+        // Append to BitVec that holds a multiple of U32_BITS bits
+        let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011]);
+        let mut b = BitVec::new();
+        b.push(false);
+        b.push(true);
+        b.push(true);
+
+        a.append(&mut b);
+
+        assert_eq!(a.len(), 35);
+        assert_eq!(b.len(), 0);
+        assert!(b.capacity() >= 3);
+
+        assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
+                           false, false, false, true, false, false, true, false,
+                           true, false, false, true, false, false, true, false,
+                           false, false, true, true, false, false, true, true,
+                           false, true, true]));
+
+        // Append to arbitrary BitVec
+        let mut a = BitVec::new();
+        a.push(true);
+        a.push(false);
+
+        let mut b = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
+
+        a.append(&mut b);
+
+        assert_eq!(a.len(), 42);
+        assert_eq!(b.len(), 0);
+        assert!(b.capacity() >= 40);
+
+        assert!(a.eq_vec(&[true, false, true, false, true, false, false, false,
+                           false, false, false, false, false, true, false, false,
+                           true, false, true, false, false, true, false, false,
+                           true, false, false, false, true, true, false, false,
+                           true, true, true, false, false, true, false, true,
+                           false, true]));
+
+        // Append to empty BitVec
+        let mut a = BitVec::new();
+        let mut b = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
+
+        a.append(&mut b);
+
+        assert_eq!(a.len(), 40);
+        assert_eq!(b.len(), 0);
+        assert!(b.capacity() >= 40);
+
+        assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
+                           false, false, false, true, false, false, true, false,
+                           true, false, false, true, false, false, true, false,
+                           false, false, true, true, false, false, true, true,
+                           true, false, false, true, false, true, false, true]));
+
+        // Append empty BitVec
+        let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b10010101]);
+        let mut b = BitVec::new();
+
+        a.append(&mut b);
+
+        assert_eq!(a.len(), 40);
+        assert_eq!(b.len(), 0);
+
+        assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
+                           false, false, false, true, false, false, true, false,
+                           true, false, false, true, false, false, true, false,
+                           false, false, true, true, false, false, true, true,
+                           true, false, false, true, false, true, false, true]));
+    }
+
+
+    #[test]
+    fn test_bit_vec_split_off() {
+        // Split at 0
+        let mut a = BitVec::new();
+        a.push(true);
+        a.push(false);
+        a.push(false);
+        a.push(true);
+
+        let b = a.split_off(0);
+
+        assert_eq!(a.len(), 0);
+        assert_eq!(b.len(), 4);
+
+        assert!(b.eq_vec(&[true, false, false, true]));
+
+        // Split at last bit
+        a.truncate(0);
+        a.push(true);
+        a.push(false);
+        a.push(false);
+        a.push(true);
+
+        let b = a.split_off(4);
+
+        assert_eq!(a.len(), 4);
+        assert_eq!(b.len(), 0);
+
+        assert!(a.eq_vec(&[true, false, false, true]));
+
+        // Split at block boundary
+        let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011, 0b11110011]);
+
+        let b = a.split_off(32);
+
+        assert_eq!(a.len(), 32);
+        assert_eq!(b.len(), 8);
+
+        assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
+                           false, false, false, true, false, false, true, false,
+                           true, false, false, true, false, false, true, false,
+                           false, false, true, true, false, false, true, true]));
+        assert!(b.eq_vec(&[true, true, true, true, false, false, true, true]));
+
+        // Don't split at block boundary
+        let mut a = BitVec::from_bytes(&[0b10100000, 0b00010010, 0b10010010, 0b00110011,
+                                         0b01101011, 0b10101101]);
+
+        let b = a.split_off(13);
+
+        assert_eq!(a.len(), 13);
+        assert_eq!(b.len(), 35);
+
+        assert!(a.eq_vec(&[true, false, true, false, false, false, false, false,
+                           false, false, false, true, false]));
+        assert!(b.eq_vec(&[false, true, false, true, false, false, true, false,
+                           false, true, false, false, false, true, true, false,
+                           false, true, true, false, true, true, false, true,
+                           false, true, true,  true, false, true, false, true,
+                           true, false, true]));
+    }
+*/
+
+    #[test]
+    fn test_into_iter() {
+        let bools = vec![true, false, true, true];
+        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+        let mut iter = bit_vec.into_iter();
+        assert_eq!(Some(true), iter.next());
+        assert_eq!(Some(false), iter.next());
+        assert_eq!(Some(true), iter.next());
+        assert_eq!(Some(true), iter.next());
+        assert_eq!(None, iter.next());
+        assert_eq!(None, iter.next());
+
+        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+        let mut iter = bit_vec.into_iter();
+        assert_eq!(Some(true), iter.next_back());
+        assert_eq!(Some(true), iter.next_back());
+        assert_eq!(Some(false), iter.next_back());
+        assert_eq!(Some(true), iter.next_back());
+        assert_eq!(None, iter.next_back());
+        assert_eq!(None, iter.next_back());
+
+        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+        let mut iter = bit_vec.into_iter();
+        assert_eq!(Some(true), iter.next_back());
+        assert_eq!(Some(true), iter.next());
+        assert_eq!(Some(false), iter.next());
+        assert_eq!(Some(true), iter.next_back());
+        assert_eq!(None, iter.next());
+        assert_eq!(None, iter.next_back());
+    }
+
+    #[test]
+    fn iter() {
+        let b = BitVec::with_capacity(10);
+        let _a: Iter = b.iter();
+    }
+}
+
+#[cfg(all(test, feature = "nightly"))] mod bench;
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"fdfea5a7d864e0cc2cc061fd0ce98130afeac453476923382a8710cd7344dcbb","Cargo.toml":"71838a0a4987a0a3e4c7b1eb667c42a763eddacbead07adde45f81407e16dd7c","LICENSE-APACHE":"b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1","LICENSE-MIT":"c5de694d2f7a6084593c7280222149b683f084103f9627be3a22ed5eee4ce86c","README.md":"3bad625ba36a7860645995daa412b0ca65f961c7ab3f75d319e31e200a30067d","benches/benches.rs":"acb562551891b0290f21f12a40bf9c1b5074109488b563e3b014000d095ec427","examples/simple.rs":"b56bfd5a90d9ece110a0e2ac7eece6cec7e8ca92d2af8394d40f33176577e48f","src/lib.rs":"4462b5a8e59e59bbd2322716c34b9761f0a51f55190ff38ee8f936641a64d8fc","tests/tests.rs":"a93a403807d5c6735e04c90a35254a82e00ba1bc72daff778b5cbf6bd37dde1a"},"package":"3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/.travis.yml
@@ -0,0 +1,2 @@
+language: rust
+rust: nightly
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/Cargo.toml
@@ -0,0 +1,27 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "diff"
+version = "0.1.11"
+authors = ["Utkarsh Kukreti <utkarshkukreti@gmail.com>"]
+description = "An LCS based slice and string diffing implementation."
+homepage = "https://github.com/utkarshkukreti/diff.rs"
+documentation = "https://docs.rs/diff"
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/utkarshkukreti/diff.rs"
+[dev-dependencies.quickcheck]
+version = "0.4.1"
+default-features = false
+
+[dev-dependencies.speculate]
+version = "0.0.25"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/LICENSE-MIT
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2015 Utkarsh Kukreti
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/README.md
@@ -0,0 +1,39 @@
+# diff.rs
+
+> An LCS based slice and string diffing implementation.
+
+## Example
+
+```rust
+extern crate diff;
+
+fn main() {
+    let left = "foo\nbar\nbaz\nquux";
+    let right = "foo\nbaz\nbar\nquux";
+
+    for diff in diff::lines(left, right) {
+        match diff {
+            diff::Result::Left(l)    => println!("-{}", l),
+            diff::Result::Both(l, _) => println!(" {}", l),
+            diff::Result::Right(r)   => println!("+{}", r)
+        }
+    }
+}
+```
+
+prints
+
+```
+ foo
+-bar
+ baz
++bar
+ quux
+```
+
+## License
+
+`diff` is primarily distributed under the terms of both the MIT license and the
+Apache License (Version 2.0).
+
+See LICENSE-APACHE, and LICENSE-MIT for details.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/benches/benches.rs
@@ -0,0 +1,44 @@
+#![feature(plugin, test)]
+#![plugin(speculate)]
+
+extern crate diff;
+extern crate test;
+
+speculate! {
+    describe "slice" {
+        bench "empty" |b| {
+            let slice = [0u8; 0];
+            b.iter(|| ::diff::slice(&slice, &slice));
+        }
+
+        bench "10 equal items" |b| {
+            let slice = [0u8; 10];
+            b.iter(|| ::diff::slice(&slice, &slice));
+        }
+
+        bench "10 non-equal items" |b| {
+            let (left, right) = ([0u8; 10], [1u8; 10]);
+            b.iter(|| ::diff::slice(&left, &right));
+        }
+
+        bench "100 equal items" |b| {
+            let slice = [0u8; 100];
+            b.iter(|| ::diff::slice(&slice, &slice));
+        }
+
+        bench "100 non-equal items" |b| {
+            let (left, right) = ([0u8; 100], [1u8; 100]);
+            b.iter(|| ::diff::slice(&left, &right));
+        }
+
+        bench "1000 equal items" |b| {
+            let slice = [0u8; 1000];
+            b.iter(|| ::diff::slice(&slice, &slice));
+        }
+
+        bench "1000 non-equal items" |b| {
+            let (left, right) = ([0u8; 1000], [1u8; 1000]);
+            b.iter(|| ::diff::slice(&left, &right));
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/examples/simple.rs
@@ -0,0 +1,14 @@
+extern crate diff;
+
+fn main() {
+    let left = "foo\nbar\nbaz\nquux";
+    let right = "foo\nbaz\nbar\nquux";
+
+    for diff in diff::lines(left, right) {
+        match diff {
+            diff::Result::Left(l) => println!("-{}", l),
+            diff::Result::Both(l, _) => println!(" {}", l),
+            diff::Result::Right(r) => println!("+{}", r),
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/src/lib.rs
@@ -0,0 +1,126 @@
+use std::cmp;
+
+/// A fragment of a computed diff.
+#[derive(Clone, Debug, PartialEq)]
+pub enum Result<T> {
+    Left(T),
+    Both(T, T),
+    Right(T),
+}
+
+/// Computes the diff between two slices.
+pub fn slice<'a, T: PartialEq>(left: &'a [T], right: &'a [T]) -> Vec<Result<&'a T>> {
+    iter(left.iter(), right.iter())
+}
+
+/// Computes the diff between the lines of two strings.
+pub fn lines<'a>(left: &'a str, right: &'a str) -> Vec<Result<&'a str>> {
+    let mut diff = iter(left.lines(), right.lines());
+    // str::lines() does not yield an empty str at the end if the str ends with
+    // '\n'. We handle this special case by inserting one last diff item,
+    // depending on whether the left string ends with '\n', or the right one,
+    // or both.
+    match (
+        left.as_bytes().last().cloned(),
+        right.as_bytes().last().cloned(),
+    ) {
+        (Some(b'\n'), Some(b'\n')) => {
+            diff.push(Result::Both(&left[left.len()..], &right[right.len()..]))
+        }
+        (Some(b'\n'), _) => diff.push(Result::Left(&left[left.len()..])),
+        (_, Some(b'\n')) => diff.push(Result::Right(&right[right.len()..])),
+        _ => {}
+    }
+    diff
+}
+
+/// Computes the diff between the chars of two strings.
+pub fn chars<'a>(left: &'a str, right: &'a str) -> Vec<Result<char>> {
+    iter(left.chars(), right.chars())
+}
+
+fn iter<I, T>(left: I, right: I) -> Vec<Result<T>>
+where
+    I: Clone + Iterator<Item = T> + DoubleEndedIterator,
+    T: PartialEq,
+{
+    let left_count = left.clone().count();
+    let right_count = right.clone().count();
+    let min_count = cmp::min(left_count, right_count);
+
+    let leading_equals = left.clone()
+        .zip(right.clone())
+        .take_while(|p| p.0 == p.1)
+        .count();
+    let trailing_equals = left.clone()
+        .rev()
+        .zip(right.clone().rev())
+        .take(min_count - leading_equals)
+        .take_while(|p| p.0 == p.1)
+        .count();
+
+    let left_diff_size = left_count - leading_equals - trailing_equals;
+    let right_diff_size = right_count - leading_equals - trailing_equals;
+
+    let table: Vec<Vec<u32>> = {
+        let mut table = vec![vec![0; right_diff_size + 1]; left_diff_size + 1];
+        let left_skip = left.clone().skip(leading_equals).take(left_diff_size);
+        let right_skip = right.clone().skip(leading_equals).take(right_diff_size);
+
+        for (i, l) in left_skip.clone().enumerate() {
+            for (j, r) in right_skip.clone().enumerate() {
+                table[i + 1][j + 1] = if l == r {
+                    table[i][j] + 1
+                } else {
+                    std::cmp::max(table[i][j + 1], table[i + 1][j])
+                };
+            }
+        }
+
+        table
+    };
+
+    let diff = {
+        let mut diff = Vec::with_capacity(left_diff_size + right_diff_size);
+        let mut i = left_diff_size;
+        let mut j = right_diff_size;
+        let mut li = left.clone().rev().skip(trailing_equals);
+        let mut ri = right.clone().rev().skip(trailing_equals);
+
+        loop {
+            if j > 0 && (i == 0 || table[i][j] == table[i][j - 1]) {
+                j -= 1;
+                diff.push(Result::Right(ri.next().unwrap()));
+            } else if i > 0 && (j == 0 || table[i][j] == table[i - 1][j]) {
+                i -= 1;
+                diff.push(Result::Left(li.next().unwrap()));
+            } else if i > 0 && j > 0 {
+                i -= 1;
+                j -= 1;
+                diff.push(Result::Both(li.next().unwrap(), ri.next().unwrap()));
+            } else {
+                break;
+            }
+        }
+
+        diff
+    };
+
+    let diff_size = leading_equals + diff.len() + trailing_equals;
+    let mut total_diff = Vec::with_capacity(diff_size);
+
+    total_diff.extend(
+        left.clone()
+            .zip(right.clone())
+            .take(leading_equals)
+            .map(|(l, r)| Result::Both(l, r)),
+    );
+    total_diff.extend(diff.into_iter().rev());
+    total_diff.extend(
+        left.skip(leading_equals + left_diff_size)
+            .zip(right.skip(leading_equals + right_diff_size))
+            .map(|(l, r)| Result::Both(l, r)),
+    );
+
+    total_diff
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/diff/tests/tests.rs
@@ -0,0 +1,229 @@
+#![feature(plugin)]
+#![plugin(speculate)]
+
+extern crate diff;
+extern crate quickcheck;
+
+use diff::Result::*;
+
+pub fn undiff<T: Clone>(diff: &[::diff::Result<&T>]) -> (Vec<T>, Vec<T>) {
+    let (mut left, mut right) = (vec![], vec![]);
+    for d in diff {
+        match *d {
+            Left(l) => left.push(l.clone()),
+            Both(l, r) => {
+                left.push(l.clone());
+                right.push(r.clone());
+            }
+            Right(r) => right.push(r.clone()),
+        }
+    }
+    (left, right)
+}
+
+pub fn undiff_str<'a>(diff: &[::diff::Result<&'a str>]) -> (Vec<&'a str>, Vec<&'a str>) {
+    let (mut left, mut right) = (vec![], vec![]);
+    for d in diff {
+        match *d {
+            Left(l) => left.push(l),
+            Both(l, r) => {
+                left.push(l);
+                right.push(r);
+            }
+            Right(r) => right.push(r),
+        }
+    }
+    (left, right)
+}
+
+pub fn undiff_chars(diff: &[::diff::Result<char>]) -> (String, String) {
+    let (mut left, mut right) = (vec![], vec![]);
+    for d in diff {
+        match *d {
+            Left(l) => left.push(l),
+            Both(l, r) => {
+                left.push(l);
+                right.push(r);
+            }
+            Right(r) => right.push(r),
+        }
+    }
+    (
+        left.iter().cloned().collect(),
+        right.iter().cloned().collect(),
+    )
+}
+
+speculate! {
+    describe "slice" {
+        fn go<T>(left: &[T], right: &[T], len: usize) where
+            T: Clone + ::std::fmt::Debug + PartialEq
+        {
+            let diff = ::diff::slice(&left, &right);
+            assert_eq!(diff.len(), len);
+            let (left_, right_) = undiff(&diff);
+            assert_eq!(left, &left_[..]);
+            assert_eq!(right, &right_[..]);
+        }
+
+        test "empty slices" {
+            let slice: &[()] = &[];
+            go(&slice, &slice, 0);
+        }
+
+        test "equal + non-empty slices" {
+            let slice = [1, 2, 3];
+            go(&slice, &slice, 3);
+        }
+
+        test "left empty, right non-empty" {
+            let slice = [1, 2, 3];
+            go(&slice, &[], 3);
+        }
+
+        test "left non-empty, right empty" {
+            let slice = [1, 2, 3];
+            go(&[], &slice, 3);
+        }
+
+        test "misc 1" {
+            let left = [1, 2, 3, 4, 1, 3];
+            let right = [1, 4, 1, 1];
+            go(&left, &right, 7);
+        }
+
+        test "misc 2" {
+            let left = [1, 2, 1, 2, 3, 2, 2, 3, 1, 3];
+            let right = [3, 3, 1, 2, 3, 1, 2, 3, 4, 1];
+            go(&left, &right, 14);
+        }
+
+        test "misc 3" {
+            let left = [1, 3, 4];
+            let right = [2, 3, 4];
+            go(&left, &right, 4);
+        }
+
+        test "quickcheck" {
+            fn prop(left: Vec<i32>, right: Vec<i32>) -> bool {
+                let diff = ::diff::slice(&left, &right);
+                let (left_, right_) = undiff(&diff);
+                left == &left_[..] && right == &right_[..]
+            }
+
+            ::quickcheck::quickcheck(prop as fn(Vec<i32>, Vec<i32>) -> bool);
+        }
+    }
+
+    describe "lines" {
+        fn go(left: &str, right: &str, len: usize) {
+            let diff = ::diff::lines(&left, &right);
+            assert_eq!(diff.len(), len);
+            let (left_, right_) = undiff_str(&diff);
+            assert_eq!(left, left_.join("\n"));
+            assert_eq!(right, right_.join("\n"));
+        }
+
+        test "both empty" {
+            go("", "", 0);
+        }
+
+        test "one empty" {
+            go("foo", "", 1);
+            go("", "foo", 1);
+        }
+
+        test "both equal and non-empty" {
+            go("foo\nbar", "foo\nbar", 2);
+        }
+
+        test "misc 1" {
+            go("foo\nbar\nbaz", "foo\nbaz\nquux", 4);
+        }
+
+        test "#10" {
+            go("a\nb\nc", "a\nb\nc\n", 4);
+            go("a\nb\nc\n", "a\nb\nc", 4);
+            let left = "a\nb\n\nc\n\n\n";
+            let right = "a\n\n\nc\n\n";
+            go(left, right, 8);
+            go(right, left, 8);
+        }
+    }
+
+    describe "chars" {
+        fn go(left: &str, right: &str, len: usize) {
+            let diff = ::diff::chars(&left, &right);
+            assert_eq!(diff.len(), len);
+            let (left_, right_) = undiff_chars(&diff);
+            assert_eq!(left, left_);
+            assert_eq!(right, right_);
+        }
+
+        test "both empty" {
+            go("", "", 0);
+        }
+
+        test "one empty" {
+            go("foo", "", 3);
+            go("", "foo", 3);
+        }
+
+        test "both equal and non-empty" {
+            go("foo bar", "foo bar", 7);
+        }
+
+        test "misc 1" {
+            go("foo bar baz", "foo baz quux", 16);
+        }
+    }
+
+    describe "issues" {
+        test "#4" {
+            assert_eq!(::diff::slice(&[1], &[2]), vec![Left(&1),
+                                                       Right(&2)]);
+            assert_eq!(::diff::lines("a", "b"), vec![Left("a"),
+                                                     Right("b")]);
+        }
+
+        test "#6" {
+            // This produced an overflow in the lines computation because it
+            // was not accounting for the fact that the "right" length was
+            // less than the "left" length.
+            let expected = r#"
+BacktraceNode {
+    parents: [
+        BacktraceNode {
+            parents: []
+        },
+        BacktraceNode {
+            parents: [
+                BacktraceNode {
+                    parents: []
+                }
+            ]
+        }
+    ]
+}"#;
+            let actual = r#"
+BacktraceNode {
+    parents: [
+        BacktraceNode {
+            parents: []
+        },
+        BacktraceNode {
+            parents: [
+                BacktraceNode {
+                    parents: []
+                },
+                BacktraceNode {
+                    parents: []
+                }
+            ]
+        }
+    ]
+}"#;
+            ::diff::lines(actual, expected);
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"7022bbb92ecbee4755ff99e9152ff45206c1ae101c889de55e3f8f66654feb2e","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"ef181d3a88c48c794a7f1a97974c83045bfa956eb5b1b8e5efc1f8c92938a135","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"db1787c5c7d2daea87d92c0549976a18bbe0601acb2ab5bd8dc5edb9f2b46e63","README.md":"3b46f46ffd466fc3aa36becb0ce194820b4669ca75d0c186620abef6115317e0","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","completions/docopt-wordlist.bash":"213bf1baea244eeb32af3a24a9ad895212cb538e3cdaee3bfed842b11a2a64d8","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","examples/cargo.rs":"6a5012a3359e574a61607eca0c15add23ea9e312e8f20fb90d6438740483fefd","examples/cp.rs":"35e705c59968c22a965b7ba9afc4b7a3af5d411e929432b2fb6bd2ed08a7c9ce","examples/decode.rs":"85f5033cf6450a771d6be2af819718d316b92fb98b201e247cdbe0eb39039487","examples/hashmap.rs":"9066a7b7192e15b3b667702519645d31926a371bc54ab8d70b211d98458d5a8d","examples/optional_command.rs":"44d8dda079e237ac140b1d81d34d065cb2427a6edb4e60eadaa2c8ceaff0831c","examples/verbose_multiple.rs":"3279c76c7f3bde135deca90085b9f9d5a86ea3bd619e57ddfed35f4200bb5f4a","scripts/mk-testcases":"649f37d391650175c8462171f7a98fce81735c9317630a5eb13db532ddb22976","session.vim":"1d51566b00f8ff2021d56948c1c55f123959f3e24879a6ad9337eccb11fc8fe9","src/dopt.rs":"4bbdd90fca8f71e4d898bc0656d09dce219e255d4b92671716da8fce5180572a","src/lib.rs":"e916a13a1e7f16566b768f4b9906d2d1a7c31a0524767350b1063d9255a03997","src/parse.rs":"e67d4a5ee95a9fcc1aa5c84e78605f32a1c2bbc5e772de9109ae1ce5fac6f16a","src/synonym.rs":"152b89b6f755222f81ebb63fd3d372d7407aa8046522fc1dcc2e40f417cfc65b","src/test/mod.rs":"1f3eb58d5740f8789dea7bdb2815b1313e948c6f5de9ea6d79cad5bbed484114","src/test/suggestions.rs":"51e044db856a424ef12d2bc2eb541ae922b93d81ac5548767c9c638ccd87d388","src/test/testcases.docopt":"13fcd2948a5625b76f93b98ac7b6cb53ef70c119fc2c5f85d2cb67e56bd4e9c3","src/test/testcases.rs":"cbecfab0c82249a7d8ad193ad5e9e10f45a7a41b37e69cfc025a9cdc6c213f04","src/wordlist.rs":"45ccc3441d1abf072c2079f15b7f5a7af68bd2989c99a8acd5554133fa8db7fa"},"package":"d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/.travis.yml
@@ -0,0 +1,15 @@
+language: rust
+rust:
+  - 1.15.0
+  - stable
+  - beta
+  - nightly
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo doc
+  - if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then
+      cd docopt_macros;
+      cargo build --verbose;
+      cargo test --verbose;
+    fi
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/COPYING
@@ -0,0 +1,3 @@
+This project is dual-licensed under the Unlicense and MIT licenses.
+
+You may use this code under the terms of either license.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/Cargo.toml
@@ -0,0 +1,47 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "docopt"
+version = "0.8.3"
+authors = ["Andrew Gallant <jamslam@gmail.com>"]
+description = "Command line argument parsing."
+homepage = "https://github.com/docopt/docopt.rs"
+documentation = "http://burntsushi.net/rustdoc/docopt/"
+readme = "README.md"
+keywords = ["docopt", "argument", "command", "argv"]
+categories = ["command-line-interface"]
+license = "Unlicense/MIT"
+repository = "https://github.com/docopt/docopt.rs"
+
+[lib]
+name = "docopt"
+
+[[bin]]
+name = "docopt-wordlist"
+path = "src/wordlist.rs"
+test = false
+doc = false
+[dependencies.lazy_static]
+version = "1"
+
+[dependencies.regex]
+version = "0.2"
+
+[dependencies.serde]
+version = "1.0"
+
+[dependencies.serde_derive]
+version = "1.0"
+
+[dependencies.strsim]
+version = "0.6"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/LICENSE-MIT
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Andrew Gallant
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/Makefile
@@ -0,0 +1,18 @@
+all:
+	@echo Nothing to do
+
+docs: $(LIB_FILES)
+	cargo doc
+	# WTF is rustdoc doing?
+	in-dir ./target/doc fix-perms
+	rscp ./target/doc/* gopher:~/www/burntsushi.net/rustdoc/
+
+src/test/testcases.rs: src/test/testcases.docopt scripts/mk-testcases
+	./scripts/mk-testcases ./src/test/testcases.docopt > ./src/test/testcases.rs
+
+ctags:
+	ctags --recurse --options=ctags.rust --languages=Rust
+
+push:
+	git push github master
+	git push origin master
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/README.md
@@ -0,0 +1,357 @@
+Docopt for Rust with automatic type based decoding (i.e., data validation).
+This implementation conforms to the
+[official description of Docopt](http://docopt.org/) and
+[passes its test suite](https://github.com/docopt/docopt/pull/201).
+
+[![Build status](https://api.travis-ci.org/docopt/docopt.rs.svg)](https://travis-ci.org/docopt/docopt.rs)
+[![](http://meritbadge.herokuapp.com/docopt)](https://crates.io/crates/docopt)
+
+Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
+
+
+### Current status
+
+Fully functional but the design of the API is up for debate. **I am seeking
+feedback**.
+
+
+### Documentation
+
+<https://docs.rs/docopt>
+
+
+### Installation
+
+This crate is fully compatible with Cargo. Just add it to your `Cargo.toml`:
+
+```toml
+[dependencies]
+docopt = "0.8"
+serde = "1.0" # if you're using `derive(Deserialize)`
+serde_derive = "1.0" # if you're using `derive(Deserialize)`
+```
+
+If you want to use the macro, then add `docopt_macros = "0.8"` instead.
+Note that the **`docopt!` macro only works on a nightly Rust compiler** because
+it is a compiler plugin.
+
+
+### Quick example
+
+Here is a full working example. Notice that you can specify the types of each
+of the named values in the Docopt usage string. Values will be automatically
+converted to those types (or an error will be reported).
+
+```rust
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+const USAGE: &'static str = "
+Naval Fate.
+
+Usage:
+  naval_fate.py ship new <name>...
+  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
+  naval_fate.py ship shoot <x> <y>
+  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
+  naval_fate.py (-h | --help)
+  naval_fate.py --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Moored (anchored) mine.
+  --drifting    Drifting mine.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    flag_speed: isize,
+    flag_drifting: bool,
+    arg_name: Vec<String>,
+    arg_x: Option<i32>,
+    arg_y: Option<i32>,
+    cmd_ship: bool,
+    cmd_mine: bool,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+                            .and_then(|d| d.deserialize())
+                            .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
+```
+
+Here is the same example, but with the use of the `docopt!` macro, which will
+*generate a struct for you*. Note that this uses a compiler plugin, so it only
+works on a **nightly Rust compiler**:
+
+```rust
+#![feature(plugin)]
+#![plugin(docopt_macros)]
+
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+docopt!(Args derive Debug, "
+Naval Fate.
+
+Usage:
+  naval_fate.py ship new <name>...
+  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
+  naval_fate.py ship shoot <x> <y>
+  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
+  naval_fate.py (-h | --help)
+  naval_fate.py --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Moored (anchored) mine.
+  --drifting    Drifting mine.
+");
+
+fn main() {
+    let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
+```
+
+The `Args` struct has one static method defined for it: `docopt`. The method
+returns a normal `Docopt` value, which can be used to set configuration
+options, `argv` and parse or decode command line arguments.
+
+
+### Struct field name mapping
+
+The field names of the struct map like this:
+
+```
+-g            => flag_g
+--group       => flag_group
+--group <arg> => flag_group
+FILE          => arg_FILE
+<file>        => arg_file
+build         => cmd_build
+```
+
+
+### Data validation example
+
+Here's another example that shows how to specify the types of your arguments:
+
+```rust
+#![feature(plugin)]
+#![plugin(docopt_macros)]
+
+#[macro_use]
+extern crate serde_derive;
+
+extern crate docopt;
+
+docopt!(Args, "Usage: add <x> <y>", arg_x: i32, arg_y: i32);
+
+fn main() {
+    let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
+    println!("x: {}, y: {}", args.arg_x, args.arg_y);
+}
+```
+
+In this example, specific type annotations were added. They will be
+automatically inserted into the generated struct. You can override as many (or
+as few) fields as you want. If you don't specify a type, then one of `bool`,
+`u64`, `String` or `Vec<String>` will be chosen depending on the type of
+argument. In this case, both `arg_x` and `arg_y` would have been `String`.
+
+If any value cannot be decoded into a value with the right type, then an error
+will be shown to the user.
+
+And of course, you don't need the macro to do this. You can do the same thing
+with a manually written struct too.
+
+
+### Modeling `rustc`
+
+Here's a selected subset for some of `rustc`'s options. This also shows how to
+restrict values to a list of choices via an `enum` type and demonstrates more
+Docopt features.
+
+```rust
+#![feature(plugin)]
+#![plugin(docopt_macros)]
+
+#[macro_use]
+extern crate serde_derive;
+extern crate serde;
+
+extern crate docopt;
+
+use serde::de;
+
+docopt!(Args derive Debug, "
+Usage: rustc [options] [--cfg SPEC... -L PATH...] INPUT
+       rustc (--help | --version)
+
+Options:
+    -h, --help         Show this message.
+    --version          Show the version of rustc.
+    --cfg SPEC         Configure the compilation environment.
+    -L PATH            Add a directory to the library search path.
+    --emit TYPE        Configure the output that rustc will produce.
+                       Valid values: asm, ir, bc, obj, link.
+    --opt-level LEVEL  Optimize with possible levels 0-3.
+", flag_opt_level: Option<OptLevel>, flag_emit: Option<Emit>);
+
+#[derive(Deserialize, Debug)]
+enum Emit { Asm, Ir, Bc, Obj, Link }
+
+#[derive(Debug)]
+enum OptLevel { Zero, One, Two, Three }
+
+impl<'de> de::Deserialize<'de> for OptLevel {
+    fn deserialize<D>(deserializer: D) -> Result<OptLevel, D::Error>
+        where D: de::Deserializer<'de>
+    {
+        let level = match u8::deserialize(deserializer)? {
+            0 => OptLevel::Zero,
+            1 => OptLevel::One,
+            2 => OptLevel::Two,
+            3 => OptLevel::Three,
+            n => {
+                let value = de::Unexpected::Unsigned(n as u64);
+                let msg = "expected an integer between 0 and 3";
+                return Err(de::Error::invalid_value(value, &msg));
+            }
+        };
+        Ok(level)
+    }
+}
+
+fn main() {
+    let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
+```
+
+### Viewing the generated struct
+
+Generating a struct is pretty magical, but if you want, you can look at it by
+expanding all macros. Say you wrote the above example for `Usage: add <x> <y>`
+into a file called `add.rs`. Then running:
+
+```bash
+rustc -L path/containing/docopt/lib -Z unstable-options --pretty=expanded add.rs
+```
+
+Will show all macros expanded. The `path/containing/docopt/lib` is usually
+`target/debug/deps` or `target/release/deps` in a cargo project. In the generated code, you should be
+able to find the generated struct:
+
+```rust
+struct Args {
+    pub arg_x: int,
+    pub arg_y: int,
+}
+```
+
+
+### Traditional Docopt API
+
+The reference implementation of Docopt returns a Python dictionary with names
+like `<arg>` or `--flag`. If you prefer this access pattern, then you can use
+`docopt::ArgvMap`. The disadvantage is that you have to do all of your type
+conversion manually. Here's the canonical Docopt example with a hash table:
+
+```rust
+extern crate docopt;
+
+use docopt::Docopt;
+
+const USAGE: &'static str = "
+Naval Fate.
+
+Usage:
+  naval_fate.py ship new <name>...
+  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
+  naval_fate.py ship shoot <x> <y>
+  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
+  naval_fate.py (-h | --help)
+  naval_fate.py --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Moored (anchored) mine.
+  --drifting    Drifting mine.
+";
+
+fn main() {
+    let args = Docopt::new(USAGE)
+                      .and_then(|dopt| dopt.parse())
+                      .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+
+    // You can conveniently access values with `get_{bool,count,str,vec}`
+    // functions. If the key doesn't exist (or if, e.g., you use `get_str` on
+    // a switch), then a sensible default value is returned.
+    println!("\nSome values:");
+    println!("  Speed: {}", args.get_str("--speed"));
+    println!("  Drifting? {}", args.get_bool("--drifting"));
+    println!("  Names: {:?}", args.get_vec("<name>"));
+}
+```
+
+### Tab completion support
+
+This particular implementation bundles a command called `docopt-wordlist` that
+can be used to automate tab completion. This repository also collects some
+basic completion support for various shells (currently only bash) in the
+`completions` directory.
+
+You can use them to setup tab completion on your system. It should work with
+any program that uses Docopt (or rather, any program that outputs usage
+messages that look like Docopt). For example, to get tab completion support for
+Cargo, you'll have to install `docopt-wordlist` and add some voodoo to your
+`$HOME/.bash_completion` file (this may vary for other shells).
+
+Here it is step by step:
+
+```bash
+# Download and build `docopt-wordlist` (as part of the Docopt package)
+$ git clone git://github.com/docopt/docopt.rs
+$ cd docopt.rs
+$ cargo build --release
+
+# Now setup tab completion (for bash)
+$ echo "DOCOPT_WORDLIST_BIN=\"$(pwd)/target/release/docopt-wordlist\"" >> $HOME/.bash_completion
+$ echo "source \"$(pwd)/completions/docopt-wordlist.bash\"" >> $HOME/.bash_completion
+$ echo "complete -F _docopt_wordlist_commands cargo" >> $HOME/.bash_completion
+```
+
+My [CSV toolkit](https://github.com/BurntSushi/xsv) is supported too:
+
+```bash
+# shameless plug...
+$ echo "complete -F _docopt_wordlist_commands xsv" >> $HOME/.bash_completion
+```
+
+Note that this is emphatically a first pass. There are several improvements
+that I'd like to make:
+
+1. Take context into account when completing. For example, it should be
+   possible to only show completions that can lead to a valid Docopt match.
+   This may be hard. (i.e., It may require restructuring Docopt's internals.)
+2. Support more shells. (I'll happily accept pull requests on this one. I doubt
+   I'll venture outside of bash any time soon.)
+3. Make tab completion support more seamless. The way it works right now is
+   pretty hacky by intermingling file/directory completion.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/UNLICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/completions/docopt-wordlist.bash
@@ -0,0 +1,79 @@
+# This is your basic tab completion that will work well with commands that
+# have only one usage (i.e., no distinct sub-commands).
+#
+# Completion works by simply taking the command name and running `$cmd --help`
+# to get the usage (which is then parsed for possible completions).
+function _docopt_wordlist {
+  if [ -z "$DOCOPT_WORDLIST_BIN" ]; then
+    DOCOPT_WORDLIST_BIN=/usr/local/bin/docopt-wordlist
+  fi
+
+  cword=$(_get_cword)
+  cmd="${COMP_WORDS[0]}"
+  wordlist=$("$cmd" --help 2>&1 | "$DOCOPT_WORDLIST_BIN")
+  gen "$cword" "$wordlist"
+}
+
+# This is a fancier version of the above that supports commands that have
+# multiple sub-commands (i.e., distinct usages like Cargo).
+#
+# This supports sub-command completion only if `$cmd --list` shows a list of
+# available sub-commands.
+#
+# Otherwise, the usage for the command `a b c d` is taken from the first
+# command that exits successfully:
+#
+#   a b c d --help
+#   a b c --help
+#   a b --help
+#   a --help
+#
+# So for example, if you've typed `cargo test --jo`, then the following
+# happens:
+#
+#   cargo test --jo --help  # error
+#   cargo test --help       # gives 'test' sub-command usage!
+#
+# As a special case, if only the initial command has been typed, then the
+# sub-commands (taken from `$cmd --list`) are added to the wordlist.
+function _docopt_wordlist_commands {
+  if [ -z "$DOCOPT_WORDLIST_BIN" ]; then
+    DOCOPT_WORDLIST_BIN=/usr/local/bin/docopt-wordlist
+  fi
+
+  cword=$(_get_cword)
+  if [ "$COMP_CWORD" = 1 ]; then
+    cmd="${COMP_WORDS[0]}"
+    wordlist=$("$cmd" --help 2>&1 | "$DOCOPT_WORDLIST_BIN")
+    wordlist+=" $("$cmd" --list | egrep '^ +\w' | awk '{print $1}')"
+    gen "$cword" "$wordlist"
+  else
+    for ((i="$COMP_CWORD"; i >= 1; i++)); do
+      cmd="${COMP_WORDS[@]::$i}"
+      wordlist=$($cmd --help 2>&1 | "$DOCOPT_WORDLIST_BIN")
+      if [ $? = 0 ]; then
+        gen "$cword" "$wordlist"
+        break
+      fi
+    done
+  fi
+}
+
+# A helper function for running `compgen`, which is responsible for taking
+# a prefix and presenting possible completions.
+#
+# If the current prefix starts with a `.` or a `/`, then file/directory
+# completion is done. Otherwise, Docopt completion is done. If Docopt
+# completion is empty, then it falls back to file/directory completion.
+function gen {
+  cword="$1"
+  wordlist="$2"
+  if [[ "$cword" = .* || "$cword" = /* ]]; then
+    COMPREPLY=($(compgen -A file -- "$cword"))
+  else
+    COMPREPLY=($(compgen -W "$wordlist" -- "$cword"))
+    if [ -z "$COMPREPLY" ]; then
+      COMPREPLY=($(compgen -A file -- "$cword"))
+    fi
+  fi
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/ctags.rust
@@ -0,0 +1,11 @@
+--langdef=Rust
+--langmap=Rust:.rs
+--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?static[ \t]+([a-zA-Z0-9_]+)/\2/c,consts,static constants/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]+<.*>)?[ \t]+([a-zA-Z0-9_]+)/\3/i,impls,trait implementations/
+--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/cargo.rs
@@ -0,0 +1,59 @@
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+// Write the Docopt usage string.
+const USAGE: &'static str = "
+Rust's package manager
+
+Usage:
+    cargo <command> [<args>...]
+    cargo [options]
+
+Options:
+    -h, --help       Display this message
+    -V, --version    Print version info and exit
+    --list           List installed commands
+    -v, --verbose    Use verbose output
+
+Some common cargo commands are:
+    build       Compile the current project
+    clean       Remove the target directory
+    doc         Build this project's and its dependencies' documentation
+    new         Create a new cargo project
+    run         Build and execute src/main.rs
+    test        Run the tests
+    bench       Run the benchmarks
+    update      Update dependencies listed in Cargo.lock
+
+See 'cargo help <command>' for more information on a specific command.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_command: Option<Command>,
+    arg_args: Vec<String>,
+    flag_list: bool,
+    flag_verbose: bool,
+}
+
+#[derive(Debug, Deserialize)]
+enum Command {
+    Build,
+    Clean,
+    Doc,
+    New,
+    Run,
+    Test,
+    Bench,
+    Update,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.options_first(true).deserialize())
+        .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/cp.rs
@@ -0,0 +1,29 @@
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+// Write the Docopt usage string.
+const USAGE: &'static str = "
+Usage: cp [-a] <source> <dest>
+       cp [-a] <source>... <dir>
+
+Options:
+    -a, --archive  Copy everything.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_source: Vec<String>,
+    arg_dest: String,
+    arg_dir: String,
+    flag_archive: bool,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.deserialize())
+        .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/decode.rs
@@ -0,0 +1,48 @@
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+const USAGE: &'static str = "
+Naval Fate.
+
+Usage:
+  naval_fate.py ship new <name>...
+  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
+  naval_fate.py ship shoot <x> <y>
+  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
+  naval_fate.py (-h | --help)
+  naval_fate.py --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Moored (anchored) mine.
+  --drifting    Drifting mine.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    flag_speed: isize,
+    flag_drifting: bool,
+    arg_name: Vec<String>,
+    arg_x: Option<isize>,
+    arg_y: Option<isize>,
+    cmd_ship: bool,
+    cmd_mine: bool,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.deserialize())
+        .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+
+    println!("\nSome values:");
+    println!("  Speed: {}", args.flag_speed);
+    println!("  Drifting? {}", args.flag_drifting);
+    println!("  Names: {:?}", args.arg_name);
+    println!("  Command 'ship' invoked? {:?}", args.cmd_ship);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/hashmap.rs
@@ -0,0 +1,39 @@
+extern crate docopt;
+
+use docopt::Docopt;
+
+const USAGE: &'static str = "
+Naval Fate.
+
+Usage:
+  naval_fate.py ship new <name>...
+  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
+  naval_fate.py ship shoot <x> <y>
+  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
+  naval_fate.py (-h | --help)
+  naval_fate.py --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Moored (anchored) mine.
+  --drifting    Drifting mine.
+";
+
+fn main() {
+    let version = "1.2.3".to_owned();
+    let args = Docopt::new(USAGE)
+                      .and_then(|dopt| dopt.version(Some(version)).parse())
+                      .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+
+    // You can conveniently access values with `get_{bool,count,str,vec}`
+    // functions. If the key doesn't exist (or if, e.g., you use `get_str` on
+    // a switch), then a sensible default value is returned.
+    println!("\nSome values:");
+    println!("  Speed: {}", args.get_str("--speed"));
+    println!("  Drifting? {}", args.get_bool("--drifting"));
+    println!("  Names: {:?}", args.get_vec("<name>"));
+    println!("  Command 'ship' invoked? {:?}", args.get_bool("ship"));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/optional_command.rs
@@ -0,0 +1,76 @@
+// This example shows how to implement a command with a "catch all."
+//
+// This requires writing your own impl for `Decodable` because docopt's
+// decoder uses `Option<T>` to mean "T may not be present" rather than
+// "T may be present but incorrect."
+
+#[macro_use]
+extern crate serde_derive;
+extern crate serde;
+extern crate docopt;
+
+use docopt::Docopt;
+use serde::de::{Deserialize, Deserializer, Error, Visitor};
+use std::fmt;
+
+// Write the Docopt usage string.
+const USAGE: &'static str = "
+Rust's package manager
+
+Usage:
+    mycli [<command>]
+
+Options:
+    -h, --help       Display this message
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_command: Command,
+}
+
+struct CommandVisitor;
+
+impl<'de> Visitor<'de> for CommandVisitor {
+    type Value = Command;
+
+    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        formatter.write_str("a string A, B or C")
+    }
+
+    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
+        where E: Error
+    {
+        Ok(match s {
+               "" => Command::None,
+               "A" => Command::A,
+               "B" => Command::B,
+               "C" => Command::C,
+               s => Command::Unknown(s.to_string()),
+           })
+    }
+}
+
+impl<'de> Deserialize<'de> for Command {
+    fn deserialize<D>(d: D) -> Result<Command, D::Error>
+        where D: Deserializer<'de>
+    {
+        d.deserialize_str(CommandVisitor)
+    }
+}
+
+#[derive(Debug)]
+enum Command {
+    A,
+    B,
+    C,
+    Unknown(String),
+    None,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.deserialize())
+        .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/examples/verbose_multiple.rs
@@ -0,0 +1,37 @@
+#[macro_use]
+extern crate serde_derive;
+extern crate docopt;
+
+use docopt::Docopt;
+
+// This shows how to implement multiple levels of verbosity.
+//
+// When you have multiple patterns, I think the only way to carry the
+// repeated flag through all of them is to specify it for each pattern
+// explicitly.
+//
+// This is unfortunate.
+const USAGE: &'static str = "
+Usage: cp [options] [-v | -vv | -vvv] <source> <dest>
+       cp [options] [-v | -vv | -vvv] <source>... <dir>
+
+Options:
+    -a, --archive  Copy everything.
+    -v, --verbose  Show extra log output.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_source: Vec<String>,
+    arg_dest: String,
+    arg_dir: String,
+    flag_archive: bool,
+    flag_verbose: usize,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.deserialize())
+        .unwrap_or_else(|e| e.exit());
+    println!("{:?}", args);
+}
new file mode 100755
--- /dev/null
+++ b/third_party/rust/docopt/scripts/mk-testcases
@@ -0,0 +1,80 @@
+#!/usr/bin/env python2
+
+from __future__ import absolute_import, division, print_function
+import argparse
+import json
+import re
+
+retests = re.compile('(.*?)"""(.*?)(r"""|\s*$)', re.DOTALL)
+reinvokes = re.compile('(.+?$)(.+?)\s*(\$|\Z)', re.DOTALL | re.MULTILINE)
+
+p = argparse.ArgumentParser(
+    description="Outputs src/test/testcases.rs to stdout")
+p.add_argument("testcases", metavar="FILE",
+               help="The testcases.docopt language agnostic test suite.")
+args = p.parse_args()
+
+with open(args.testcases) as f:
+    alltests = f.read()
+
+alltests = re.sub('^r"""', '', alltests)
+alltests = re.sub('^\s*#.*$', '', alltests, flags=re.MULTILINE)
+
+tests = []  # [{usage, args, expect}]   (expect is None ==> user-error)
+for m in retests.finditer(alltests):
+    usage, invokes = m.group(1).strip(), m.group(2).strip()
+    assert invokes.startswith('$'), 'Bad test: "%s"' % invokes
+    invokes = re.sub('^\$', '', invokes)
+
+    for mi in reinvokes.finditer(invokes):
+        invoke, expect = mi.group(1).strip(), mi.group(2).strip()
+        err = expect.startswith('"user-error"')
+        tests.append({
+            'usage': usage,
+            'args': invoke.split()[1:],
+            'expect': None if err else json.loads(expect),
+        })
+
+
+def show_test(i, t):
+    def show_expect(e):
+        kvs = []
+        for k, v in e.iteritems():
+            kvs.append('("%s", %s)' % (k, show_value(v)))
+        return ', '.join(kvs)
+    def show_value(v):
+        if v is None:
+            return 'Plain(None)'
+        elif isinstance(v, basestring):
+            return 'Plain(Some("%s".to_string()))' % v
+        elif isinstance(v, bool):
+            return 'Switch(%s)' % ('true' if v else 'false')
+        elif isinstance(v, int):
+            return 'Counted(%d)' % v
+        elif isinstance(v, list):
+            elms = ', '.join(['"%s".to_string()' % el for el in v])
+            return 'List(vec!(%s))' % elms
+        else:
+            raise ValueError('Unrecognized value: "%s" (type: %s)'
+                             % (v, type(v)))
+
+    args = ', '.join(['"%s"' % arg for arg in t['args']])
+    if t['expect'] is None:
+        return 'test_user_error!(test_%d_testcases, "%s", &[%s]);' \
+                % (i, t['usage'], args)
+    else:
+        expect = show_expect(t['expect'])
+        return 'test_expect!(test_%d_testcases, "%s", &[%s], vec!(%s));' \
+                % (i, t['usage'], args, expect)
+
+print(
+"""// !!! ATTENTION !!!
+// This file is automatically generated by `scripts/mk-testcases`.
+// Please do not edit this file directly!
+
+use Value::{{Switch, Counted, Plain, List}};
+use test::{{get_args, map_from_alist, same_args}};
+
+{tests}
+""".format(tests='\n\n'.join([show_test(i, t) for i, t in enumerate(tests)])))
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/session.vim
@@ -0,0 +1,3 @@
+au BufWritePost *.rs silent!make ctags > /dev/null 2>&1
+" let g:syntastic_rust_rustc_fname = "src/lib.rs" 
+" let g:syntastic_rust_rustc_args = "--no-trans" 
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/dopt.rs
@@ -0,0 +1,1006 @@
+use std::collections::HashMap;
+use std::error::Error as StdError;
+use std::fmt::{self, Debug};
+use std::io::{self, Write};
+use std::str::FromStr;
+use std::result;
+
+use regex::{Captures, Regex};
+use serde::de;
+use serde::de::IntoDeserializer;
+
+use parse::Parser;
+use synonym::SynonymMap;
+
+use self::Value::{Switch, Counted, Plain, List};
+use self::Error::{Usage, Argv, NoMatch, Deserialize, WithProgramUsage, Help, Version};
+
+use cap_or_empty;
+
+/// Represents the different types of Docopt errors.
+///
+/// This error type has a lot of variants. In the common case, you probably
+/// don't care why Docopt has failed, and would rather just quit the program
+/// and show an error message instead. The `exit` method defined on the `Error`
+/// type will do just that. It will also set the exit code appropriately
+/// (no error for `--help` or `--version`, but an error code for bad usage,
+/// bad argv, no match or bad decode).
+///
+/// ### Example
+///
+/// Generally, you want to parse the usage string, try to match the argv
+/// and then quit the program if there was an error reported at any point
+/// in that process. This can be achieved like so:
+///
+/// ```no_run
+/// use docopt::Docopt;
+///
+/// const USAGE: &'static str = "
+/// Usage: ...
+/// ";
+///
+/// let args = Docopt::new(USAGE)
+///                   .and_then(|d| d.parse())
+///                   .unwrap_or_else(|e| e.exit());
+/// ```
+#[derive(Debug)]
+pub enum Error {
+    /// Parsing the usage string failed.
+    ///
+    /// This error can only be triggered by the programmer, i.e., the writer
+    /// of the Docopt usage string. This error is usually indicative of a bug
+    /// in your program.
+    Usage(String),
+
+    /// Parsing the argv specified failed.
+    ///
+    /// The payload is a string describing why the arguments provided could not
+    /// be parsed.
+    ///
+    /// This is distinct from `NoMatch` because it will catch errors like
+    /// using flags that aren't defined in the usage string.
+    Argv(String),
+
+    /// The given argv parsed successfully, but it did not match any example
+    /// usage of the program.
+    ///
+    /// Regrettably, there is no descriptive message describing *why* the
+    /// given argv didn't match any of the usage strings.
+    NoMatch,
+
+    /// This indicates a problem deserializing a successful argv match into a
+    /// deserializable value.
+    Deserialize(String),
+
+    /// Parsing failed, and the program usage should be printed next to the
+    /// failure message. Typically this wraps `Argv` and `NoMatch` errors.
+    WithProgramUsage(Box<Error>, String),
+
+    /// Decoding or parsing failed because the command line specified that the
+    /// help message should be printed.
+    Help,
+
+    /// Decoding or parsing failed because the command line specified that the
+    /// version should be printed
+    ///
+    /// The version is included as a payload to this variant.
+    Version(String),
+}
+
+impl Error {
+    /// Return whether this was a fatal error or not.
+    ///
+    /// Non-fatal errors include requests to print the help or version
+    /// information of a program, while fatal errors include those such as
+    /// failing to decode or parse.
+    pub fn fatal(&self) -> bool {
+        match *self {
+            Help | Version(..) => false,
+            Usage(..) | Argv(..) | NoMatch | Deserialize(..) => true,
+            WithProgramUsage(ref b, _) => b.fatal(),
+        }
+    }
+
+    /// Print this error and immediately exit the program.
+    ///
+    /// If the error is non-fatal (e.g., `Help` or `Version`), then the
+    /// error is printed to stdout and the exit status will be `0`. Otherwise,
+    /// when the error is fatal, the error is printed to stderr and the
+    /// exit status will be `1`.
+    pub fn exit(&self) -> ! {
+        if self.fatal() {
+            werr!("{}\n", self);
+            ::std::process::exit(1)
+        } else {
+            let _ = writeln!(&mut io::stdout(), "{}", self);
+            ::std::process::exit(0)
+        }
+    }
+}
+
+type Result<T> = result::Result<T, Error>;
+
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            WithProgramUsage(ref other, ref usage) => {
+                let other = other.to_string();
+                if other.is_empty() {
+                    write!(f, "{}", usage)
+                } else {
+                    write!(f, "{}\n\n{}", other, usage)
+                }
+            }
+            Help => write!(f, ""),
+            NoMatch => write!(f, "Invalid arguments."),
+            Usage(ref s) |
+            Argv(ref s) |
+            Deserialize(ref s) |
+            Version(ref s) => write!(f, "{}", s),
+        }
+    }
+}
+
+impl StdError for Error {
+    fn description(&self) -> &str {
+        match *self {
+            Usage(..) => "invalid usage string",
+            Argv(..) => "failed to parse specified argv",
+            NoMatch => "could not match specified argv",
+            Deserialize(..) => "failed to deserialize",
+            WithProgramUsage(..) => "failed to parse specified argv",
+            Help => "help message requested",
+            Version(..) => "version message requested",
+        }
+    }
+
+    fn cause(&self) -> Option<&StdError> {
+        match *self {
+            WithProgramUsage(ref cause, _) => Some(&**cause),
+            _ => None,
+        }
+    }
+}
+
+impl de::Error for Error {
+    fn custom<T: fmt::Display>(msg: T) -> Self {
+        Error::Deserialize(msg.to_string())
+    }
+}
+
+/// The main Docopt type, which is constructed with a Docopt usage string.
+///
+/// This can be used to match command line arguments to produce a `ArgvMap`.
+#[derive(Clone, Debug)]
+pub struct Docopt {
+    p: Parser,
+    argv: Option<Vec<String>>,
+    options_first: bool,
+    help: bool,
+    version: Option<String>,
+}
+
+impl Docopt {
+    /// Parse the Docopt usage string given.
+    ///
+    /// The `Docopt` value returned may be used immediately to parse command
+    /// line arguments with a default configuration.
+    ///
+    /// If there was a problem parsing the usage string, a `Usage` error
+    /// is returned.
+    pub fn new<S>(usage: S) -> Result<Docopt>
+            where S: ::std::ops::Deref<Target=str> {
+        Parser::new(usage.deref())
+               .map_err(Usage)
+               .map(|p| Docopt {
+                   p: p,
+                   argv: None,
+                   options_first: false,
+                   help: true,
+                   version: None,
+                })
+    }
+
+    /// Parse and deserialize the given argv.
+    ///
+    /// This is a convenience method for
+    /// `parse().and_then(|vals| vals.deserialize())`.
+    ///
+    /// For details on how decoding works, please see the documentation for
+    /// `ArgvMap`.
+    pub fn deserialize<'a, 'de: 'a, D>(&'a self) -> Result<D>
+        where D: de::Deserialize<'de>
+    {
+        self.parse().and_then(|vals| vals.deserialize())
+    }
+
+    /// Parse command line arguments and try to match them against a usage
+    /// pattern specified in the Docopt string.
+    ///
+    /// If there is a match, then an `ArgvMap` is returned, which maps
+    /// flags, commands and arguments to values.
+    ///
+    /// If parsing the command line arguments fails, then an `Argv` error is
+    /// returned. If parsing succeeds but there is no match, then a `NoMatch`
+    /// error is returned. Both of these errors are always returned inside a
+    /// `WithProgramUsage` error.
+    ///
+    /// If special handling of `help` or `version` is enabled (the former is
+    /// enabled by default), then `Help` or `Version` errors are returned
+    /// if `--help` or `--version` is present.
+    pub fn parse(&self) -> Result<ArgvMap> {
+        let argv = self.argv.clone().unwrap_or_else(Docopt::get_argv);
+        let vals =
+            self.p.parse_argv(argv, self.options_first)
+                .map_err(|s| self.err_with_usage(Argv(s)))
+                .and_then(|argv|
+                    match self.p.matches(&argv) {
+                        Some(m) => Ok(ArgvMap { map: m }),
+                        None => Err(self.err_with_usage(NoMatch)),
+                    })?;
+        if self.help && vals.get_bool("--help") {
+            return Err(self.err_with_full_doc(Help));
+        }
+        match self.version {
+            Some(ref v) if vals.get_bool("--version") => {
+                return Err(Version(v.clone()))
+            }
+            _ => {},
+        }
+        Ok(vals)
+    }
+
+    /// Set the argv to be used for Docopt parsing.
+    ///
+    /// By default, when no argv is set, and it is automatically taken from
+    /// `std::env::args()`.
+    ///
+    /// The `argv` given *must* be the full set of `argv` passed to the
+    /// program. e.g., `["cp", "src", "dest"]` is right while `["src", "dest"]`
+    /// is wrong.
+    pub fn argv<I, S>(mut self, argv: I) -> Docopt
+               where I: IntoIterator<Item=S>, S: AsRef<str> {
+        self.argv = Some(
+            argv.into_iter().skip(1).map(|s| s.as_ref().to_owned()).collect()
+        );
+        self
+    }
+
+    /// Enables the "options first" Docopt behavior.
+    ///
+    /// The options first behavior means that all flags *must* appear before
+    /// position arguments. That is, after the first position argument is
+    /// seen, all proceeding arguments are interpreted as positional
+    /// arguments unconditionally.
+    pub fn options_first(mut self, yes: bool) -> Docopt {
+        self.options_first = yes;
+        self
+    }
+
+    /// Enables automatic handling of `--help`.
+    ///
+    /// When this is enabled and `--help` appears anywhere in the arguments,
+    /// then a `Help` error will be returned. You may then use the `exit`
+    /// method on the error value to conveniently quit the program (which will
+    /// print the full usage string to stdout).
+    ///
+    /// Note that for this to work, `--help` must be a valid pattern.
+    ///
+    /// When disabled, there is no special handling of `--help`.
+    pub fn help(mut self, yes: bool) -> Docopt {
+        self.help = yes;
+        self
+    }
+
+    /// Enables automatic handling of `--version`.
+    ///
+    /// When this is enabled and `--version` appears anywhere in the arguments,
+    /// then a `Version(s)` error will be returned, where `s` is the string
+    /// given here. You may then use the `exit` method on the error value to
+    /// convenient quit the program (which will print the version to stdout).
+    ///
+    /// When disabled (a `None` value), there is no special handling of
+    /// `--version`.
+    pub fn version(mut self, version: Option<String>) -> Docopt {
+        self.version = version;
+        self
+    }
+
+    #[doc(hidden)]
+    // Exposed for use in `docopt_macros`.
+    pub fn parser(&self) -> &Parser {
+        &self.p
+    }
+
+    fn err_with_usage(&self, e: Error) -> Error {
+        WithProgramUsage(
+            Box::new(e), self.p.usage.trim().into())
+    }
+
+    fn err_with_full_doc(&self, e: Error) -> Error {
+        WithProgramUsage(
+            Box::new(e), self.p.full_doc.trim().into())
+    }
+
+    fn get_argv() -> Vec<String> {
+        // Hmm, we should probably handle a Unicode decode error here... ---AG
+        ::std::env::args().skip(1).collect()
+    }
+}
+
+/// A map containing matched values from command line arguments.
+///
+/// The keys are just as specified in Docopt: `--flag` for a long flag or
+/// `-f` for a short flag. (If `-f` is a synonym for `--flag`, then either
+/// key will work.) `ARG` or `<arg>` specify a positional argument and `cmd`
+/// specifies a command.
+#[derive(Clone)]
+pub struct ArgvMap {
+    #[doc(hidden)]
+    pub map: SynonymMap<String, Value>,
+}
+
+impl ArgvMap {
+    /// Tries to deserialize the map of values into a struct.
+    ///
+    /// This method should always be called to deserialize a `ArgvMap` into
+    /// a struct. All fields of the struct must map to a corresponding key
+    /// in the `ArgvMap`. To this end, each member must have a special prefix
+    /// corresponding to the different kinds of patterns in Docopt. There are
+    /// three prefixes: `flag_`, `arg_` and `cmd_` which respectively
+    /// correspond to short/long flags, positional arguments and commands.
+    ///
+    /// If a Docopt item has a `-` in its name, then it is converted to an `_`.
+    ///
+    /// # Example
+    ///
+    /// ```rust
+    /// # extern crate docopt;
+    /// #[macro_use]
+    /// extern crate serde_derive;
+    /// # extern crate serde;
+    /// # fn main() {
+    /// use docopt::Docopt;
+    ///
+    /// const USAGE: &'static str = "
+    /// Usage: cargo [options] (build | test)
+    ///        cargo --help
+    ///
+    /// Options: -v, --verbose
+    ///          -h, --help
+    /// ";
+    ///
+    /// #[derive(Deserialize)]
+    /// struct Args {
+    ///   cmd_build: bool,
+    ///   cmd_test: bool,
+    ///   flag_verbose: bool,
+    ///   flag_h: bool,
+    /// }
+    ///
+    /// let argv = || vec!["cargo", "build", "-v"].into_iter();
+    /// let args: Args = Docopt::new(USAGE)
+    ///                         .and_then(|d| d.argv(argv()).deserialize())
+    ///                         .unwrap_or_else(|e| e.exit());
+    /// assert!(args.cmd_build && !args.cmd_test
+    ///         && args.flag_verbose && !args.flag_h);
+    /// # }
+    /// ```
+    ///
+    /// Note that in the above example, `flag_h` is used but `flag_help`
+    /// could also be used. (In fact, both could be used at the same time.)
+    ///
+    /// In this example, only the `bool` type was used, but any type satisfying
+    /// the `Deserialize` trait is valid.
+    pub fn deserialize<'de, T: de::Deserialize<'de>>(self) -> Result<T> {
+        de::Deserialize::deserialize(&mut Deserializer {
+                                              vals: self,
+                                              stack: vec![],
+                                          })
+    }
+
+    /// Finds the value corresponding to `key` and calls `as_bool()` on it.
+    /// If the key does not exist, `false` is returned.
+    pub fn get_bool(&self, key: &str) -> bool {
+        self.find(key).map_or(false, |v| v.as_bool())
+    }
+
+    /// Finds the value corresponding to `key` and calls `as_count()` on it.
+    /// If the key does not exist, `0` is returned.
+    pub fn get_count(&self, key: &str) -> u64 {
+        self.find(key).map_or(0, |v| v.as_count())
+    }
+
+    /// Finds the value corresponding to `key` and calls `as_str()` on it.
+    /// If the key does not exist, `""` is returned.
+    pub fn get_str(&self, key: &str) -> &str {
+        self.find(key).map_or("", |v| v.as_str())
+    }
+
+    /// Finds the value corresponding to `key` and calls `as_vec()` on it.
+    /// If the key does not exist, `vec!()` is returned.
+    pub fn get_vec(&self, key: &str) -> Vec<&str> {
+        self.find(key).map(|v| v.as_vec()).unwrap_or(vec!())
+    }
+
+    /// Return the raw value corresponding to some `key`.
+    ///
+    /// `key` should be a string in the traditional Docopt format. e.g.,
+    /// `<arg>` or `--flag`.
+    pub fn find(&self, key: &str) -> Option<&Value> {
+        self.map.find(&key.into())
+    }
+
+    /// Return the number of values, not including synonyms.
+    pub fn len(&self) -> usize {
+        self.map.len()
+    }
+
+    /// Converts a Docopt key to a struct field name.
+    /// This makes a half-hearted attempt at making the key a valid struct
+    /// field name (like replacing `-` with `_`), but it does not otherwise
+    /// guarantee that the result is a valid struct field name.
+    #[doc(hidden)]
+    pub fn key_to_struct_field(name: &str) -> String {
+        lazy_static! {
+            static ref RE: Regex = regex!(
+                r"^(?:--?(?P<flag>\S+)|(?:(?P<argu>\p{Lu}+)|<(?P<argb>[^>]+)>)|(?P<cmd>\S+))$"
+            );
+        }
+        fn sanitize(name: &str) -> String {
+            name.replace("-", "_")
+        }
+
+        RE.replace(name, |cap: &Captures| {
+            let (flag, cmd) = (
+                cap_or_empty(cap, "flag"),
+                cap_or_empty(cap, "cmd"),
+            );
+            let (argu, argb) = (
+                cap_or_empty(cap, "argu"),
+                cap_or_empty(cap, "argb"),
+            );
+            let (prefix, name) =
+                if !flag.is_empty() {
+                    ("flag_", flag)
+                } else if !argu.is_empty() {
+                    ("arg_", argu)
+                } else if !argb.is_empty() {
+                    ("arg_", argb)
+                } else if !cmd.is_empty() {
+                    ("cmd_", cmd)
+                } else {
+                    panic!("Unknown ArgvMap key: '{}'", name)
+                };
+            let mut prefix = prefix.to_owned();
+            prefix.push_str(&sanitize(name));
+            prefix
+        }).into_owned()
+    }
+
+    /// Converts a struct field name to a Docopt key.
+    #[doc(hidden)]
+    pub fn struct_field_to_key(field: &str) -> String {
+        lazy_static! {
+            static ref FLAG: Regex = regex!(r"^flag_");
+            static ref ARG: Regex = regex!(r"^arg_");
+            static ref LETTERS: Regex = regex!(r"^\p{Lu}+$");
+            static ref CMD: Regex = regex!(r"^cmd_");
+        }
+        fn desanitize(name: &str) -> String {
+            name.replace("_", "-")
+        }
+        let name =
+            if field.starts_with("flag_") {
+                let name = FLAG.replace(field, "");
+                let mut pre_name = (if name.len() == 1 { "-" } else { "--" })
+                                   .to_owned();
+                pre_name.push_str(&*name);
+                pre_name
+            } else if field.starts_with("arg_") {
+                let name = ARG.replace(field, "").into_owned();
+                if LETTERS.is_match(&name) {
+                    name
+                } else {
+                    let mut pre_name = "<".to_owned();
+                    pre_name.push_str(&*name);
+                    pre_name.push('>');
+                    pre_name
+                }
+            } else if field.starts_with("cmd_") {
+                CMD.replace(field, "").into_owned()
+            } else {
+                panic!("Unrecognized struct field: '{}'", field)
+            };
+        desanitize(&*name)
+    }
+}
+
+impl fmt::Debug for ArgvMap {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.len() == 0 {
+            return write!(f, "{{EMPTY}}");
+        }
+
+        // This is a little crazy, but we want to group synonyms with
+        // their keys and sort them for predictable output.
+        let reverse: HashMap<&String, &String> =
+            self.map.synonyms().map(|(from, to)| (to, from)).collect();
+        let mut keys: Vec<&String> = self.map.keys().collect();
+        keys.sort();
+        let mut first = true;
+        for &k in &keys {
+            if !first { write!(f, "\n")?; } else { first = false; }
+            match reverse.get(&k) {
+                None => {
+                    write!(f, "{} => {:?}", k, self.map.get(k))?
+                }
+                Some(s) => {
+                    write!(f, "{}, {} => {:?}", s, k, self.map.get(k))?
+                }
+            }
+        }
+        Ok(())
+    }
+}
+
+/// A matched command line value.
+///
+/// The value can be a boolean, counted repetition, a plain string or a list
+/// of strings.
+///
+/// The various `as_{bool,count,str,vec}` methods provide convenient access
+/// to values without destructuring manually.
+#[derive(Clone, Debug, PartialEq)]
+pub enum Value {
+    /// A boolean value from a flag that has no argument.
+    ///
+    /// The presence of a flag means `true` and the absence of a flag
+    /// means `false`.
+    Switch(bool),
+
+    /// The number of occurrences of a repeated flag.
+    Counted(u64),
+
+    /// A positional or flag argument.
+    ///
+    /// This is `None` when the positional argument or flag is not present.
+    /// Note that it is possible to have `Some("")` for a present but empty
+    /// argument.
+    Plain(Option<String>),
+
+    /// A List of positional or flag arguments.
+    ///
+    /// This list may be empty when no arguments or flags are present.
+    List(Vec<String>),
+}
+
+impl Value {
+    /// Returns the value as a bool.
+    ///
+    /// Counted repetitions are `false` if `0` and `true` otherwise.
+    /// Plain strings are `true` if present and `false` otherwise.
+    /// Lists are `true` if non-empty and `false` otherwise.
+    pub fn as_bool(&self) -> bool {
+        match *self {
+            Switch(b) => b,
+            Counted(n) => n > 0,
+            Plain(None) => false,
+            Plain(Some(_)) => true,
+            List(ref vs) => !vs.is_empty(),
+        }
+    }
+
+    /// Returns the value as a count of the number of times it occurred.
+    ///
+    /// Booleans are `1` if `true` and `0` otherwise.
+    /// Plain strings are `1` if present and `0` otherwise.
+    /// Lists correspond to its length.
+    pub fn as_count(&self) -> u64 {
+        match *self {
+            Switch(b) => if b { 1 } else { 0 },
+            Counted(n) => n,
+            Plain(None) => 0,
+            Plain(Some(_)) => 1,
+            List(ref vs) => vs.len() as u64,
+        }
+    }
+
+    /// Returns the value as a string.
+    ///
+    /// All values return an empty string except for a non-empty plain string.
+    pub fn as_str(&self) -> &str {
+        match *self {
+            Switch(_) | Counted(_) | Plain(None) | List(_) => "",
+            Plain(Some(ref s)) => &**s,
+        }
+    }
+
+    /// Returns the value as a list of strings.
+    ///
+    /// Booleans, repetitions and empty strings correspond to an empty list.
+    /// Plain strings correspond to a list of length `1`.
+    pub fn as_vec(&self) -> Vec<&str> {
+        match *self {
+            Switch(_) | Counted(_) | Plain(None) => vec![],
+            Plain(Some(ref s)) => vec![&**s],
+            List(ref vs) => vs.iter().map(|s| &**s).collect(),
+        }
+    }
+}
+
+/// Deserializer for `ArgvMap` into your own `Deserialize`able types.
+///
+/// In general, you shouldn't have to use this type directly. It is exposed
+/// in case you want to write a generic function that produces a deserializable
+/// value. For example, here's a function that takes a usage string, an argv
+/// and produces a deserializable value:
+///
+/// ```rust
+/// # extern crate docopt;
+/// extern crate serde;
+/// # fn main() {
+/// use docopt::Docopt;
+/// use serde::de::Deserialize;
+///
+/// fn deserialize<'de, D: Deserialize<'de>>(usage: &str, argv: &[&str])
+///                         -> Result<D, docopt::Error> {
+///     Docopt::new(usage)
+///            .and_then(|d| d.argv(argv.iter()).deserialize())
+/// }
+/// # }
+pub struct Deserializer<'de> {
+    vals: ArgvMap,
+    stack: Vec<DeserializerItem<'de>>,
+}
+
+#[derive(Debug)]
+struct DeserializerItem<'de> {
+    key: String,
+    struct_field: &'de str,
+    val: Option<Value>,
+}
+
+macro_rules! derr(
+    ($($arg:tt)*) => (return Err(Deserialize(format!($($arg)*))))
+);
+
+impl<'de> Deserializer<'de> {
+    fn push(&mut self, struct_field: &'de str) {
+        let key = ArgvMap::struct_field_to_key(struct_field);
+        self.stack
+            .push(DeserializerItem {
+                      key: key.clone(),
+                      struct_field: struct_field,
+                      val: self.vals.find(&*key).cloned(),
+                  });
+    }
+
+    fn pop(&mut self) -> Result<DeserializerItem> {
+        match self.stack.pop() {
+            None => derr!("Could not deserialize value into unknown key."),
+            Some(it) => Ok(it),
+        }
+    }
+
+    fn pop_key_val(&mut self) -> Result<(String, Value)> {
+        let it = self.pop()?;
+        match it.val {
+            None => {
+                derr!("Could not find argument '{}' (from struct field '{}').
+Note that each struct field must have the right key prefix, which must
+be one of `cmd_`, `flag_` or `arg_`.",
+                      it.key,
+                      it.struct_field)
+            }
+            Some(v) => Ok((it.key, v)),
+        }
+    }
+
+    fn pop_val(&mut self) -> Result<Value> {
+        let (_, v) = self.pop_key_val()?;
+        Ok(v)
+    }
+
+    fn to_number<T>(&mut self, expect: &str) -> Result<T>
+        where T: FromStr + ToString,
+              <T as FromStr>::Err: Debug
+    {
+        let (k, v) = self.pop_key_val()?;
+        match v {
+            Counted(n) => Ok(n.to_string().parse().unwrap()), // lol
+            _ => {
+                if v.as_str().trim().is_empty() {
+                    Ok("0".parse().unwrap()) // lol
+                } else {
+                    match v.as_str().parse() {
+                        Err(_) => {
+                            derr!("Could not deserialize '{}' to {} for '{}'.",
+                                  v.as_str(),
+                                  expect,
+                                  k)
+                        }
+                        Ok(v) => Ok(v),
+                    }
+                }
+            }
+        }
+    }
+
+    fn to_float(&mut self, expect: &str) -> Result<f64> {
+        let (k, v) = self.pop_key_val()?;
+        match v {
+            Counted(n) => Ok(n as f64),
+            _ => {
+                match v.as_str().parse() {
+                    Err(_) => {
+                        derr!("Could not deserialize '{}' to {} for '{}'.",
+                              v.as_str(),
+                              expect,
+                              k)
+                    }
+                    Ok(v) => Ok(v),
+                }
+            }
+        }
+    }
+}
+
+macro_rules! deserialize_num {
+    ($name:ident, $method:ident, $ty:ty) => (
+        fn $name<V>(self, visitor: V) -> Result<V::Value>
+            where V: de::Visitor<'de>
+        {
+            visitor.$method(self.to_number::<$ty>(stringify!($ty)).map(|n| n as $ty)?)
+        }
+    );
+}
+
+impl<'a, 'de> ::serde::Deserializer<'de> for &'a mut Deserializer<'de> {
+    type Error = Error;
+
+    fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_bool(self.pop_val().map(|v| v.as_bool())?)
+    }
+
+    // wish for stable macro concat_idents!
+    deserialize_num!(deserialize_i8, visit_i8, i8);
+    deserialize_num!(deserialize_i16, visit_i16, i16);
+    deserialize_num!(deserialize_i32, visit_i32, i32);
+    deserialize_num!(deserialize_i64, visit_i64, i64);
+    deserialize_num!(deserialize_u8, visit_u8, u8);
+    deserialize_num!(deserialize_u16, visit_u16, u16);
+    deserialize_num!(deserialize_u32, visit_u32, u32);
+    deserialize_num!(deserialize_u64, visit_u64, u64);
+
+    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_f32(self.to_float("f32").map(|n| n as f32)?)
+    }
+
+    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_f64(self.to_float("f64")?)
+    }
+
+    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        let (k, v) = self.pop_key_val()?;
+        let vstr = v.as_str();
+        match vstr.chars().count() {
+            1 => visitor.visit_char(vstr.chars().next().unwrap()),
+            _ => derr!("Could not deserialize '{}' into char for '{}'.", vstr, k),
+        }
+    }
+
+    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        let s = self.pop_val()?;
+        visitor.visit_str(s.as_str())
+    }
+
+    fn deserialize_string<V>(self, visitor:V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        self.deserialize_str(visitor)
+    }
+
+    fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn  deserialize_option<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        let is_some = match self.stack.last() {
+            None => derr!("Could not deserialize value into unknown key."),
+            Some(it) => it.val.as_ref().map_or(false, |v| v.as_bool()),
+        };
+        if is_some {
+            visitor.visit_some(self)
+        } else {
+            visitor.visit_none()
+        }
+    }
+
+    fn deserialize_unit<V>(self, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        // I don't know what the right thing is here, so just fail for now.
+        panic!("I don't know how to read into a nil value.")
+    }
+
+    fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_unit()
+    }
+
+    fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_newtype_struct(self)
+    }
+
+    fn deserialize_tuple<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn deserialize_tuple_struct<V>(self,
+                                   _name: &'static str,
+                                   _len: usize,
+                                   _visitor: V)
+                                   -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn deserialize_map<V>(self, _visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        unimplemented!()
+    }
+
+    fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        let (key, struct_field, val) = match self.stack.pop() {
+            None => derr!("Could not deserialize value into unknown key."),
+            Some(DeserializerItem {key, struct_field, val}) => (key, struct_field, val),
+        };
+        let list = val.unwrap_or(List(vec![]));
+        let vals = list.as_vec();
+        for val in vals.iter().rev() {
+            self.stack
+                .push(DeserializerItem {
+                          key: key.clone(),
+                          struct_field: struct_field,
+                          val: Some(Plain(Some((*val).into()))),
+                      });
+        }
+        visitor.visit_seq(SeqDeserializer::new(&mut self, vals.len()))
+    }
+
+    fn deserialize_struct<V>(mut self,
+                             _: &str,
+                             fields: &'static [&'static str],
+                             visitor: V)
+                             -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        visitor.visit_seq(StructDeserializer::new(&mut self, fields))
+    }
+
+    fn deserialize_enum<V>(self, _name: &str, variants: &[&str], visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        let v = self.pop_val()?.as_str().to_lowercase();
+        let s = match variants.iter().find(|&n| n.to_lowercase() == v) {
+            Some(s) => s,
+            None => {
+                derr!("Could not match '{}' with any of \
+                           the allowed variants: {:?}",
+                      v,
+                      variants)
+            }
+        };
+        visitor.visit_enum(s.into_deserializer())
+    }
+
+    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        self.deserialize_str(visitor)
+    }
+
+    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
+        where V: de::Visitor<'de>
+    {
+        self.deserialize_any(visitor)
+    }
+}
+
+struct SeqDeserializer<'a, 'de: 'a> {
+    de: &'a mut Deserializer<'de>,
+    len: usize,
+}
+
+impl<'a, 'de> SeqDeserializer<'a, 'de> {
+    fn new(de: &'a mut Deserializer<'de>, len: usize) -> Self {
+        SeqDeserializer { de: de, len: len }
+    }
+}
+
+impl<'a, 'de> de::SeqAccess<'de> for SeqDeserializer<'a, 'de> {
+    type Error = Error;
+
+    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
+        where T: de::DeserializeSeed<'de>
+    {
+        if self.len == 0 {
+            return Ok(None);
+        }
+        self.len -= 1;
+        seed.deserialize(&mut *self.de).map(Some)
+    }
+
+    fn size_hint(&self) -> Option<usize> {
+        return Some(self.len);
+    }
+}
+
+struct StructDeserializer<'a, 'de: 'a> {
+    de: &'a mut Deserializer<'de>,
+    fields: &'static [&'static str],
+}
+
+impl<'a, 'de> StructDeserializer<'a, 'de> {
+    fn new(de: &'a mut Deserializer<'de>, fields: &'static [&'static str]) -> Self {
+        StructDeserializer {
+            de: de,
+            fields: fields,
+        }
+    }
+}
+
+impl<'a, 'de> de::SeqAccess<'de> for StructDeserializer<'a, 'de> {
+    type Error = Error;
+
+    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
+        where T: de::DeserializeSeed<'de>
+    {
+        if self.fields.len() == 0 {
+            return Ok(None);
+        }
+        self.de.push(self.fields[0]);
+        self.fields = &self.fields[1..];
+        seed.deserialize(&mut *self.de).map(Some)
+    }
+
+    fn size_hint(&self) -> Option<usize> {
+        return Some(self.fields.len());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/lib.rs
@@ -0,0 +1,269 @@
+//! Docopt for Rust. This implementation conforms to the
+//! [official description of Docopt](http://docopt.org/) and
+//! [passes its test suite](https://github.com/docopt/docopt/pull/201).
+//!
+//! This library is [on GitHub](https://github.com/docopt/docopt.rs).
+//!
+//! Fundamentally, Docopt is a command line argument parser. The detail that
+//! distinguishes it from most parsers is that the parser is derived from the
+//! usage string. Here's a simple example:
+//!
+//! ```rust
+//! use docopt::Docopt;
+//!
+//! // Write the Docopt usage string.
+//! const USAGE: &'static str = "
+//! Usage: cp [-a] <source> <dest>
+//!        cp [-a] <source>... <dir>
+//!
+//! Options:
+//!     -a, --archive  Copy everything.
+//! ";
+//!
+//! // The argv. Normally you'd just use `parse` which will automatically
+//! // use `std::env::args()`.
+//! let argv = || vec!["cp", "-a", "file1", "file2", "dest/"];
+//!
+//! // Parse argv and exit the program with an error message if it fails.
+//! let args = Docopt::new(USAGE)
+//!                   .and_then(|d| d.argv(argv().into_iter()).parse())
+//!                   .unwrap_or_else(|e| e.exit());
+//!
+//! // Now access your argv values. Synonyms work just fine!
+//! assert!(args.get_bool("-a") && args.get_bool("--archive"));
+//! assert_eq!(args.get_vec("<source>"), vec!["file1", "file2"]);
+//! assert_eq!(args.get_str("<dir>"), "dest/");
+//! assert_eq!(args.get_str("<dest>"), "");
+//! ```
+//!
+//! # Type based decoding
+//!
+//! Often, command line values aren't just strings or booleans---sometimes
+//! they are integers, or enums, or something more elaborate. Using the
+//! standard Docopt interface can be inconvenient for this purpose, because
+//! you'll need to convert all of the values explicitly. Instead, this crate
+//! provides a `Decoder` that converts an `ArgvMap` to your custom struct.
+//! Here is the same example as above using type based decoding:
+//!
+//! ```rust
+//! # extern crate docopt;
+//! #[macro_use]
+//! extern crate serde_derive;
+//! # fn main() {
+//! use docopt::Docopt;
+//!
+//! // Write the Docopt usage string.
+//! const USAGE: &'static str = "
+//! Usage: cp [-a] <source> <dest>
+//!        cp [-a] <source>... <dir>
+//!
+//! Options:
+//!     -a, --archive  Copy everything.
+//! ";
+//!
+//! #[derive(Deserialize)]
+//! struct Args {
+//!     arg_source: Vec<String>,
+//!     arg_dest: String,
+//!     arg_dir: String,
+//!     flag_archive: bool,
+//! }
+//!
+//! let argv = || vec!["cp", "-a", "file1", "file2", "dest/"];
+//! let args: Args = Docopt::new(USAGE)
+//!                         .and_then(|d| d.argv(argv().into_iter()).deserialize())
+//!                         .unwrap_or_else(|e| e.exit());
+//!
+//! // Now access your argv values.
+//! fn s(x: &str) -> String { x.to_string() }
+//! assert!(args.flag_archive);
+//! assert_eq!(args.arg_source, vec![s("file1"), s("file2")]);
+//! assert_eq!(args.arg_dir, s("dest/"));
+//! assert_eq!(args.arg_dest, s(""));
+//! # }
+//! ```
+//!
+//! # Command line arguments for `rustc`
+//!
+//! Here's an example with a subset of `rustc`'s command line arguments that
+//! shows more of Docopt and some of the benefits of type based decoding.
+//!
+//! ```rust
+//! # extern crate docopt;
+//! #[macro_use]
+//! extern crate serde_derive;
+//! extern crate serde;
+//! # fn main() {
+//! # #![allow(non_snake_case)]
+//! use docopt::Docopt;
+//! use std::fmt;
+//!
+//! // Write the Docopt usage string.
+//! const USAGE: &'static str = "
+//! Usage: rustc [options] [--cfg SPEC... -L PATH...] INPUT
+//!        rustc (--help | --version)
+//!
+//! Options:
+//!     -h, --help         Show this message.
+//!     --version          Show the version of rustc.
+//!     --cfg SPEC         Configure the compilation environment.
+//!     -L PATH            Add a directory to the library search path.
+//!     --emit TYPE        Configure the output that rustc will produce.
+//!                        Valid values: asm, ir, bc, obj, link.
+//!     --opt-level LEVEL  Optimize with possible levels 0-3.
+//! ";
+//!
+//! #[derive(Deserialize)]
+//! struct Args {
+//!     arg_INPUT: String,
+//!     flag_emit: Option<Emit>,
+//!     flag_opt_level: Option<OptLevel>,
+//!     flag_cfg: Vec<String>,
+//!     flag_L: Vec<String>,
+//!     flag_help: bool,
+//!     flag_version: bool,
+//! }
+//!
+//! // This is easy. The decoder will automatically restrict values to
+//! // strings that match one of the enum variants.
+//! #[derive(Deserialize)]
+//! # #[derive(Debug, PartialEq)]
+//! enum Emit { Asm, Ir, Bc, Obj, Link }
+//!
+//! // This one is harder because we want the user to specify an integer,
+//! // but restrict it to a specific range. So we implement `Deserialize`
+//! // ourselves.
+//! # #[derive(Debug, PartialEq)]
+//! enum OptLevel { Zero, One, Two, Three }
+//! struct OptLevelVisitor;
+//!
+//! impl<'de> serde::de::Visitor<'de> for OptLevelVisitor {
+//!     type Value = OptLevel;
+//!
+//!     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+//!         formatter.write_str("a number from range 0..3")
+//!     }
+//!
+//!     fn visit_u8<E>(self, n: u8) -> Result<Self::Value, E>
+//!         where E: serde::de::Error
+//!     {
+//!         Ok(match n {
+//!             0 => OptLevel::Zero, 1 => OptLevel::One,
+//!             2 => OptLevel::Two, 3 => OptLevel::Three,
+//!             n => {
+//!                 let err = format!(
+//!                     "Could not deserialize '{}' as opt-level.", n);
+//!                 return Err(E::custom(err));
+//!             }
+//!         })
+//!     }
+//! }
+//!
+//! impl<'de> serde::de::Deserialize<'de> for OptLevel {
+//!     fn deserialize<D>(d: D) -> Result<OptLevel, D::Error>
+//!         where D: serde::de::Deserializer<'de>
+//!     {
+//!         d.deserialize_u8(OptLevelVisitor)
+//!     }
+//! }
+//!
+//! let argv = || vec!["rustc", "-L", ".", "-L", "..", "--cfg", "a",
+//!                             "--opt-level", "2", "--emit=ir", "docopt.rs"];
+//! let args: Args = Docopt::new(USAGE)
+//!                         .and_then(|d| d.argv(argv().into_iter()).deserialize())
+//!                         .unwrap_or_else(|e| e.exit());
+//!
+//! // Now access your argv values.
+//! fn s(x: &str) -> String { x.to_string() }
+//! assert_eq!(args.arg_INPUT, "docopt.rs".to_string());
+//! assert_eq!(args.flag_L, vec![s("."), s("..")]);
+//! assert_eq!(args.flag_cfg, vec![s("a")]);
+//! assert_eq!(args.flag_opt_level, Some(OptLevel::Two));
+//! assert_eq!(args.flag_emit, Some(Emit::Ir));
+//! # }
+//! ```
+//!
+//! # The `docopt!` macro
+//!
+//! This package comes bundled with an additional crate, `docopt_macros`,
+//! which provides a `docopt!` syntax extension. Its purpose is to automate
+//! the creation of a Rust struct from a Docopt usage string. In particular,
+//! this provides a single point of truth about the definition of command line
+//! arguments in your program.
+//!
+//! Another advantage of using the macro is that errors in your Docopt usage
+//! string will be caught at compile time. Stated differently, your program
+//! will not compile with an invalid Docopt usage string.
+//!
+//! The example above using type based decoding can be simplified to this:
+//!
+//! ```ignore
+//! #![feature(plugin)]
+//! #![plugin(docopt_macros)]
+//!
+//! extern crate serde;
+//!
+//! extern crate docopt;
+//!
+//! // Write the Docopt usage string with the `docopt!` macro.
+//! docopt!(Args, "
+//! Usage: cp [-a] <source> <dest>
+//!        cp [-a] <source>... <dir>
+//!
+//! Options:
+//!     -a, --archive  Copy everything.
+//! ")
+//!
+//! fn main() {
+//!     let argv = || vec!["cp", "-a", "file1", "file2", "dest/"];
+//!
+//!     // Your `Args` struct has a single static method defined on it,
+//!     // `docopt`, which will return a normal `Docopt` value.
+//!     let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
+//!
+//!     // Now access your argv values.
+//!     fn s(x: &str) -> String { x.to_string() }
+//!     assert!(args.flag_archive);
+//!     assert_eq!(args.arg_source, vec![s("file1"), s("file2")]);
+//!     assert_eq!(args.arg_dir, s("dest/"));
+//!     assert_eq!(args.arg_dest, s(""));
+//! }
+//! ```
+
+#![crate_name = "docopt"]
+#![doc(html_root_url = "http://burntsushi.net/rustdoc/docopt")]
+
+#![deny(missing_docs)]
+
+#[macro_use]
+extern crate lazy_static;
+extern crate regex;
+extern crate strsim;
+#[allow(unused_imports)]
+#[macro_use]
+extern crate serde_derive;
+extern crate serde;
+
+pub use dopt::{ArgvMap, Deserializer, Docopt, Error, Value};
+
+macro_rules! werr(
+    ($($arg:tt)*) => ({
+        use std::io::{Write, stderr};
+        write!(&mut stderr(), $($arg)*).unwrap();
+    })
+);
+
+macro_rules! regex(
+    ($s:expr) => (::regex::Regex::new($s).unwrap());
+);
+
+fn cap_or_empty<'t>(caps: &regex::Captures<'t>, name: &str) -> &'t str {
+    caps.name(name).map_or("", |m| m.as_str())
+}
+
+mod dopt;
+#[doc(hidden)]
+pub mod parse;
+mod synonym;
+#[cfg(test)]
+mod test;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/parse.rs
@@ -0,0 +1,1488 @@
+// I am overall pretty displeased with the quality of code in this module.
+// I wrote it while simultaneously trying to build a mental model of Docopt's
+// specification (hint: one does not exist in written form). As a result, there
+// is a lot of coupling and some duplication.
+//
+// Some things that I think are good about the following code:
+//
+//   - The representation of a "usage pattern." I think it is a minimal
+//     representation of a pattern's syntax. (One possible tweak:
+//     `Optional<Vec<Pattern>>` -> `Optional<Box<Pattern>>`.)
+//   - Some disciplined use of regexes. I use a pretty basic state machine
+//     for parsing patterns, but for teasing out the patterns and options
+//     from the Docopt string and for picking out flags with arguments, I
+//     think regexes aren't too bad. There may be one or two scary ones though.
+//   - The core matching algorithm is reasonably simple and concise, but I
+//     think writing down some contracts will help me figure out how to make
+//     the code clearer.
+//
+// Some bad things:
+//
+//   - I tried several times to split some of the pieces in this module into
+//     separate modules. I could find no clear separation. This suggests that
+//     there is too much coupling between parsing components. I'm not convinced
+//     that the coupling is necessary.
+//   - The parsers for patterns and argv share some structure. There may be
+//     an easy abstraction waiting there.
+//   - It is not efficient in the slightest. I tried to be conservative with
+//     copying strings, but I think I failed. (It may not be worthwhile to fix
+//     this if it makes the code more awkward. Docopt does not need to be
+//     efficient.)
+//
+// Some things to do immediately:
+//
+//   - Document representation and invariants.
+//   - Less important: write contracts for functions.
+//
+// Long term:
+//
+//   - Write a specification for Docopt.
+
+pub use self::Argument::{Zero, One};
+pub use self::Atom::{Short, Long, Command, Positional};
+use self::Pattern::{Alternates, Sequence, Optional, Repeat, PatAtom};
+
+use std::borrow::ToOwned;
+use std::collections::{HashMap, HashSet};
+use std::collections::hash_map::Entry::{Vacant, Occupied};
+use std::cmp::Ordering;
+use std::fmt;
+use regex;
+use regex::Regex;
+use strsim::levenshtein;
+
+use dopt::Value::{self, Switch, Counted, Plain, List};
+use synonym::SynonymMap;
+use cap_or_empty;
+
+macro_rules! err(
+    ($($arg:tt)*) => (return Err(format!($($arg)*)))
+);
+
+#[derive(Clone)]
+pub struct Parser {
+    pub program: String,
+    pub full_doc: String,
+    pub usage: String,
+    pub descs: SynonymMap<Atom, Options>,
+    usages: Vec<Pattern>,
+    last_atom_added: Option<Atom>, // context for [default: ...]
+}
+
+impl Parser {
+    pub fn new(doc: &str) -> Result<Parser, String> {
+        let mut d = Parser {
+            program: String::new(),
+            full_doc: doc.into(),
+            usage: String::new(),
+            usages: vec!(),
+            descs: SynonymMap::new(),
+            last_atom_added: None,
+        };
+        d.parse(doc)?;
+        Ok(d)
+    }
+
+    pub fn matches(&self, argv: &Argv) -> Option<SynonymMap<String, Value>> {
+        for usage in &self.usages {
+            match Matcher::matches(argv, usage) {
+                None => continue,
+                Some(vals) => return Some(vals),
+            }
+        }
+        None
+    }
+
+    pub fn parse_argv(&self, argv: Vec<String>, options_first: bool)
+                         -> Result<Argv, String> {
+        Argv::new(self, argv, options_first)
+    }
+}
+
+impl Parser {
+    fn options_atoms(&self) -> Vec<Atom> {
+        let mut atoms = vec!();
+        for (atom, _) in self.descs.iter().filter(|&(_, opts)| opts.is_desc) {
+            atoms.push(atom.clone());
+        }
+        atoms
+    }
+
+    fn has_arg(&self, atom: &Atom) -> bool {
+        match self.descs.find(atom) {
+            None => false,
+            Some(opts) => opts.arg.has_arg(),
+        }
+    }
+
+    fn has_repeat(&self, atom: &Atom) -> bool {
+        match self.descs.find(atom) {
+            None => false,
+            Some(opts) => opts.repeats,
+        }
+    }
+
+    fn parse(&mut self, doc: &str) -> Result<(), String> {
+        lazy_static! {
+            static ref MUSAGE: Regex = Regex::new(
+                r"(?s)(?i:usage):\s*(?P<prog>\S+)(?P<pats>.*?)(?:$|\n\s*\n)"
+            ).unwrap();
+        }
+        let caps = match MUSAGE.captures(doc) {
+            None => err!("Could not find usage patterns in doc string."),
+            Some(caps) => caps,
+        };
+        if cap_or_empty(&caps, "prog").is_empty() {
+            err!("Could not find program name in doc string.")
+        }
+        self.program = cap_or_empty(&caps, "prog").to_string();
+        self.usage = caps[0].to_string();
+
+        // Before we parse the usage patterns, we look for option descriptions.
+        // We do this because the information in option descriptions can be
+        // used to resolve ambiguities in usage patterns (i.e., whether
+        // `--flag ARG` is a flag with an argument or not).
+        //
+        // From the docopt page, "every" line starting with a `-` or a `--`
+        // is considered an option description. Instead, we restrict the lines
+        // to any line *not* in the usage pattern section.
+        //
+        // *sigh* Apparently the above is not true. The official test suite
+        // includes `Options: -a ...`, which means some lines not beginning
+        // with `-` can actually have options.
+        let (pstart, pend) = caps.get(0).map(|m|(m.start(), m.end())).unwrap();
+        let (before, after) = (&doc[..pstart], &doc[pend..]);
+        // We process every line here (instead of restricting to lines starting
+        // with "-") because we need to check every line for a default value.
+        // The default value always belongs to the most recently defined desc.
+        for line in before.lines().chain(after.lines()) {
+            self.parse_desc(line)?;
+        }
+
+        let mprog = format!(
+            "^(?:{})?\\s*(.*?)\\s*$",
+            regex::escape(cap_or_empty(&caps, "prog")));
+        let pats = Regex::new(&*mprog).unwrap();
+
+        if cap_or_empty(&caps, "pats").is_empty() {
+            let pattern = PatParser::new(self, "").parse()?;
+            self.usages.push(pattern);
+        } else {
+            for line in cap_or_empty(&caps, "pats").lines() {
+                for pat in pats.captures_iter(line.trim()) {
+                    let pattern = PatParser::new(self, &pat[1]).parse()?;
+                    self.usages.push(pattern);
+                }
+            }
+        }
+        Ok(())
+    }
+
+    fn parse_desc(&mut self, full_desc: &str) -> Result<(), String> {
+        lazy_static! {
+            static ref OPTIONS: Regex = regex!(r"^\s*(?i:options:)\s*");
+            static ref ISFLAG: Regex = regex!(r"^(-\S|--\S)");
+            static ref REMOVE_DESC: Regex = regex!(r"  .*$");
+            static ref NORMALIZE_FLAGS: Regex = regex!(r"([^-\s]), -");
+            static ref FIND_FLAGS: Regex = regex!(r"(?x)
+                (?:(?P<long>--[^\x20\t=]+)|(?P<short>-[^\x20\t=]+))
+                (?:(?:\x20|=)(?P<arg>[^.-]\S*))?
+                (?P<repeated>\x20\.\.\.)?
+            ");
+        }
+        let desc = OPTIONS.replace(full_desc.trim(), "");
+        let desc = &*desc;
+        if !ISFLAG.is_match(desc) {
+            self.parse_default(full_desc)?;
+            return Ok(())
+        }
+
+        // Get rid of the description, which must be at least two spaces
+        // after the flag or argument.
+        let desc = REMOVE_DESC.replace(desc, "");
+        // Normalize `-x, --xyz` to `-x --xyz`.
+        let desc = NORMALIZE_FLAGS.replace(&desc, "$1 -");
+        let desc = desc.trim();
+
+        let (mut short, mut long) = <(String, String)>::default();
+        let mut has_arg = false;
+        let mut last_end = 0;
+        let mut repeated = false;
+        for flags in FIND_FLAGS.captures_iter(desc) {
+            last_end = flags.get(0).unwrap().end();
+            if !cap_or_empty(&flags, "repeated").is_empty() {
+                // If the "repeated" subcapture is not empty, then we have
+                // a valid repeated option.
+                repeated = true;
+            }
+            let (s, l) = (
+                cap_or_empty(&flags, "short"),
+                cap_or_empty(&flags, "long"),
+            );
+            if !s.is_empty() {
+                if !short.is_empty() {
+                    err!("Only one short flag is allowed in an option \
+                          description, but found '{}' and '{}'.", short, s)
+                }
+                short = s.into()
+            }
+            if !l.is_empty() {
+                if !long.is_empty() {
+                    err!("Only one long flag is allowed in an option \
+                          description, but found '{}' and '{}'.", long, l)
+                }
+                long = l.into()
+            }
+            if let Some(arg) = flags.name("arg").map(|m| m.as_str()) {
+                if !arg.is_empty() {
+                    if !Atom::is_arg(arg) {
+                        err!("Argument '{}' is not of the form ARG or <arg>.",
+                             arg)
+                    }
+                    has_arg = true; // may be changed to default later
+                }
+            }
+        }
+        // Make sure that we consumed everything. If there are leftovers,
+        // then there is some malformed description. Alert the user.
+        assert!(last_end <= desc.len());
+        if last_end < desc.len() {
+            err!("Extraneous text '{}' in option description '{}'.",
+                 &desc[last_end..], desc)
+        }
+        self.add_desc(&short, &long, has_arg, repeated)?;
+        // Looking for default in this line must come after adding the
+        // description, otherwise `parse_default` won't know which option
+        // to assign it to.
+        self.parse_default(full_desc)
+    }
+
+    fn parse_default(&mut self, desc: &str) -> Result<(), String> {
+        lazy_static! {
+            static ref FIND_DEFAULT: Regex = regex!(
+                r"\[(?i:default):(?P<val>.*)\]"
+            );
+        }
+        let defval =
+            match FIND_DEFAULT.captures(desc) {
+                None => return Ok(()),
+                Some(c) => cap_or_empty(&c, "val").trim(),
+            };
+        let last_atom =
+            match self.last_atom_added {
+                None => err!("Found default value '{}' in '{}' before first \
+                              option description.", defval, desc),
+                Some(ref atom) => atom,
+            };
+        let opts =
+            self.descs
+            .find_mut(last_atom)
+            .expect(&*format!("BUG: last opt desc key ('{:?}') is invalid.",
+                              last_atom));
+        match opts.arg {
+            One(None) => {}, // OK
+            Zero =>
+                err!("Cannot assign default value '{}' to flag '{}' \
+                      that has no arguments.", defval, last_atom),
+            One(Some(ref curval)) =>
+                err!("Flag '{}' already has a default value \
+                      of '{}' (second default value: '{}').",
+                     last_atom, curval, defval),
+        }
+        opts.arg = One(Some(defval.into()));
+        Ok(())
+    }
+
+    fn add_desc(
+        &mut self,
+        short: &str,
+        long: &str,
+        has_arg: bool,
+        repeated: bool,
+    ) -> Result<(), String> {
+        assert!(!short.is_empty() || !long.is_empty());
+        if !short.is_empty() && short.chars().count() != 2 {
+            // It looks like the reference implementation just ignores
+            // these lines.
+            return Ok(());
+        }
+        let mut opts = Options::new(
+            repeated, if has_arg { One(None) } else { Zero });
+        opts.is_desc = true;
+
+        if !short.is_empty() && !long.is_empty() {
+            let (short, long) = (Atom::new(short), Atom::new(long));
+            self.descs.insert(long.clone(), opts);
+            self.descs.insert_synonym(short, long.clone());
+            self.last_atom_added = Some(long);
+        } else if !short.is_empty() {
+            let short = Atom::new(short);
+            self.descs.insert(short.clone(), opts);
+            self.last_atom_added = Some(short);
+        } else if !long.is_empty() {
+            let long = Atom::new(long);
+            self.descs.insert(long.clone(), opts);
+            self.last_atom_added = Some(long);
+        }
+        Ok(())
+    }
+}
+
+impl fmt::Debug for Parser {
+    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+        fn sorted<T: Ord>(mut xs: Vec<T>) -> Vec<T> {
+            xs.sort(); xs
+        }
+
+        writeln!(f, "=====")?;
+        writeln!(f, "Program: {}", self.program)?;
+
+        writeln!(f, "Option descriptions:")?;
+        let keys = sorted(self.descs.keys().collect());
+        for &k in &keys {
+            writeln!(f, "  '{}' => {:?}", k, self.descs.get(k))?;
+        }
+
+        writeln!(f, "Synonyms:")?;
+        let keys: Vec<(&Atom, &Atom)> =
+            sorted(self.descs.synonyms().collect());
+        for &(from, to) in &keys {
+            writeln!(f, "  {:?} => {:?}", from, to)?;
+        }
+
+        writeln!(f, "Usages:")?;
+        for pat in &self.usages {
+            writeln!(f, "  {:?}", pat)?;
+        }
+        writeln!(f, "=====")
+    }
+}
+
+struct PatParser<'a> {
+    dopt: &'a mut Parser,
+    tokens: Vec<String>, // used while parsing a single usage pattern
+    curi: usize, // ^^ index into pattern chars
+    expecting: Vec<char>, // stack of expected ']' or ')'
+}
+
+impl<'a> PatParser<'a> {
+    fn new(dopt: &'a mut Parser, pat: &str) -> PatParser<'a> {
+        PatParser {
+            dopt: dopt,
+            tokens: pattern_tokens(pat),
+            curi: 0,
+            expecting: vec!(),
+        }
+    }
+
+    fn parse(&mut self) -> Result<Pattern, String> {
+        // let mut seen = HashSet::new();
+        let mut p = self.pattern()?;
+        match self.expecting.pop() {
+            None => {},
+            Some(c) => err!("Unclosed group. Expected '{}'.", c),
+        }
+        p.add_options_shortcut(self.dopt);
+        p.tag_repeats(&mut self.dopt.descs);
+        Ok(p)
+    }
+
+    fn pattern(&mut self) -> Result<Pattern, String> {
+        let mut alts = vec!();
+        let mut seq = vec!();
+        while !self.is_eof() {
+            match self.cur() {
+                "..." => {
+                    err!("'...' must appear directly after a group, argument, \
+                          flag or command.")
+                }
+                "-" | "--" => {
+                    // As per specification, `-` and `--` by themselves are
+                    // just commands that should be interpreted conventionally.
+                    seq.push(self.command()?);
+                }
+                "|" => {
+                    if seq.is_empty() {
+                        err!("Unexpected '|'. Not in form 'a | b | c'.")
+                    }
+                    self.next_noeof("pattern")?;
+                    alts.push(Sequence(seq));
+                    seq = vec!();
+                }
+                "]" | ")" => {
+                    if seq.is_empty() {
+                        err!("Unexpected '{}'. Empty groups are not allowed.",
+                             self.cur())
+                    }
+                    match self.expecting.pop() {
+                        None => err!("Unexpected '{}'. No open bracket found.",
+                                     self.cur()),
+                        Some(c) => {
+                            if c != self.cur().chars().next().unwrap() {
+                                err!("Expected '{}' but got '{}'.",
+                                     c, self.cur())
+                            }
+                        }
+                    }
+                    let mk: fn(Vec<Pattern>) -> Pattern =
+                        if self.cur() == "]" { Optional } else { Sequence };
+                    self.next();
+                    return
+                        if alts.is_empty() {
+                            Ok(mk(seq))
+                        } else {
+                            alts.push(Sequence(seq));
+                            Ok(mk(vec!(Alternates(alts))))
+                        }
+                }
+                "[" => {
+                    // Check for special '[options]' shortcut.
+                    if self.atis(1, "options") && self.atis(2, "]") {
+                        self.next(); // cur == options
+                        self.next(); // cur == ]
+                        self.next();
+                        seq.push(self.maybe_repeat(Optional(vec!())));
+                        continue
+                    }
+                    self.expecting.push(']');
+                    seq.push(self.group()?);
+                }
+                "(" => {
+                    self.expecting.push(')');
+                    seq.push(self.group()?);
+                }
+                _ => {
+                    if Atom::is_short(self.cur()) {
+                        seq.extend(self.flag_short()?.into_iter());
+                    } else if Atom::is_long(self.cur()) {
+                        seq.push(self.flag_long()?);
+                    } else if Atom::is_arg(self.cur()) {
+                        // These are always positional.
+                        // Arguments for -s and --short are picked up
+                        // when parsing flags.
+                        seq.push(self.positional()?);
+                    } else if Atom::is_cmd(self.cur()) {
+                        seq.push(self.command()?);
+                    } else {
+                        err!("Unknown token type '{}'.", self.cur())
+                    }
+                }
+            }
+        }
+        if alts.is_empty() {
+            Ok(Sequence(seq))
+        } else {
+            alts.push(Sequence(seq));
+            Ok(Alternates(alts))
+        }
+    }
+
+    fn flag_short(&mut self) -> Result<Vec<Pattern>, String> {
+        let mut seq = vec!();
+        let stacked: String = self.cur()[1..].into();
+        for (i, c) in stacked.chars().enumerate() {
+            let atom = self.dopt.descs.resolve(&Short(c));
+            let mut pat = PatAtom(atom.clone());
+            if self.dopt.has_repeat(&atom) {
+                pat = Pattern::repeat(pat);
+            }
+            seq.push(pat);
+
+            // The only way for a short option to have an argument is if
+            // it's specified in an option description.
+            if !self.dopt.has_arg(&atom) {
+                self.add_atom_ifnotexists(Zero, &atom);
+            } else {
+                // At this point, the flag MUST have an argument. Therefore,
+                // we interpret the "rest" of the characters as the argument.
+                // If the "rest" is empty, then we peek to find and make sure
+                // there is an argument.
+                let rest = &stacked[i+1..];
+                if rest.is_empty() {
+                    self.next_flag_arg(&atom)?;
+                } else {
+                    self.errif_invalid_flag_arg(&atom, rest)?;
+                }
+                // We either error'd or consumed the rest of the short stack as
+                // an argument.
+                break
+            }
+        }
+        self.next();
+        // This is a little weird. We've got to manually look for a repeat
+        // operator right after the stack, and then apply it to each short
+        // flag we generated.
+        // If "sequences" never altered semantics, then we could just use that
+        // here to group a short stack.
+        if self.atis(0, "...") {
+            self.next();
+            seq = seq.into_iter().map(Pattern::repeat).collect();
+        }
+        Ok(seq)
+    }
+
+    fn flag_long(&mut self) -> Result<Pattern, String> {
+        let (atom, arg) = parse_long_equal(self.cur())?;
+        let atom = self.dopt.descs.resolve(&atom);
+        if self.dopt.descs.contains_key(&atom) {
+            // Options already exist for this atom, so we must check to make
+            // sure things are consistent.
+            let has_arg = self.dopt.has_arg(&atom);
+            if arg.has_arg() && !has_arg {
+                // Found `=` in usage, but previous usage of this flag
+                // didn't specify an argument.
+                err!("Flag '{}' does not take any arguments.", atom)
+            } else if !arg.has_arg() && has_arg {
+                // Didn't find any `=` in usage for this flag, but previous
+                // usage of this flag specifies an argument.
+                // So look for `--flag ARG`
+                self.next_flag_arg(&atom)?;
+                // We don't care about the value of `arg` since options
+                // already exist. (In which case, the argument value can never
+                // change.)
+            }
+        }
+        self.add_atom_ifnotexists(arg, &atom);
+        self.next();
+        let pat = if self.dopt.has_repeat(&atom) {
+            Pattern::repeat(PatAtom(atom))
+        } else {
+            PatAtom(atom)
+        };
+        Ok(self.maybe_repeat(pat))
+    }
+
+    fn next_flag_arg(&mut self, atom: &Atom) -> Result<(), String> {
+        self.next_noeof(&*format!("argument for flag '{}'", atom))?;
+        self.errif_invalid_flag_arg(atom, self.cur())
+    }
+
+    fn errif_invalid_flag_arg(&self, atom: &Atom, arg: &str)
+                             -> Result<(), String> {
+        if !Atom::is_arg(arg) {
+            err!("Expected argument for flag '{}', but found \
+                  malformed argument '{}'.", atom, arg)
+        }
+        Ok(())
+    }
+
+    fn command(&mut self) -> Result<Pattern, String> {
+        let atom = Atom::new(self.cur());
+        self.add_atom_ifnotexists(Zero, &atom);
+        self.next();
+        Ok(self.maybe_repeat(PatAtom(atom)))
+    }
+
+    fn positional(&mut self) -> Result<Pattern, String> {
+        let atom = Atom::new(self.cur());
+        self.add_atom_ifnotexists(Zero, &atom);
+        self.next();
+        Ok(self.maybe_repeat(PatAtom(atom)))
+    }
+
+    fn add_atom_ifnotexists(&mut self, arg: Argument, atom: &Atom) {
+        if !self.dopt.descs.contains_key(atom) {
+            let opts = Options::new(false, arg);
+            self.dopt.descs.insert(atom.clone(), opts);
+        }
+    }
+
+    fn group(&mut self)
+            -> Result<Pattern, String> {
+        self.next_noeof("pattern")?;
+        let pat = self.pattern()?;
+        Ok(self.maybe_repeat(pat))
+    }
+
+    fn maybe_repeat(&mut self, pat: Pattern) -> Pattern {
+        if self.atis(0, "...") {
+            self.next();
+            Pattern::repeat(pat)
+        } else {
+            pat
+        }
+    }
+
+    fn is_eof(&self) -> bool {
+        self.curi == self.tokens.len()
+    }
+    fn next(&mut self) {
+        if self.curi == self.tokens.len() {
+            return
+        }
+        self.curi += 1;
+    }
+    fn next_noeof(&mut self, expected: &str) -> Result<(), String> {
+        self.next();
+        if self.curi == self.tokens.len() {
+            err!("Expected {} but reached end of usage pattern.", expected)
+        }
+        Ok(())
+    }
+    fn cur(&self) -> &str {
+        &*self.tokens[self.curi]
+    }
+    fn atis(&self, offset: usize, is: &str) -> bool {
+        let i = self.curi + offset;
+        i < self.tokens.len() && self.tokens[i] == is
+    }
+}
+
+#[derive(Clone, Debug)]
+enum Pattern {
+    Alternates(Vec<Pattern>),
+    Sequence(Vec<Pattern>),
+    Optional(Vec<Pattern>),
+    Repeat(Box<Pattern>),
+    PatAtom(Atom),
+}
+
+#[derive(PartialEq, Eq, Ord, Hash, Clone, Debug)]
+pub enum Atom {
+    Short(char),
+    Long(String),
+    Command(String),
+    Positional(String),
+}
+
+#[derive(Clone, Debug)]
+pub struct Options {
+    /// Set to true if this atom is ever repeated in any context.
+    /// For positional arguments, non-argument flags and commands, repetition
+    /// means that they become countable.
+    /// For flags with arguments, repetition means multiple distinct values
+    /// can be specified (and are represented as a Vec).
+    pub repeats: bool,
+
+    /// This specifies whether this atom has any arguments.
+    /// For commands and positional arguments, this is always Zero.
+    /// Flags can have zero or one argument, with an optionally default value.
+    pub arg: Argument,
+
+    /// Whether it shows up in the "options description" second.
+    pub is_desc: bool,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Argument {
+    Zero,
+    One(Option<String>), // optional default value
+}
+
+impl Pattern {
+    fn add_options_shortcut(&mut self, par: &Parser) {
+        fn add(pat: &mut Pattern, all_atoms: &HashSet<Atom>, par: &Parser) {
+            match *pat {
+                Alternates(ref mut ps) | Sequence(ref mut ps) => {
+                    for p in ps.iter_mut() { add(p, all_atoms, par) }
+                }
+                Repeat(ref mut p) => add(&mut **p, all_atoms, par),
+                PatAtom(_) => {}
+                Optional(ref mut ps) => {
+                    if !ps.is_empty() {
+                        for p in ps.iter_mut() { add(p, all_atoms, par) }
+                    } else {
+                        for atom in par.options_atoms().into_iter() {
+                            if !all_atoms.contains(&atom) {
+                                if par.has_repeat(&atom) {
+                                    ps.push(Pattern::repeat(PatAtom(atom)));
+                                } else {
+                                    ps.push(PatAtom(atom));
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        let all_atoms = self.all_atoms();
+        add(self, &all_atoms, par);
+    }
+
+    fn all_atoms(&self) -> HashSet<Atom> {
+        fn all_atoms(pat: &Pattern, set: &mut HashSet<Atom>) {
+            match *pat {
+                Alternates(ref ps) | Sequence(ref ps) | Optional(ref ps) => {
+                    for p in ps.iter() { all_atoms(p, set) }
+                }
+                Repeat(ref p) => all_atoms(&**p, set),
+                PatAtom(ref a) => { set.insert(a.clone()); }
+            }
+        }
+        let mut set = HashSet::new();
+        all_atoms(self, &mut set);
+        set
+    }
+
+    fn tag_repeats(&self, map: &mut SynonymMap<Atom, Options>) {
+        fn dotag(p: &Pattern,
+                 rep: bool,
+                 map: &mut SynonymMap<Atom, Options>,
+                 seen: &mut HashSet<Atom>) {
+            match *p {
+                Alternates(ref ps) => {
+                    // This is a bit tricky. Basically, we don't want the
+                    // existence of an item in mutually exclusive alternations
+                    // to affect whether it repeats or not.
+                    // However, we still need to record seeing each item in
+                    // each alternation.
+                    let fresh = seen.clone();
+                    for p in ps.iter() {
+                        let mut isolated = fresh.clone();
+                        dotag(p, rep, map, &mut isolated);
+                        for a in isolated.into_iter() {
+                            seen.insert(a);
+                        }
+                    }
+                }
+                Sequence(ref ps) => {
+                    for p in ps.iter() {
+                        dotag(p, rep, map, seen)
+                    }
+                }
+                Optional(ref ps) => {
+                    for p in ps.iter() {
+                        dotag(p, rep, map, seen)
+                    }
+                }
+                Repeat(ref p) => dotag(&**p, true, map, seen),
+                PatAtom(ref atom) => {
+                    let opt = map.find_mut(atom).expect("bug: no atom found");
+                    opt.repeats = opt.repeats || rep || seen.contains(atom);
+                    seen.insert(atom.clone());
+                }
+            }
+        }
+        let mut seen = HashSet::new();
+        dotag(self, false, map, &mut seen);
+    }
+
+    fn repeat(p: Pattern) -> Pattern {
+        match p {
+            p @ Repeat(_) => p,
+            p => Repeat(Box::new(p)),
+        }
+    }
+}
+
+impl Atom {
+    pub fn new(s: &str) -> Atom {
+        if Atom::is_short(s) {
+            Short(s[1..].chars().next().unwrap())
+        } else if Atom::is_long(s) {
+            Long(s[2..].into())
+        } else if Atom::is_arg(s) {
+            if s.starts_with("<") && s.ends_with(">") {
+                Positional(s[1..s.len()-1].into())
+            } else {
+                Positional(s.into())
+            }
+        } else if Atom::is_cmd(s) {
+            Command(s.into())
+        } else {
+            panic!("Unknown atom string: '{}'", s)
+        }
+    }
+
+    fn is_short(s: &str) -> bool {
+        lazy_static! {
+            static ref RE: Regex = regex!(r"^-[^-]\S*$");
+        }
+        RE.is_match(s)
+    }
+
+    fn is_long(s: &str) -> bool {
+        lazy_static! {
+            static ref RE: Regex = regex!(r"^--\S+(?:<[^>]+>)?$");
+        }
+        RE.is_match(s)
+    }
+
+    fn is_long_argv(s: &str) -> bool {
+        lazy_static! {
+            static ref RE: Regex = regex!(r"^--\S+(=.+)?$");
+        }
+        RE.is_match(s)
+    }
+
+    fn is_arg(s: &str) -> bool {
+        lazy_static! {
+            static ref RE: Regex = regex!(r"^(\p{Lu}+|<[^>]+>)$");
+        }
+        RE.is_match(s)
+    }
+
+    fn is_cmd(s: &str) -> bool {
+        lazy_static! {
+            static ref RE: Regex = regex!(r"^(-|--|[^-]\S*)$");
+        }
+        RE.is_match(s)
+    }
+
+    // Assigns an integer to each variant of Atom. (For easier sorting.)
+    fn type_as_usize(&self) -> usize {
+        match *self {
+            Short(_) => 0,
+            Long(_) => 1,
+            Command(_) => 2,
+            Positional(_) => 3,
+        }
+    }
+}
+
+impl PartialOrd for Atom {
+    fn partial_cmp(&self, other: &Atom) -> Option<Ordering> {
+        match (self, other) {
+            (&Short(c1), &Short(c2)) => c1.partial_cmp(&c2),
+            (&Long(ref s1), &Long(ref s2)) => s1.partial_cmp(s2),
+            (&Command(ref s1), &Command(ref s2)) => s1.partial_cmp(s2),
+            (&Positional(ref s1), &Positional(ref s2)) => s1.partial_cmp(s2),
+            (a1, a2) => a1.type_as_usize().partial_cmp(&a2.type_as_usize()),
+        }
+    }
+}
+
+impl fmt::Display for Atom {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Short(c) => write!(f, "-{}", c),
+            Long(ref s) => write!(f, "--{}", s),
+            Command(ref s) => write!(f, "{}", s),
+            Positional(ref s) => {
+                if s.chars().all(|c| c.is_uppercase()) {
+                    write!(f, "{}", s)
+                } else {
+                    write!(f, "<{}>", s)
+                }
+            }
+        }
+    }
+}
+
+
+impl Options {
+    fn new(rep: bool, arg: Argument) -> Options {
+        Options { repeats: rep, arg: arg, is_desc: false, }
+    }
+}
+
+impl Argument {
+    fn has_arg(&self) -> bool {
+        match *self {
+            Zero => false,
+            One(_) => true,
+        }
+    }
+}
+
+#[doc(hidden)]
+pub struct Argv<'a> {
+    /// A representation of an argv string as an ordered list of tokens.
+    /// This contains only positional arguments and commands.
+    positional: Vec<ArgvToken>,
+    /// Same as positional, but contains short and long flags.
+    /// Each flag may have an argument string.
+    flags: Vec<ArgvToken>,
+    /// Counts the number of times each flag appears.
+    counts: HashMap<Atom, usize>,
+
+    // State for parser.
+    dopt: &'a Parser,
+    argv: Vec<String>,
+    curi: usize,
+    options_first: bool,
+}
+
+#[derive(Clone, Debug)]
+struct ArgvToken {
+    atom: Atom,
+    arg: Option<String>,
+}
+
+impl<'a> Argv<'a> {
+    fn new(dopt: &'a Parser, argv: Vec<String>, options_first: bool)
+          -> Result<Argv<'a>, String> {
+        let mut a = Argv {
+            positional: vec!(),
+            flags: vec!(),
+            counts: HashMap::new(),
+            dopt: dopt,
+            argv: argv.iter().cloned().collect(),
+            curi: 0,
+            options_first: options_first,
+        };
+        a.parse()?;
+        for flag in &a.flags {
+            match a.counts.entry(flag.atom.clone()) {
+                Vacant(v) => { v.insert(1); }
+                Occupied(mut v) => { *v.get_mut() += 1; }
+            }
+        }
+        Ok(a)
+    }
+
+    fn parse(&mut self) -> Result<(), String> {
+        let mut seen_double_dash = false;
+        while self.curi < self.argv.len() {
+            let do_flags =
+                !seen_double_dash
+                && (!self.options_first || self.positional.is_empty());
+
+            if do_flags && Atom::is_short(self.cur()) {
+                let stacked: String = self.cur()[1..].into();
+                for (i, c) in stacked.chars().enumerate() {
+                    let mut tok = ArgvToken {
+                        atom: self.dopt.descs.resolve(&Short(c)),
+                        arg: None,
+                    };
+                    if !self.dopt.descs.contains_key(&tok.atom) {
+                        err!("Unknown flag: '{}'", &tok.atom);
+                    }
+                    if !self.dopt.has_arg(&tok.atom) {
+                        self.flags.push(tok);
+                    } else {
+                        let rest = &stacked[i+1..];
+                        tok.arg = Some(
+                            if rest.is_empty() {
+                                let arg = self.next_arg(&tok.atom)?;
+                                arg.into()
+                            } else {
+                                rest.into()
+                            }
+                        );
+                        self.flags.push(tok);
+                        // We've either produced an error or gobbled up the
+                        // rest of these stacked short flags, so stop.
+                        break
+                    }
+                }
+            } else if do_flags && Atom::is_long_argv(self.cur()) {
+                let (atom, mut arg) = parse_long_equal_argv(self.cur());
+                let atom = self.dopt.descs.resolve(&atom);
+                if !self.dopt.descs.contains_key(&atom) {
+                    return self.err_unknown_flag(&atom)
+                }
+                if arg.is_some() && !self.dopt.has_arg(&atom) {
+                    err!("Flag '{}' cannot have an argument, but found '{}'.",
+                         &atom, arg.as_ref().unwrap())
+                } else if arg.is_none() && self.dopt.has_arg(&atom) {
+                    self.next_noeof(&*format!("argument for flag '{}'",
+                                                   &atom))?;
+                    arg = Some(self.cur().into());
+                }
+                self.flags.push(ArgvToken { atom: atom, arg: arg });
+            } else {
+                if !seen_double_dash && self.cur() == "--" {
+                    seen_double_dash = true;
+                } else {
+                    // Yup, we *always* insert a positional argument, which
+                    // means we completely neglect `Command` here.
+                    // This is because we can't tell whether something is a
+                    // `command` or not until we start pattern matching.
+                    let tok = ArgvToken {
+                        atom: Positional(self.cur().into()),
+                        arg: None,
+                    };
+                    self.positional.push(tok);
+                }
+            }
+            self.next()
+        }
+        Ok(())
+    }
+
+    fn err_unknown_flag(&self, atom: &Atom) -> Result<(), String> {
+        use std::usize::MAX;
+        let mut best = String::new();
+        let flag = atom.to_string();
+        let mut min = MAX;
+
+        let mut possibles = Vec::new();
+
+        for (key, _) in self.dopt.descs.synonyms() {
+            possibles.push(key);
+        }
+
+        for key in self.dopt.descs.keys() {
+            possibles.push(key);
+        }
+
+        for key in &possibles {
+            match **key {
+                Long(_) | Command(_) => {
+                    let name = key.to_string();
+                    let dist = levenshtein(&flag, &name);
+                    if dist < 3 && dist < min {
+                        min = dist;
+                        best = name;
+                    }
+                }
+                _ => {}
+            }
+        }
+        if best.is_empty() {
+            err!("Unknown flag: '{}'", &atom);
+        } else {
+            err!("Unknown flag: '{}'. Did you mean '{}'?", &atom, &best)
+        }
+    }
+
+    fn cur(&self) -> &str { self.at(0) }
+    fn at(&self, i: usize) -> &str {
+        &*self.argv[self.curi + i]
+    }
+    fn next(&mut self) {
+        if self.curi < self.argv.len() {
+            self.curi += 1
+        }
+    }
+    fn next_arg(&mut self, atom: &Atom) -> Result<&str, String> {
+        let expected = format!("argument for flag '{}'", atom);
+        self.next_noeof(&*expected)?;
+        Ok(self.cur())
+    }
+    fn next_noeof(&mut self, expected: &str) -> Result<(), String> {
+        self.next();
+        if self.curi == self.argv.len() {
+            err!("Expected {} but reached end of arguments.", expected)
+        }
+        Ok(())
+    }
+}
+
+impl<'a> fmt::Debug for Argv<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+        writeln!(f, "Positional: {:?}", self.positional)?;
+        writeln!(f, "Flags: {:?}", self.flags)?;
+        writeln!(f, "Counts: {:?}", self.counts)?;
+        Ok(())
+    }
+}
+
+struct Matcher<'a, 'b:'a> {
+    argv: &'a Argv<'b>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+struct MState {
+    argvi: usize, // index into Argv.positional
+    counts: HashMap<Atom, usize>, // flags remaining for pattern consumption
+    max_counts: HashMap<Atom, usize>, // optional flag appearances
+    vals: HashMap<Atom, Value>,
+}
+
+impl MState {
+    fn fill_value(&mut self, key: Atom, rep: bool, arg: Option<String>)
+                 -> bool {
+        match (arg, rep) {
+            (None, false) => {
+                self.vals.insert(key, Switch(true));
+            }
+            (Some(arg), false) => {
+                self.vals.insert(key, Plain(Some(arg)));
+            }
+            (None, true) => {
+                match self.vals.entry(key) {
+                    Vacant(v) => { v.insert(Counted(1)); }
+                    Occupied(mut v) => {
+                        match *v.get_mut() {
+                            Counted(ref mut c) => { *c += 1; }
+                            _ => return false,
+                        }
+                    }
+                }
+            }
+            (Some(arg), true) => {
+                match self.vals.entry(key) {
+                    Vacant(v) => { v.insert(List(vec!(arg))); }
+                    Occupied(mut v) => {
+                        match *v.get_mut() {
+                            List(ref mut vs) => vs.push(arg),
+                            _ => return false,
+                        }
+                    }
+                }
+            }
+        }
+        true
+    }
+
+    fn add_value(&mut self, opts: &Options,
+                 spec: &Atom, atom: &Atom, arg: &Option<String>) -> bool {
+        assert!(opts.arg.has_arg() == arg.is_some(),
+                "'{:?}' should have an argument but doesn't", atom);
+        match *atom {
+            Short(_) | Long(_) => {
+                self.fill_value(spec.clone(), opts.repeats, arg.clone())
+            }
+            Positional(ref v) => {
+                assert!(!opts.arg.has_arg());
+                self.fill_value(spec.clone(), opts.repeats, Some(v.clone()))
+            }
+            Command(_) => {
+                assert!(!opts.arg.has_arg());
+                self.fill_value(spec.clone(), opts.repeats, None)
+            }
+        }
+    }
+
+    fn use_flag(&mut self, flag: &Atom) -> bool {
+        match self.max_counts.entry(flag.clone()) {
+            Vacant(v) => { v.insert(0); }
+            Occupied(_) => {}
+        }
+        match self.counts.entry(flag.clone()) {
+            Vacant(_) => { false }
+            Occupied(mut v) => {
+                let c = v.get_mut();
+                if *c == 0 {
+                    false
+                } else {
+                    *c -= 1;
+                    true
+                }
+            }
+        }
+    }
+
+    fn use_optional_flag(&mut self, flag: &Atom) {
+        match self.max_counts.entry(flag.clone()) {
+            Vacant(v) => { v.insert(1); }
+            Occupied(mut v) => { *v.get_mut() += 1; }
+        }
+    }
+
+    fn match_cmd_or_posarg(&mut self, spec: &Atom, argv: &ArgvToken)
+                          -> Option<ArgvToken> {
+        match (spec, &argv.atom) {
+            (_, &Command(_)) => {
+                // This is impossible because the argv parser doesn't know
+                // how to produce `Command` values.
+                unreachable!()
+            }
+            (&Command(ref n1), &Positional(ref n2)) if n1 == n2 => {
+                // Coerce a positional to a command because the pattern
+                // demands it and the positional argument matches it.
+                self.argvi += 1;
+                Some(ArgvToken { atom: spec.clone(), arg: None })
+            }
+            (&Positional(_), _) => {
+                self.argvi += 1;
+                Some(argv.clone())
+            }
+            _ => None,
+        }
+    }
+}
+
+impl<'a, 'b> Matcher<'a, 'b> {
+    fn matches(argv: &'a Argv, pat: &Pattern)
+              -> Option<SynonymMap<String, Value>> {
+        let m = Matcher { argv: argv };
+        let init = MState {
+            argvi: 0,
+            counts: argv.counts.clone(),
+            max_counts: HashMap::new(),
+            vals: HashMap::new(),
+        };
+        m.states(pat, &init)
+         .into_iter()
+         .filter(|s| m.state_consumed_all_argv(s))
+         .filter(|s| m.state_has_valid_flags(s))
+         .filter(|s| m.state_valid_num_flags(s))
+         .collect::<Vec<MState>>()
+         .into_iter()
+         .next()
+         .map(|mut s| {
+             m.add_flag_values(&mut s);
+             m.add_default_values(&mut s);
+
+             // Build a synonym map so that it's easier to look up values.
+             let mut synmap: SynonymMap<String, Value> =
+                 s.vals.into_iter()
+                       .map(|(k, v)| (k.to_string(), v))
+                       .collect();
+             for (from, to) in argv.dopt.descs.synonyms() {
+                 let (from, to) = (from.to_string(), to.to_string());
+                 if synmap.contains_key(&to) {
+                     synmap.insert_synonym(from, to);
+                 }
+             }
+             synmap
+         })
+    }
+
+    fn token_from(&self, state: &MState) -> Option<&ArgvToken> {
+        self.argv.positional.get(state.argvi)
+    }
+
+    fn add_value(&self, state: &mut MState,
+                 atom_spec: &Atom, atom: &Atom, arg: &Option<String>)
+                -> bool {
+        let opts = self.argv.dopt.descs.get(atom_spec);
+        state.add_value(opts, atom_spec, atom, arg)
+    }
+
+    fn add_flag_values(&self, state: &mut MState) {
+        for tok in &self.argv.flags {
+            self.add_value(state, &tok.atom, &tok.atom, &tok.arg);
+        }
+    }
+
+    fn add_default_values(&self, state: &mut MState) {
+        lazy_static! {
+            static ref SPLIT_SPACE: Regex = regex!(r"\s+");
+        }
+        let vs = &mut state.vals;
+        for (a, opts) in self.argv.dopt.descs.iter() {
+            if vs.contains_key(a) {
+                continue
+            }
+            let atom = a.clone();
+            match (opts.repeats, &opts.arg) {
+                (false, &Zero) => {
+                    match *a {
+                        Positional(_) => vs.insert(atom, Plain(None)),
+                        _ => vs.insert(atom, Switch(false)),
+                    };
+                }
+                (true, &Zero) => {
+                    match *a {
+                        Positional(_) => vs.insert(atom, List(vec!())),
+                        _ => vs.insert(atom, Counted(0)),
+                    };
+                }
+                (false, &One(None)) => { vs.insert(atom, Plain(None)); }
+                (true, &One(None)) => { vs.insert(atom, List(vec!())); }
+                (false, &One(Some(ref v))) => {
+                    vs.insert(atom, Plain(Some(v.clone())));
+                }
+                (true, &One(Some(ref v))) => {
+                    let words = SPLIT_SPACE
+                                .split(v)
+                                .map(|s| s.to_owned())
+                                .collect();
+                    vs.insert(atom, List(words));
+                }
+            }
+        }
+    }
+
+    fn state_consumed_all_argv(&self, state: &MState) -> bool {
+        self.argv.positional.len() == state.argvi
+    }
+
+    fn state_has_valid_flags(&self, state: &MState) -> bool {
+        self.argv.counts.keys().all(|flag| state.max_counts.contains_key(flag))
+    }
+
+    fn state_valid_num_flags(&self, state: &MState) -> bool {
+        state.counts.iter().all(
+            |(flag, count)| count <= &state.max_counts[flag])
+    }
+
+    fn states(&self, pat: &Pattern, init: &MState) -> Vec<MState> {
+        match *pat {
+            Alternates(ref ps) => {
+                let mut alt_states = vec!();
+                for p in ps.iter() {
+                    alt_states.extend(self.states(p, init).into_iter());
+                }
+                alt_states
+            }
+            Sequence(ref ps) => {
+                let (mut states, mut next) = (vec!(), vec!());
+                let mut iter = ps.iter();
+                match iter.next() {
+                    None => return vec!(init.clone()),
+                    Some(p) => states.extend(self.states(p, init).into_iter()),
+                }
+                for p in iter {
+                    for s in states.into_iter() {
+                        next.extend(self.states(p, &s).into_iter());
+                    }
+                    states = vec!();
+                    states.extend(next.into_iter());
+                    next = vec!();
+                }
+                states
+            }
+            Optional(ref ps) => {
+                let mut base = init.clone();
+                let mut noflags = vec!();
+                for p in ps.iter() {
+                    match p {
+                        // Prevent exponential growth in cases like [--flag...]
+                        // See https://github.com/docopt/docopt.rs/issues/195
+                        &Repeat(ref b) => match &**b {
+                            &PatAtom(ref a @ Short(_))
+                            | &PatAtom(ref a @ Long(_)) => {
+                                let argv_count = self.argv.counts.get(a)
+                                                     .map_or(0, |&x| x);
+                                let max_count = base.max_counts.get(a)
+                                                    .map_or(0, |&x| x);
+                                if argv_count > max_count {
+                                    for _ in max_count..argv_count {
+                                        base.use_optional_flag(a);
+                                    }
+                                }
+                            }
+                            _ => {
+                                noflags.push(p);
+                            }
+                        },
+                        &PatAtom(ref a @ Short(_))
+                        | &PatAtom(ref a @ Long(_)) => {
+                            let argv_count = self.argv.counts.get(a)
+                                                 .map_or(0, |&x| x);
+                            let max_count = base.max_counts.get(a)
+                                                .map_or(0, |&x| x);
+                            if argv_count > max_count {
+                                base.use_optional_flag(a);
+                            }
+                        }
+                        other => {
+                            noflags.push(other);
+                        }
+                    }
+                }
+                let mut states = vec!();
+                self.all_option_states(&base, &mut states, &*noflags);
+                states
+            }
+            Repeat(ref p) => { match &**p {
+                &PatAtom(ref a @ Short(_))
+                | &PatAtom(ref a @ Long(_)) => {
+                    let mut bases = self.states(&**p, init);
+                    for base in &mut bases {
+                        let argv_count = self.argv.counts.get(a)
+                                             .map_or(0, |&x| x);
+                        let max_count = base.max_counts.get(a)
+                                            .map_or(0, |&x| x);
+                        if argv_count > max_count {
+                            for _ in max_count..argv_count {
+                                base.use_optional_flag(a);
+                            }
+                        }
+                    }
+                    bases
+                }
+                _ => {
+                    let mut grouped_states = vec!(self.states(&**p, init));
+                    loop {
+                        let mut nextss = vec!();
+                        for s in grouped_states.last().unwrap().iter() {
+                            nextss.extend(
+                                self.states(&**p, s)
+                                    .into_iter()
+                                    .filter(|snext| snext != s));
+                        }
+                        if nextss.is_empty() {
+                            break
+                        }
+                        grouped_states.push(nextss);
+                    }
+                    grouped_states
+                        .into_iter()
+                        .flat_map(|ss| ss.into_iter())
+                        .collect::<Vec<MState>>()
+                }
+            }}
+            PatAtom(ref atom) => {
+                let mut state = init.clone();
+                match *atom {
+                    Short(_) | Long(_) => {
+                        if !state.use_flag(atom) {
+                            return vec!()
+                        }
+                    }
+                    Command(_) | Positional(_) => {
+                        let tok =
+                            match self.token_from(init) {
+                                None => return vec!(),
+                                Some(tok) => tok,
+                            };
+                        let tok =
+                            match state.match_cmd_or_posarg(atom, tok) {
+                                None => return vec!(),
+                                Some(tok) => tok,
+                            };
+                        if !self.add_value(&mut state, atom,
+                                           &tok.atom, &tok.arg) {
+                            return vec!()
+                        }
+                    }
+                }
+                vec!(state)
+            }
+        }
+    }
+
+    fn all_option_states(&self, base: &MState, states: &mut Vec<MState>,
+                         pats: &[&Pattern]) {
+        if pats.is_empty() {
+            states.push(base.clone());
+        } else {
+            let (pat, rest) = (*pats.first().unwrap(), &pats[1..]);
+            for s in self.states(pat, base).into_iter() {
+                self.all_option_states(&s, states, rest);
+            }
+            // Order is important here! This must come after the loop above
+            // because we prefer presence over absence. The first state wins.
+            self.all_option_states(base, states, &pats[1..]);
+        }
+    }
+}
+
+// Tries to parse a long flag of the form '--flag[=arg]' and returns a tuple
+// with the flag atom and whether there is an argument or not.
+// If '=arg' exists and 'arg' isn't a valid argument, an error is returned.
+fn parse_long_equal(flag: &str) -> Result<(Atom, Argument), String> {
+    lazy_static! {
+        static ref LONG_EQUAL: Regex = regex!("^(?P<name>[^=]+)=(?P<arg>.+)$");
+    }
+    match LONG_EQUAL.captures(flag) {
+        None => Ok((Atom::new(flag), Zero)),
+        Some(cap) => {
+            let arg = cap_or_empty(&cap, "arg");
+            if !Atom::is_arg(arg) {
+                err!("Argument '{}' for flag '{}' is not in the \
+                      form ARG or <arg>.", flag, arg)
+            }
+            Ok((Atom::new(cap_or_empty(&cap, "name")), One(None)))
+        }
+    }
+}
+
+fn parse_long_equal_argv(flag: &str) -> (Atom, Option<String>) {
+    lazy_static! {
+        static ref LONG_EQUAL: Regex = regex!("^(?P<name>[^=]+)=(?P<arg>.*)$");
+    }
+    match LONG_EQUAL.captures(flag) {
+        None => (Atom::new(flag), None),
+        Some(cap) => (
+            Atom::new(cap_or_empty(&cap, "name")),
+            Some(cap_or_empty(&cap, "arg").to_string()),
+        ),
+    }
+}
+
+// Tokenizes a usage pattern.
+// Beware: regex hack ahead. Tokenizes based on whitespace separated words.
+// It first normalizes `[xyz]` -> `[ xyz ]` so that delimiters are tokens.
+// Similarly for `...`, `(`, `)` and `|`.
+// One hitch: `--flag=<arg spaces>` is allowed, so we use a regex to pick out
+// words.
+fn pattern_tokens(pat: &str) -> Vec<String> {
+    lazy_static! {
+        static ref NORMALIZE: Regex = regex!(r"\.\.\.|\[|\]|\(|\)|\|");
+        static ref WORDS: Regex = regex!(r"--\S+?=<[^>]+>|<[^>]+>|\S+");
+    }
+
+    let pat = NORMALIZE.replace_all(pat.trim(), " $0 ");
+    let mut words = vec!();
+    for cap in WORDS.captures_iter(&*pat) {
+        words.push(cap[0].to_string());
+    }
+    words
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/synonym.rs
@@ -0,0 +1,107 @@
+use std::collections::HashMap;
+use std::collections::hash_map::{Iter, Keys};
+use std::fmt::Debug;
+use std::hash::Hash;
+use std::iter::{FromIterator, IntoIterator};
+use std::mem;
+
+#[derive(Clone)]
+pub struct SynonymMap<K, V> {
+    vals: HashMap<K, V>,
+    syns: HashMap<K, K>,
+}
+
+impl<K: Eq + Hash, V> SynonymMap<K, V> {
+    pub fn new() -> SynonymMap<K, V> {
+        SynonymMap {
+            vals: HashMap::new(),
+            syns: HashMap::new(),
+        }
+    }
+
+    pub fn insert_synonym(&mut self, from: K, to: K) -> bool {
+        assert!(self.vals.contains_key(&to));
+        self.syns.insert(from, to).is_none()
+    }
+
+    pub fn keys(&self) -> Keys<K, V> {
+        self.vals.keys()
+    }
+
+    pub fn iter(&self) -> Iter<K, V> {
+        self.vals.iter()
+    }
+
+    pub fn synonyms(&self) -> Iter<K, K> {
+        self.syns.iter()
+    }
+
+    pub fn find(&self, k: &K) -> Option<&V> {
+        self.with_key(k, |k| self.vals.get(k))
+    }
+
+    pub fn contains_key(&self, k: &K) -> bool {
+        self.with_key(k, |k| self.vals.contains_key(k))
+    }
+
+    pub fn len(&self) -> usize {
+        self.vals.len()
+    }
+
+    fn with_key<T, F>(&self, k: &K, with: F) -> T where F: FnOnce(&K) -> T {
+        if self.syns.contains_key(k) {
+            with(&self.syns[k])
+        } else {
+            with(k)
+        }
+    }
+}
+
+impl<K: Eq + Hash + Clone, V> SynonymMap<K, V> {
+    pub fn resolve(&self, k: &K) -> K {
+        self.with_key(k, |k| k.clone())
+    }
+
+    pub fn get<'a>(&'a self, k: &K) -> &'a V {
+        self.find(k).unwrap()
+    }
+
+    pub fn find_mut<'a>(&'a mut self, k: &K) -> Option<&'a mut V> {
+        if self.syns.contains_key(k) {
+            self.vals.get_mut(&self.syns[k])
+        } else {
+            self.vals.get_mut(k)
+        }
+    }
+
+    pub fn swap(&mut self, k: K, mut new: V) -> Option<V> {
+        if self.syns.contains_key(&k) {
+            let old = self.vals.get_mut(&k).unwrap();
+            mem::swap(old, &mut new);
+            Some(new)
+        } else {
+            self.vals.insert(k, new)
+        }
+    }
+
+    pub fn insert(&mut self, k: K, v: V) -> bool {
+        self.swap(k, v).is_none()
+    }
+}
+
+impl<K: Eq + Hash + Clone, V> FromIterator<(K, V)> for SynonymMap<K, V> {
+    fn from_iter<T: IntoIterator<Item=(K, V)>>(iter: T) -> SynonymMap<K, V> {
+        let mut map = SynonymMap::new();
+        for (k, v) in iter {
+            map.insert(k, v);
+        }
+        map
+    }
+}
+
+impl<K: Eq + Hash + Debug, V: Debug> Debug for SynonymMap<K, V> {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        self.vals.fmt(f)?;
+        write!(f, " (synomyns: {:?})", self.syns)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/test/mod.rs
@@ -0,0 +1,152 @@
+use std::collections::HashMap;
+use {Docopt, ArgvMap, Error};
+use Value::{self, Switch, Plain};
+
+fn get_args(doc: &str, argv: &[&'static str]) -> ArgvMap {
+    let dopt = match Docopt::new(doc) {
+        Err(err) => panic!("Invalid usage: {}", err),
+        Ok(dopt) => dopt,
+    };
+    match dopt.argv(vec!["cmd"].iter().chain(argv.iter())).parse() {
+        Err(err) => panic!("{}", err),
+        Ok(vals) => vals,
+    }
+}
+
+fn map_from_alist(alist: Vec<(&'static str, Value)>)
+                 -> HashMap<String, Value> {
+    alist.into_iter().map(|(k, v)| (k.to_string(), v)).collect()
+}
+
+fn same_args(expected: &HashMap<String, Value>, got: &ArgvMap) {
+    for (k, ve) in expected.iter() {
+        match got.map.find(k) {
+            None => panic!("EXPECTED has '{}' but GOT does not.", k),
+            Some(vg) => {
+                assert!(ve == vg,
+                        "{}: EXPECTED = '{:?}' != '{:?}' = GOT", k, ve, vg)
+            }
+        }
+    }
+    for (k, vg) in got.map.iter() {
+        match got.map.find(k) {
+            None => panic!("GOT has '{}' but EXPECTED does not.", k),
+            Some(ve) => {
+                assert!(vg == ve,
+                        "{}: GOT = '{:?}' != '{:?}' = EXPECTED", k, vg, ve)
+            }
+        }
+    }
+}
+
+macro_rules! test_expect(
+    ($name:ident, $doc:expr, $args:expr, $expected:expr) => (
+        #[test]
+        fn $name() {
+            let vals = get_args($doc, $args);
+            let expected = map_from_alist($expected);
+            same_args(&expected, &vals);
+        }
+    );
+);
+
+macro_rules! test_user_error(
+    ($name:ident, $doc:expr, $args:expr) => (
+        #[test]
+        #[should_panic]
+        fn $name() { get_args($doc, $args); }
+    );
+);
+
+test_expect!(test_issue_13, "Usage: prog file <file>", &["file", "file"],
+             vec![("file", Switch(true)),
+                  ("<file>", Plain(Some("file".to_string())))]);
+
+test_expect!(test_issue_129, "Usage: prog [options]
+
+Options:
+    --foo ARG   Foo foo.",
+             &["--foo=a b"],
+             vec![("--foo", Plain(Some("a b".into())))]);
+
+#[test]
+fn regression_issue_12() {
+    const USAGE: &'static str = "
+    Usage:
+        whisper info <file>
+        whisper update <file> <timestamp> <value>
+        whisper mark <file> <value>
+    ";
+
+    #[derive(Deserialize, Debug)]
+    struct Args {
+        arg_file: String,
+        cmd_info: bool,
+        cmd_update: bool,
+        arg_timestamp: u64,
+        arg_value: f64,
+    }
+
+    let dopt: Args = Docopt::new(USAGE)
+        .unwrap()
+        .argv(&["whisper", "mark", "./p/blah", "100"])
+        .deserialize()
+        .unwrap();
+    assert_eq!(dopt.arg_timestamp, 0);
+}
+
+#[test]
+fn regression_issue_195() {
+    const USAGE: &'static str = "
+    Usage:
+        slow [-abcdefghijklmnopqrs...]
+    ";
+
+    let argv = &["slow", "-abcdefghijklmnopqrs"];
+    let dopt : Docopt = Docopt::new(USAGE).unwrap().argv(argv);
+
+    dopt.parse().unwrap();
+}
+
+#[test]
+fn regression_issue_219() {
+    #[derive(Deserialize)]
+    struct Args {
+        arg_type: Vec<String>,
+        arg_param: Vec<String>,
+    }
+
+    const USAGE: &'static str = "
+    Usage:
+        encode [-v <type> <param>]...
+    ";
+
+    let argv = &["encode", "-v", "bool", "true", "string", "foo"];
+    let args: Args = Docopt::new(USAGE).unwrap().argv(argv).deserialize().unwrap();
+    assert_eq!(args.arg_type, vec!["bool".to_owned(), "string".to_owned()]);
+    assert_eq!(args.arg_param, vec!["true".to_owned(), "foo".to_owned()]);
+}
+
+#[test]
+fn test_unit_struct() {
+    const USAGE: &'static str = "
+    Usage:
+        cargo version [options]
+
+    Options:
+        -h, --help               Print this message
+    ";
+
+    #[derive(Deserialize)]
+    struct Options;
+
+    let argv = &["cargo", "version"];
+    let dopt: Result<Options, Error>= Docopt::new(USAGE)
+        .unwrap()
+        .argv(argv)
+        .deserialize();
+    assert!(dopt.is_ok());
+}
+
+mod testcases;
+mod suggestions;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/test/suggestions.rs
@@ -0,0 +1,72 @@
+use {Docopt, Error};
+
+fn get_suggestion(doc: &str, argv: &[&'static str]) -> Error {
+    let dopt =
+        match Docopt::new(doc) {
+            Err(err) => panic!("Invalid usage: {}", err),
+            Ok(dopt) => dopt,
+        };
+    let mut argv: Vec<_> = argv.iter().map(|x| x.to_string()).collect();
+    argv.insert(0, "prog".to_string());
+    match dopt.argv(argv.into_iter()).parse() {
+        Err(err) => err,
+        Ok(_) => panic!("Should have been a user error"),
+    }
+}
+
+macro_rules! test_suggest(
+    ($name:ident, $doc:expr, $args:expr, $expected:expr) => (
+        #[test]
+        fn $name() {
+            let sg = get_suggestion($doc, $args);
+            println!("{}", sg);
+            match sg {
+                Error::WithProgramUsage(e, _) => {
+                    match *e {
+                        Error::Argv(msg) => {
+                            println!("{:?}",msg);
+                            assert_eq!(msg, $expected);
+                        }
+                        err => panic!("Error other than argv: {:?}", err)
+                    }
+                }, 
+                _ => panic!("Error without program usage")
+            }
+        }
+    );
+);
+
+
+test_suggest!(test_suggest_1, "Usage: prog [--release]", &["--releas"], "Unknown flag: '--releas'. Did you mean '--release'?"); 
+
+test_suggest!(test_suggest_2, 
+"Usage: prog [-a] <source> <dest>
+        prog [-a] <source>... <dir>
+        prog [-e]
+ Options:
+    -a, --archive  Copy everything.
+", 
+&["-d"], "Unknown flag: '-d'"); 
+
+
+test_suggest!(test_suggest_3, 
+"Usage: prog [-a] <source> <dest>
+        prog [-a] <source>... <dir>
+        prog [-e]
+ Options:
+    -a, --archive  Copy everything.
+    -e, --export Export all the things.
+", 
+&["--expotr"], "Unknown flag: '--expotr'. Did you mean '--export'?"); 
+
+
+test_suggest!(test_suggest_4, 
+"Usage: prog [--import] [--complete]
+", 
+&["--mport", "--complte"], "Unknown flag: '--mport'. Did you mean '--import'?"); 
+
+test_suggest!(test_suggest_5, 
+"Usage: prog [--import] [--complete]
+", 
+&["--import", "--complte"], "Unknown flag: '--complte'. Did you mean '--complete'?"); 
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/test/testcases.docopt
@@ -0,0 +1,1122 @@
+r"""Usage: prog
+
+"""
+$ prog
+{}
+
+$ prog --xxx
+"user-error"
+
+
+r"""Usage: prog [options]
+
+Options: -a  All.
+
+"""
+$ prog
+{"-a": false}
+
+$ prog -a
+{"-a": true}
+
+$ prog -x
+"user-error"
+
+
+r"""Usage: prog [options]
+
+Options: --all  All.
+
+"""
+$ prog
+{"--all": false}
+
+$ prog --all
+{"--all": true}
+
+$ prog --xxx
+"user-error"
+
+
+r"""Usage: prog [options]
+
+Options: -v, --verbose  Verbose.
+
+"""
+$ prog --verbose
+{"--verbose": true}
+
+$ prog --ver
+"user-error"
+
+$ prog -v
+{"--verbose": true}
+
+
+r"""Usage: prog [options]
+
+Options: -p PATH
+
+"""
+$ prog -p home/
+{"-p": "home/"}
+
+$ prog -phome/
+{"-p": "home/"}
+
+$ prog -p
+"user-error"
+
+
+r"""Usage: prog [options]
+
+Options: --path <path>
+
+"""
+$ prog --path home/
+{"--path": "home/"}
+
+$ prog --path=home/
+{"--path": "home/"}
+
+$ prog --pa home/
+"user-error"
+
+$ prog --pa=home/
+"user-error"
+
+$ prog --path
+"user-error"
+
+
+r"""Usage: prog [options]
+
+Options: -p PATH, --path=<path>  Path to files.
+
+"""
+$ prog -proot
+{"--path": "root"}
+
+
+r"""Usage: prog [options]
+
+Options:    -p --path PATH  Path to files.
+
+"""
+$ prog -p root
+{"--path": "root"}
+
+$ prog --path root
+{"--path": "root"}
+
+
+r"""Usage: prog [options]
+
+Options:
+ -p PATH  Path to files [default: ./]
+
+"""
+$ prog
+{"-p": "./"}
+
+$ prog -phome
+{"-p": "home"}
+
+
+r"""UsAgE: prog [options]
+
+OpTiOnS: --path=<files>  Path to files
+                [dEfAuLt: /root]
+
+"""
+$ prog
+{"--path": "/root"}
+
+$ prog --path=home
+{"--path": "home"}
+
+
+r"""usage: prog [options]
+
+options:
+    -a        Add
+    -r        Remote
+    -m <msg>  Message
+
+"""
+$ prog -a -r -m Hello
+{"-a": true,
+ "-r": true,
+ "-m": "Hello"}
+
+$ prog -armyourass
+{"-a": true,
+ "-r": true,
+ "-m": "yourass"}
+
+$ prog -a -r
+{"-a": true,
+ "-r": true,
+ "-m": null}
+
+
+r"""Usage: prog [options]
+
+Options: --version
+         --verbose
+
+"""
+$ prog --version
+{"--version": true,
+ "--verbose": false}
+
+$ prog --verbose
+{"--version": false,
+ "--verbose": true}
+
+$ prog --ver
+"user-error"
+
+$ prog --verb
+"user-error"
+
+
+r"""usage: prog [-a -r -m <msg>]
+
+options:
+ -a        Add
+ -r        Remote
+ -m <msg>  Message
+
+"""
+$ prog -armyourass
+{"-a": true,
+ "-r": true,
+ "-m": "yourass"}
+
+
+r"""usage: prog [-armMSG]
+
+options: -a        Add
+         -r        Remote
+         -m <msg>  Message
+
+"""
+$ prog -a -r -m Hello
+{"-a": true,
+ "-r": true,
+ "-m": "Hello"}
+
+
+r"""usage: prog -a -b
+
+options:
+ -a
+ -b
+
+"""
+$ prog -a -b
+{"-a": true, "-b": true}
+
+$ prog -b -a
+{"-a": true, "-b": true}
+
+$ prog -a
+"user-error"
+
+$ prog
+"user-error"
+
+
+r"""usage: prog (-a -b)
+
+options: -a
+         -b
+
+"""
+$ prog -a -b
+{"-a": true, "-b": true}
+
+$ prog -b -a
+{"-a": true, "-b": true}
+
+$ prog -a
+"user-error"
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [-a] -b
+
+options: -a
+ -b
+
+"""
+$ prog -a -b
+{"-a": true, "-b": true}
+
+$ prog -b -a
+{"-a": true, "-b": true}
+
+$ prog -a
+"user-error"
+
+$ prog -b
+{"-a": false, "-b": true}
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [(-a -b)]
+
+options: -a
+         -b
+
+"""
+$ prog -a -b
+{"-a": true, "-b": true}
+
+$ prog -b -a
+{"-a": true, "-b": true}
+
+$ prog -a
+"user-error"
+
+$ prog -b
+"user-error"
+
+$ prog
+{"-a": false, "-b": false}
+
+
+r"""usage: prog (-a|-b)
+
+options: -a
+         -b
+
+"""
+$ prog -a -b
+"user-error"
+
+$ prog
+"user-error"
+
+$ prog -a
+{"-a": true, "-b": false}
+
+$ prog -b
+{"-a": false, "-b": true}
+
+
+r"""usage: prog [ -a | -b ]
+
+options: -a
+         -b
+
+"""
+$ prog -a -b
+"user-error"
+
+$ prog
+{"-a": false, "-b": false}
+
+$ prog -a
+{"-a": true, "-b": false}
+
+$ prog -b
+{"-a": false, "-b": true}
+
+
+r"""usage: prog <arg>"""
+$ prog 10
+{"<arg>": "10"}
+
+$ prog 10 20
+"user-error"
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [<arg>]"""
+$ prog 10
+{"<arg>": "10"}
+
+$ prog 10 20
+"user-error"
+
+$ prog
+{"<arg>": null}
+
+
+r"""usage: prog <kind> <name> <type>"""
+$ prog 10 20 40
+{"<kind>": "10", "<name>": "20", "<type>": "40"}
+
+$ prog 10 20
+"user-error"
+
+$ prog
+"user-error"
+
+
+r"""usage: prog <kind> [<name> <type>]"""
+$ prog 10 20 40
+{"<kind>": "10", "<name>": "20", "<type>": "40"}
+
+$ prog 10 20
+{"<kind>": "10", "<name>": "20", "<type>": null}
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [<kind> | <name> <type>]"""
+$ prog 10 20 40
+"user-error"
+
+$ prog 20 40
+{"<kind>": null, "<name>": "20", "<type>": "40"}
+
+$ prog
+{"<kind>": null, "<name>": null, "<type>": null}
+
+
+r"""usage: prog (<kind> --all | <name>)
+
+options:
+ --all
+
+"""
+$ prog 10 --all
+{"<kind>": "10", "--all": true, "<name>": null}
+
+$ prog 10
+{"<kind>": null, "--all": false, "<name>": "10"}
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [<name> <name>]"""
+$ prog 10 20
+{"<name>": ["10", "20"]}
+
+$ prog 10
+{"<name>": ["10"]}
+
+$ prog
+{"<name>": []}
+
+
+r"""usage: prog [(<name> <name>)]"""
+$ prog 10 20
+{"<name>": ["10", "20"]}
+
+$ prog 10
+"user-error"
+
+$ prog
+{"<name>": []}
+
+
+r"""usage: prog NAME..."""
+$ prog 10 20
+{"NAME": ["10", "20"]}
+
+$ prog 10
+{"NAME": ["10"]}
+
+$ prog
+"user-error"
+
+
+r"""usage: prog [NAME]..."""
+$ prog 10 20
+{"NAME": ["10", "20"]}
+
+$ prog 10
+{"NAME": ["10"]}
+
+$ prog
+{"NAME": []}
+
+
+r"""usage: prog [NAME...]"""
+$ prog 10 20
+{"NAME": ["10", "20"]}
+
+$ prog 10
+{"NAME": ["10"]}
+
+$ prog
+{"NAME": []}
+
+
+r"""usage: prog [NAME [NAME ...]]"""
+$ prog 10 20
+{"NAME": ["10", "20"]}
+
+$ prog 10
+{"NAME": ["10"]}
+
+$ prog
+{"NAME": []}
+
+
+r"""usage: prog (NAME | --foo NAME)
+
+options: --foo
+
+"""
+$ prog 10
+{"NAME": "10", "--foo": false}
+
+$ prog --foo 10
+{"NAME": "10", "--foo": true}
+
+$ prog --foo=10
+"user-error"
+
+
+r"""usage: prog (NAME | --foo) [--bar | NAME]
+
+options: --foo
+options: --bar
+
+"""
+$ prog 10
+{"NAME": ["10"], "--foo": false, "--bar": false}
+
+$ prog 10 20
+{"NAME": ["10", "20"], "--foo": false, "--bar": false}
+
+$ prog --foo --bar
+{"NAME": [], "--foo": true, "--bar": true}
+
+
+r"""Naval Fate.
+
+Usage:
+  prog ship new <name>...
+  prog ship [<name>] move <x> <y> [--speed=<kn>]
+  prog ship shoot <x> <y>
+  prog mine (set|remove) <x> <y> [--moored|--drifting]
+  prog -h | --help
+  prog --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Mored (anchored) mine.
+  --drifting    Drifting mine.
+
+"""
+$ prog ship Guardian move 150 300 --speed=20
+{"--drifting": false,
+ "--help": false,
+ "--moored": false,
+ "--speed": "20",
+ "--version": false,
+ "<name>": ["Guardian"],
+ "<x>": "150",
+ "<y>": "300",
+ "mine": false,
+ "move": true,
+ "new": false,
+ "remove": false,
+ "set": false,
+ "ship": true,
+ "shoot": false}
+
+
+r"""usage: prog --hello"""
+$ prog --hello
+{"--hello": true}
+
+
+r"""usage: prog [--hello=<world>]"""
+$ prog
+{"--hello": null}
+
+$ prog --hello wrld
+{"--hello": "wrld"}
+
+
+r"""usage: prog [-o]"""
+$ prog
+{"-o": false}
+
+$ prog -o
+{"-o": true}
+
+
+r"""usage: prog [-opr]"""
+$ prog -op
+{"-o": true, "-p": true, "-r": false}
+
+
+r"""usage: prog --aabb | --aa"""
+$ prog --aa
+{"--aabb": false, "--aa": true}
+
+$ prog --a
+"user-error"  # not a unique prefix
+
+#
+# Counting number of flags
+#
+
+r"""Usage: prog -v"""
+$ prog -v
+{"-v": true}
+
+
+r"""Usage: prog [-v -v]"""
+$ prog
+{"-v": 0}
+
+$ prog -v
+{"-v": 1}
+
+$ prog -vv
+{"-v": 2}
+
+
+r"""Usage: prog -v ..."""
+$ prog
+"user-error"
+
+$ prog -v
+{"-v": 1}
+
+$ prog -vv
+{"-v": 2}
+
+$ prog -vvvvvv
+{"-v": 6}
+
+
+r"""Usage: prog [-v | -vv | -vvv]
+
+This one is probably most readable user-friednly variant.
+
+"""
+$ prog
+{"-v": 0}
+
+$ prog -v
+{"-v": 1}
+
+$ prog -vv
+{"-v": 2}
+
+$ prog -vvvv
+"user-error"
+
+
+r"""usage: prog [--ver --ver]"""
+$ prog --ver --ver
+{"--ver": 2}
+
+
+#
+# Counting commands
+#
+
+r"""usage: prog [go]"""
+$ prog go
+{"go": true}
+
+
+r"""usage: prog [go go]"""
+$ prog
+{"go": 0}
+
+$ prog go
+{"go": 1}
+
+$ prog go go
+{"go": 2}
+
+$ prog go go go
+"user-error"
+
+r"""usage: prog go..."""
+$ prog go go go go go
+{"go": 5}
+
+#
+# [options] does not include options from usage-pattern
+#
+r"""usage: prog [options] [-a]
+
+options: -a
+         -b
+"""
+$ prog -a
+{"-a": true, "-b": false}
+
+$ prog -aa
+"user-error"
+
+#
+# Test [options] shourtcut
+#
+
+r"""Usage: prog [options] A
+
+Options:
+    -q  Be quiet
+    -v  Be verbose.
+
+"""
+$ prog arg
+{"A": "arg", "-v": false, "-q": false}
+
+$ prog -v arg
+{"A": "arg", "-v": true, "-q": false}
+
+$ prog -q arg
+{"A": "arg", "-v": false, "-q": true}
+
+#
+# Test single dash
+#
+
+r"""usage: prog [-]"""
+
+$ prog -
+{"-": true}
+
+$ prog
+{"-": false}
+
+#
+# If argument is repeated, its value should always be a list
+#
+
+r"""usage: prog [NAME [NAME ...]]"""
+
+$ prog a b
+{"NAME": ["a", "b"]}
+
+$ prog
+{"NAME": []}
+
+#
+# Option's argument defaults to null/None
+#
+
+r"""usage: prog [options]
+
+options:
+ -a        Add
+ -m <msg>  Message
+
+"""
+$ prog -a
+{"-m": null, "-a": true}
+
+#
+# Test options without description
+#
+
+r"""usage: prog --hello"""
+$ prog --hello
+{"--hello": true}
+
+r"""usage: prog [--hello=<world>]"""
+$ prog
+{"--hello": null}
+
+$ prog --hello wrld
+{"--hello": "wrld"}
+
+r"""usage: prog [-o]"""
+$ prog
+{"-o": false}
+
+$ prog -o
+{"-o": true}
+
+r"""usage: prog [-opr]"""
+$ prog -op
+{"-o": true, "-p": true, "-r": false}
+
+r"""usage: git [-v | --verbose]"""
+$ prog -v
+{"-v": true, "--verbose": false}
+
+r"""usage: git remote [-v | --verbose]"""
+$ prog remote -v
+{"remote": true, "-v": true, "--verbose": false}
+
+#
+# Test empty usage pattern
+#
+
+r"""usage: prog"""
+$ prog
+{}
+
+r"""usage: prog
+           prog <a> <b>
+"""
+$ prog 1 2
+{"<a>": "1", "<b>": "2"}
+
+$ prog
+{"<a>": null, "<b>": null}
+
+r"""usage: prog <a> <b>
+           prog
+"""
+$ prog
+{"<a>": null, "<b>": null}
+
+#
+# Option's argument should not capture default value from usage pattern
+#
+
+r"""usage: prog [--file=<f>]"""
+$ prog
+{"--file": null}
+
+r"""usage: prog [--file=<f>]
+
+options: --file <a>
+
+"""
+$ prog
+{"--file": null}
+
+r"""Usage: prog [-a <host:port>]
+
+Options: -a, --address <host:port>  TCP address [default: localhost:6283].
+
+"""
+$ prog
+{"--address": "localhost:6283"}
+
+#
+# If option with argument could be repeated,
+# its arguments should be accumulated into a list
+#
+
+r"""usage: prog --long=<arg> ..."""
+
+$ prog --long one
+{"--long": ["one"]}
+
+$ prog --long one --long two
+{"--long": ["one", "two"]}
+
+#
+# Test multiple elements repeated at once
+#
+
+r"""usage: prog (go <direction> --speed=<km/h>)..."""
+$ prog  go left --speed=5  go right --speed=9
+{"go": 2, "<direction>": ["left", "right"], "--speed": ["5", "9"]}
+
+#
+# Required options should work with option shortcut
+#
+
+r"""usage: prog [options] -a
+
+options: -a
+
+"""
+$ prog -a
+{"-a": true}
+
+#
+# If option could be repeated its defaults should be split into a list
+#
+
+r"""usage: prog [-o <o>]...
+
+options: -o <o>  [default: x]
+
+"""
+$ prog -o this -o that
+{"-o": ["this", "that"]}
+
+$ prog
+{"-o": ["x"]}
+
+r"""usage: prog [-o <o>]...
+
+options: -o <o>  [default: x y]
+
+"""
+$ prog -o this
+{"-o": ["this"]}
+
+$ prog
+{"-o": ["x", "y"]}
+
+#
+# Test stacked option's argument
+#
+
+r"""usage: prog -pPATH
+
+options: -p PATH
+
+"""
+$ prog -pHOME
+{"-p": "HOME"}
+
+#
+# Issue 56: Repeated mutually exclusive args give nested lists sometimes
+#
+
+r"""Usage: foo (--xx=X|--yy=Y)..."""
+$ prog --xx=1 --yy=2
+{"--xx": ["1"], "--yy": ["2"]}
+
+#
+# POSIXly correct tokenization
+#
+
+r"""usage: prog [<input file>]"""
+$ prog f.txt
+{"<input file>": "f.txt"}
+
+r"""usage: prog [--input=<file name>]..."""
+$ prog --input a.txt --input=b.txt
+{"--input": ["a.txt", "b.txt"]}
+
+#
+# Issue 85: `[options]` shourtcut with multiple subcommands
+#
+
+r"""usage: prog good [options]
+           prog fail [options]
+
+options: --loglevel=N
+
+"""
+$ prog fail --loglevel 5
+{"--loglevel": "5", "fail": true, "good": false}
+
+#
+# Usage-section syntax
+#
+
+r"""usage:prog --foo"""
+$ prog --foo
+{"--foo": true}
+
+r"""PROGRAM USAGE: prog --foo"""
+$ prog --foo
+{"--foo": true}
+
+r"""Usage: prog --foo
+           prog --bar
+NOT PART OF SECTION"""
+$ prog --foo
+{"--foo": true, "--bar": false}
+
+r"""Usage:
+ prog --foo
+ prog --bar
+
+NOT PART OF SECTION"""
+$ prog --foo
+{"--foo": true, "--bar": false}
+
+r"""Usage:
+ prog --foo
+ prog --bar
+NOT PART OF SECTION"""
+$ prog --foo
+{"--foo": true, "--bar": false}
+
+#
+# Options-section syntax
+#
+
+r"""Usage: prog [options]
+
+global options: --foo
+local options: --baz
+               --bar
+other options:
+ --egg
+ --spam
+-not-an-option-
+
+"""
+$ prog --bar --egg
+{"--bar": true, "--egg": true, "--spam": false}
+
+r"""Usage: prog [-a] [--] [<arg>...]"""
+$ program -a
+{"-a": true, "<arg>": []}
+
+r"""Usage: prog [-a] [--] [<arg>...]"""
+$ program --
+{"-a": false, "<arg>": []}
+
+r"""Usage: prog [-a] [--] [<arg>...]"""
+$ program -a -- -b
+{"-a": true, "<arg>": ["-b"]}
+
+r"""Usage: prog [-a] [--] [<arg>...]"""
+$ program -a -- -a
+{"-a": true, "<arg>": ["-a"]}
+
+r"""Usage: prog [-a] [--] [<arg>...]"""
+$ program -- -a
+{"-a": false, "<arg>": ["-a"]}
+
+r"""Usage: prog test [options] [--] [<args>...]"""
+$ program test a -- -b
+{"<args>": ["a", "-b"]}
+
+r"""Usage: prog test [options] [--] [<args>...]"""
+$ program test -- -b
+{"<args>": ["-b"]}
+
+r"""Usage: prog test [options] [--] [<args>...]"""
+$ program test a -b
+"user-error"
+
+r"""Usage: prog test [options] [--] [<args>...]"""
+$ program test -- -b --
+{"<args>": ["-b", "--"]}
+
+r"""Usage: prog [options]
+
+Options:
+  -a ...  Foo
+"""
+$ program
+{"-a": 0}
+$ program -a
+{"-a": 1}
+$ program -a -a
+{"-a": 2}
+$ program -aa
+{"-a": 2}
+$ program -a -a -a
+{"-a": 3}
+$ program -aaa
+{"-a": 3}
+
+r"""Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo
+"""
+$ program
+{"-a": 0}
+$ program -a
+{"-a": 1}
+$ program -a --all
+{"-a": 2}
+$ program -aa --all
+{"-a": 3}
+$ program --all
+{"-a": 1}
+$ program --all --all
+{"-a": 2}
+
+r"""Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo
+"""
+$ program
+{"-a": []}
+$ program -a 1
+{"-a": ["1"]}
+$ program -a 2 --all 3
+{"-a": ["2", "3"]}
+$ program -a4 -a5 --all 6
+{"-a": ["4", "5", "6"]}
+$ program --all 7
+{"-a": ["7"]}
+$ program --all 8 --all 9
+{"-a": ["8", "9"]}
+
+r"""Usage: prog [options]
+
+Options:
+  --all ...  Foo
+"""
+$ program
+{"--all": 0}
+$ program --all
+{"--all": 1}
+$ program --all --all
+{"--all": 2}
+
+r"""Usage: prog [options]
+
+Options:
+  --all=ARG ...  Foo
+"""
+$ program
+{"--all": []}
+$ program --all 1
+{"--all": ["1"]}
+$ program --all 2 --all 3
+{"--all": ["2", "3"]}
+
+r"""Usage: prog [options]
+
+Options:
+  --all  ...  Foo
+"""
+$ program --all --all
+"user-error"
+
+r"""Usage: prog [options]
+
+Options:
+  --all ARG  ...  Foo
+"""
+$ program --all foo --all bar
+"user-error"
+
+r"""Usage: prog --speed=ARG"""
+$ program --speed 20
+{"--speed": "20"}
+$ program --speed=20
+{"--speed": "20"}
+$ program --speed=-20
+{"--speed": "-20"}
+$ program --speed -20
+{"--speed": "-20"}
+
+#
+# Issue 187: Fails to parse a default value containing ']'
+#
+
+r"""usage: prog [--datetime=<regex>]
+
+options: --datetime=<regex>    Regex for datetimes [default: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}]
+
+"""
+$ prog
+{"--datetime": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}"}
+
+#
+# Issue 137: -x-y being seen as a positional argument
+#
+
+r"""Usage: prog [options]
+
+Options:
+  -x ARG
+  -y"""
+$ prog -x-y
+{"-x": "-y"}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/test/testcases.rs
@@ -0,0 +1,801 @@
+// !!! ATTENTION !!!
+// This file is automatically generated by `scripts/mk-testcases`.
+// Please do not edit this file directly!
+
+use Value::{Switch, Counted, Plain, List};
+use test::{get_args, map_from_alist, same_args};
+
+test_expect!(test_0_testcases, "Usage: prog", &[], vec!());
+
+test_user_error!(test_1_testcases, "Usage: prog", &["--xxx"]);
+
+test_expect!(test_2_testcases, "Usage: prog [options]
+
+Options: -a  All.", &[], vec!(("-a", Switch(false))));
+
+test_expect!(test_3_testcases, "Usage: prog [options]
+
+Options: -a  All.", &["-a"], vec!(("-a", Switch(true))));
+
+test_user_error!(test_4_testcases, "Usage: prog [options]
+
+Options: -a  All.", &["-x"]);
+
+test_expect!(test_5_testcases, "Usage: prog [options]
+
+Options: --all  All.", &[], vec!(("--all", Switch(false))));
+
+test_expect!(test_6_testcases, "Usage: prog [options]
+
+Options: --all  All.", &["--all"], vec!(("--all", Switch(true))));
+
+test_user_error!(test_7_testcases, "Usage: prog [options]
+
+Options: --all  All.", &["--xxx"]);
+
+test_expect!(test_8_testcases, "Usage: prog [options]
+
+Options: -v, --verbose  Verbose.", &["--verbose"], vec!(("--verbose", Switch(true))));
+
+test_user_error!(test_9_testcases, "Usage: prog [options]
+
+Options: -v, --verbose  Verbose.", &["--ver"]);
+
+test_expect!(test_10_testcases, "Usage: prog [options]
+
+Options: -v, --verbose  Verbose.", &["-v"], vec!(("--verbose", Switch(true))));
+
+test_expect!(test_11_testcases, "Usage: prog [options]
+
+Options: -p PATH", &["-p", "home/"], vec!(("-p", Plain(Some("home/".to_string())))));
+
+test_expect!(test_12_testcases, "Usage: prog [options]
+
+Options: -p PATH", &["-phome/"], vec!(("-p", Plain(Some("home/".to_string())))));
+
+test_user_error!(test_13_testcases, "Usage: prog [options]
+
+Options: -p PATH", &["-p"]);
+
+test_expect!(test_14_testcases, "Usage: prog [options]
+
+Options: --path <path>", &["--path", "home/"], vec!(("--path", Plain(Some("home/".to_string())))));
+
+test_expect!(test_15_testcases, "Usage: prog [options]
+
+Options: --path <path>", &["--path=home/"], vec!(("--path", Plain(Some("home/".to_string())))));
+
+test_user_error!(test_16_testcases, "Usage: prog [options]
+
+Options: --path <path>", &["--pa", "home/"]);
+
+test_user_error!(test_17_testcases, "Usage: prog [options]
+
+Options: --path <path>", &["--pa=home/"]);
+
+test_user_error!(test_18_testcases, "Usage: prog [options]
+
+Options: --path <path>", &["--path"]);
+
+test_expect!(test_19_testcases, "Usage: prog [options]
+
+Options: -p PATH, --path=<path>  Path to files.", &["-proot"], vec!(("--path", Plain(Some("root".to_string())))));
+
+test_expect!(test_20_testcases, "Usage: prog [options]
+
+Options:    -p --path PATH  Path to files.", &["-p", "root"], vec!(("--path", Plain(Some("root".to_string())))));
+
+test_expect!(test_21_testcases, "Usage: prog [options]
+
+Options:    -p --path PATH  Path to files.", &["--path", "root"], vec!(("--path", Plain(Some("root".to_string())))));
+
+test_expect!(test_22_testcases, "Usage: prog [options]
+
+Options:
+ -p PATH  Path to files [default: ./]", &[], vec!(("-p", Plain(Some("./".to_string())))));
+
+test_expect!(test_23_testcases, "Usage: prog [options]
+
+Options:
+ -p PATH  Path to files [default: ./]", &["-phome"], vec!(("-p", Plain(Some("home".to_string())))));
+
+test_expect!(test_24_testcases, "UsAgE: prog [options]
+
+OpTiOnS: --path=<files>  Path to files
+                [dEfAuLt: /root]", &[], vec!(("--path", Plain(Some("/root".to_string())))));
+
+test_expect!(test_25_testcases, "UsAgE: prog [options]
+
+OpTiOnS: --path=<files>  Path to files
+                [dEfAuLt: /root]", &["--path=home"], vec!(("--path", Plain(Some("home".to_string())))));
+
+test_expect!(test_26_testcases, "usage: prog [options]
+
+options:
+    -a        Add
+    -r        Remote
+    -m <msg>  Message", &["-a", "-r", "-m", "Hello"], vec!(("-m", Plain(Some("Hello".to_string()))), ("-a", Switch(true)), ("-r", Switch(true))));
+
+test_expect!(test_27_testcases, "usage: prog [options]
+
+options:
+    -a        Add
+    -r        Remote
+    -m <msg>  Message", &["-armyourass"], vec!(("-m", Plain(Some("yourass".to_string()))), ("-a", Switch(true)), ("-r", Switch(true))));
+
+test_expect!(test_28_testcases, "usage: prog [options]
+
+options:
+    -a        Add
+    -r        Remote
+    -m <msg>  Message", &["-a", "-r"], vec!(("-m", Plain(None)), ("-a", Switch(true)), ("-r", Switch(true))));
+
+test_expect!(test_29_testcases, "Usage: prog [options]
+
+Options: --version
+         --verbose", &["--version"], vec!(("--verbose", Switch(false)), ("--version", Switch(true))));
+
+test_expect!(test_30_testcases, "Usage: prog [options]
+
+Options: --version
+         --verbose", &["--verbose"], vec!(("--verbose", Switch(true)), ("--version", Switch(false))));
+
+test_user_error!(test_31_testcases, "Usage: prog [options]
+
+Options: --version
+         --verbose", &["--ver"]);
+
+test_user_error!(test_32_testcases, "Usage: prog [options]
+
+Options: --version
+         --verbose", &["--verb"]);
+
+test_expect!(test_33_testcases, "usage: prog [-a -r -m <msg>]
+
+options:
+ -a        Add
+ -r        Remote
+ -m <msg>  Message", &["-armyourass"], vec!(("-m", Plain(Some("yourass".to_string()))), ("-a", Switch(true)), ("-r", Switch(true))));
+
+test_expect!(test_34_testcases, "usage: prog [-armMSG]
+
+options: -a        Add
+         -r        Remote
+         -m <msg>  Message", &["-a", "-r", "-m", "Hello"], vec!(("-m", Plain(Some("Hello".to_string()))), ("-a", Switch(true)), ("-r", Switch(true))));
+
+test_expect!(test_35_testcases, "usage: prog -a -b
+
+options:
+ -a
+ -b", &["-a", "-b"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_expect!(test_36_testcases, "usage: prog -a -b
+
+options:
+ -a
+ -b", &["-b", "-a"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_user_error!(test_37_testcases, "usage: prog -a -b
+
+options:
+ -a
+ -b", &["-a"]);
+
+test_user_error!(test_38_testcases, "usage: prog -a -b
+
+options:
+ -a
+ -b", &[]);
+
+test_expect!(test_39_testcases, "usage: prog (-a -b)
+
+options: -a
+         -b", &["-a", "-b"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_expect!(test_40_testcases, "usage: prog (-a -b)
+
+options: -a
+         -b", &["-b", "-a"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_user_error!(test_41_testcases, "usage: prog (-a -b)
+
+options: -a
+         -b", &["-a"]);
+
+test_user_error!(test_42_testcases, "usage: prog (-a -b)
+
+options: -a
+         -b", &[]);
+
+test_expect!(test_43_testcases, "usage: prog [-a] -b
+
+options: -a
+ -b", &["-a", "-b"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_expect!(test_44_testcases, "usage: prog [-a] -b
+
+options: -a
+ -b", &["-b", "-a"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_user_error!(test_45_testcases, "usage: prog [-a] -b
+
+options: -a
+ -b", &["-a"]);
+
+test_expect!(test_46_testcases, "usage: prog [-a] -b
+
+options: -a
+ -b", &["-b"], vec!(("-a", Switch(false)), ("-b", Switch(true))));
+
+test_user_error!(test_47_testcases, "usage: prog [-a] -b
+
+options: -a
+ -b", &[]);
+
+test_expect!(test_48_testcases, "usage: prog [(-a -b)]
+
+options: -a
+         -b", &["-a", "-b"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_expect!(test_49_testcases, "usage: prog [(-a -b)]
+
+options: -a
+         -b", &["-b", "-a"], vec!(("-a", Switch(true)), ("-b", Switch(true))));
+
+test_user_error!(test_50_testcases, "usage: prog [(-a -b)]
+
+options: -a
+         -b", &["-a"]);
+
+test_user_error!(test_51_testcases, "usage: prog [(-a -b)]
+
+options: -a
+         -b", &["-b"]);
+
+test_expect!(test_52_testcases, "usage: prog [(-a -b)]
+
+options: -a
+         -b", &[], vec!(("-a", Switch(false)), ("-b", Switch(false))));
+
+test_user_error!(test_53_testcases, "usage: prog (-a|-b)
+
+options: -a
+         -b", &["-a", "-b"]);
+
+test_user_error!(test_54_testcases, "usage: prog (-a|-b)
+
+options: -a
+         -b", &[]);
+
+test_expect!(test_55_testcases, "usage: prog (-a|-b)
+
+options: -a
+         -b", &["-a"], vec!(("-a", Switch(true)), ("-b", Switch(false))));
+
+test_expect!(test_56_testcases, "usage: prog (-a|-b)
+
+options: -a
+         -b", &["-b"], vec!(("-a", Switch(false)), ("-b", Switch(true))));
+
+test_user_error!(test_57_testcases, "usage: prog [ -a | -b ]
+
+options: -a
+         -b", &["-a", "-b"]);
+
+test_expect!(test_58_testcases, "usage: prog [ -a | -b ]
+
+options: -a
+         -b", &[], vec!(("-a", Switch(false)), ("-b", Switch(false))));
+
+test_expect!(test_59_testcases, "usage: prog [ -a | -b ]
+
+options: -a
+         -b", &["-a"], vec!(("-a", Switch(true)), ("-b", Switch(false))));
+
+test_expect!(test_60_testcases, "usage: prog [ -a | -b ]
+
+options: -a
+         -b", &["-b"], vec!(("-a", Switch(false)), ("-b", Switch(true))));
+
+test_expect!(test_61_testcases, "usage: prog <arg>", &["10"], vec!(("<arg>", Plain(Some("10".to_string())))));
+
+test_user_error!(test_62_testcases, "usage: prog <arg>", &["10", "20"]);
+
+test_user_error!(test_63_testcases, "usage: prog <arg>", &[]);
+
+test_expect!(test_64_testcases, "usage: prog [<arg>]", &["10"], vec!(("<arg>", Plain(Some("10".to_string())))));
+
+test_user_error!(test_65_testcases, "usage: prog [<arg>]", &["10", "20"]);
+
+test_expect!(test_66_testcases, "usage: prog [<arg>]", &[], vec!(("<arg>", Plain(None))));
+
+test_expect!(test_67_testcases, "usage: prog <kind> <name> <type>", &["10", "20", "40"], vec!(("<type>", Plain(Some("40".to_string()))), ("<kind>", Plain(Some("10".to_string()))), ("<name>", Plain(Some("20".to_string())))));
+
+test_user_error!(test_68_testcases, "usage: prog <kind> <name> <type>", &["10", "20"]);
+
+test_user_error!(test_69_testcases, "usage: prog <kind> <name> <type>", &[]);
+
+test_expect!(test_70_testcases, "usage: prog <kind> [<name> <type>]", &["10", "20", "40"], vec!(("<type>", Plain(Some("40".to_string()))), ("<kind>", Plain(Some("10".to_string()))), ("<name>", Plain(Some("20".to_string())))));
+
+test_expect!(test_71_testcases, "usage: prog <kind> [<name> <type>]", &["10", "20"], vec!(("<type>", Plain(None)), ("<kind>", Plain(Some("10".to_string()))), ("<name>", Plain(Some("20".to_string())))));
+
+test_user_error!(test_72_testcases, "usage: prog <kind> [<name> <type>]", &[]);
+
+test_user_error!(test_73_testcases, "usage: prog [<kind> | <name> <type>]", &["10", "20", "40"]);
+
+test_expect!(test_74_testcases, "usage: prog [<kind> | <name> <type>]", &["20", "40"], vec!(("<type>", Plain(Some("40".to_string()))), ("<kind>", Plain(None)), ("<name>", Plain(Some("20".to_string())))));
+
+test_expect!(test_75_testcases, "usage: prog [<kind> | <name> <type>]", &[], vec!(("<type>", Plain(None)), ("<kind>", Plain(None)), ("<name>", Plain(None))));
+
+test_expect!(test_76_testcases, "usage: prog (<kind> --all | <name>)
+
+options:
+ --all", &["10", "--all"], vec!(("--all", Switch(true)), ("<kind>", Plain(Some("10".to_string()))), ("<name>", Plain(None))));
+
+test_expect!(test_77_testcases, "usage: prog (<kind> --all | <name>)
+
+options:
+ --all", &["10"], vec!(("--all", Switch(false)), ("<kind>", Plain(None)), ("<name>", Plain(Some("10".to_string())))));
+
+test_user_error!(test_78_testcases, "usage: prog (<kind> --all | <name>)
+
+options:
+ --all", &[]);
+
+test_expect!(test_79_testcases, "usage: prog [<name> <name>]", &["10", "20"], vec!(("<name>", List(vec!("10".to_string(), "20".to_string())))));
+
+test_expect!(test_80_testcases, "usage: prog [<name> <name>]", &["10"], vec!(("<name>", List(vec!("10".to_string())))));
+
+test_expect!(test_81_testcases, "usage: prog [<name> <name>]", &[], vec!(("<name>", List(vec!()))));
+
+test_expect!(test_82_testcases, "usage: prog [(<name> <name>)]", &["10", "20"], vec!(("<name>", List(vec!("10".to_string(), "20".to_string())))));
+
+test_user_error!(test_83_testcases, "usage: prog [(<name> <name>)]", &["10"]);
+
+test_expect!(test_84_testcases, "usage: prog [(<name> <name>)]", &[], vec!(("<name>", List(vec!()))));
+
+test_expect!(test_85_testcases, "usage: prog NAME...", &["10", "20"], vec!(("NAME", List(vec!("10".to_string(), "20".to_string())))));
+
+test_expect!(test_86_testcases, "usage: prog NAME...", &["10"], vec!(("NAME", List(vec!("10".to_string())))));
+
+test_user_error!(test_87_testcases, "usage: prog NAME...", &[]);
+
+test_expect!(test_88_testcases, "usage: prog [NAME]...", &["10", "20"], vec!(("NAME", List(vec!("10".to_string(), "20".to_string())))));
+
+test_expect!(test_89_testcases, "usage: prog [NAME]...", &["10"], vec!(("NAME", List(vec!("10".to_string())))));
+
+test_expect!(test_90_testcases, "usage: prog [NAME]...", &[], vec!(("NAME", List(vec!()))));
+
+test_expect!(test_91_testcases, "usage: prog [NAME...]", &["10", "20"], vec!(("NAME", List(vec!("10".to_string(), "20".to_string())))));
+
+test_expect!(test_92_testcases, "usage: prog [NAME...]", &["10"], vec!(("NAME", List(vec!("10".to_string())))));
+
+test_expect!(test_93_testcases, "usage: prog [NAME...]", &[], vec!(("NAME", List(vec!()))));
+
+test_expect!(test_94_testcases, "usage: prog [NAME [NAME ...]]", &["10", "20"], vec!(("NAME", List(vec!("10".to_string(), "20".to_string())))));
+
+test_expect!(test_95_testcases, "usage: prog [NAME [NAME ...]]", &["10"], vec!(("NAME", List(vec!("10".to_string())))));
+
+test_expect!(test_96_testcases, "usage: prog [NAME [NAME ...]]", &[], vec!(("NAME", List(vec!()))));
+
+test_expect!(test_97_testcases, "usage: prog (NAME | --foo NAME)
+
+options: --foo", &["10"], vec!(("NAME", Plain(Some("10".to_string()))), ("--foo", Switch(false))));
+
+test_expect!(test_98_testcases, "usage: prog (NAME | --foo NAME)
+
+options: --foo", &["--foo", "10"], vec!(("NAME", Plain(Some("10".to_string()))), ("--foo", Switch(true))));
+
+test_user_error!(test_99_testcases, "usage: prog (NAME | --foo NAME)
+
+options: --foo", &["--foo=10"]);
+
+test_expect!(test_100_testcases, "usage: prog (NAME | --foo) [--bar | NAME]
+
+options: --foo
+options: --bar", &["10"], vec!(("--bar", Switch(false)), ("NAME", List(vec!("10".to_string()))), ("--foo", Switch(false))));
+
+test_expect!(test_101_testcases, "usage: prog (NAME | --foo) [--bar | NAME]
+
+options: --foo
+options: --bar", &["10", "20"], vec!(("--bar", Switch(false)), ("NAME", List(vec!("10".to_string(), "20".to_string()))), ("--foo", Switch(false))));
+
+test_expect!(test_102_testcases, "usage: prog (NAME | --foo) [--bar | NAME]
+
+options: --foo
+options: --bar", &["--foo", "--bar"], vec!(("--bar", Switch(true)), ("NAME", List(vec!())), ("--foo", Switch(true))));
+
+test_expect!(test_103_testcases, "Naval Fate.
+
+Usage:
+  prog ship new <name>...
+  prog ship [<name>] move <x> <y> [--speed=<kn>]
+  prog ship shoot <x> <y>
+  prog mine (set|remove) <x> <y> [--moored|--drifting]
+  prog -h | --help
+  prog --version
+
+Options:
+  -h --help     Show this screen.
+  --version     Show version.
+  --speed=<kn>  Speed in knots [default: 10].
+  --moored      Mored (anchored) mine.
+  --drifting    Drifting mine.", &["ship", "Guardian", "move", "150", "300", "--speed=20"], vec!(("shoot", Switch(false)), ("--moored", Switch(false)), ("--drifting", Switch(false)), ("move", Switch(true)), ("--speed", Plain(Some("20".to_string()))), ("mine", Switch(false)), ("new", Switch(false)), ("--version", Switch(false)), ("set", Switch(false)), ("remove", Switch(false)), ("<name>", List(vec!("Guardian".to_string()))), ("ship", Switch(true)), ("<x>", Plain(Some("150".to_string()))), ("<y>", Plain(Some("300".to_string()))), ("--help", Switch(false))));
+
+test_expect!(test_104_testcases, "usage: prog --hello", &["--hello"], vec!(("--hello", Switch(true))));
+
+test_expect!(test_105_testcases, "usage: prog [--hello=<world>]", &[], vec!(("--hello", Plain(None))));
+
+test_expect!(test_106_testcases, "usage: prog [--hello=<world>]", &["--hello", "wrld"], vec!(("--hello", Plain(Some("wrld".to_string())))));
+
+test_expect!(test_107_testcases, "usage: prog [-o]", &[], vec!(("-o", Switch(false))));
+
+test_expect!(test_108_testcases, "usage: prog [-o]", &["-o"], vec!(("-o", Switch(true))));
+
+test_expect!(test_109_testcases, "usage: prog [-opr]", &["-op"], vec!(("-o", Switch(true)), ("-p", Switch(true)), ("-r", Switch(false))));
+
+test_expect!(test_110_testcases, "usage: prog --aabb | --aa", &["--aa"], vec!(("--aa", Switch(true)), ("--aabb", Switch(false))));
+
+test_user_error!(test_111_testcases, "usage: prog --aabb | --aa", &["--a"]);
+
+test_expect!(test_112_testcases, "Usage: prog -v", &["-v"], vec!(("-v", Switch(true))));
+
+test_expect!(test_113_testcases, "Usage: prog [-v -v]", &[], vec!(("-v", Counted(0))));
+
+test_expect!(test_114_testcases, "Usage: prog [-v -v]", &["-v"], vec!(("-v", Counted(1))));
+
+test_expect!(test_115_testcases, "Usage: prog [-v -v]", &["-vv"], vec!(("-v", Counted(2))));
+
+test_user_error!(test_116_testcases, "Usage: prog -v ...", &[]);
+
+test_expect!(test_117_testcases, "Usage: prog -v ...", &["-v"], vec!(("-v", Counted(1))));
+
+test_expect!(test_118_testcases, "Usage: prog -v ...", &["-vv"], vec!(("-v", Counted(2))));
+
+test_expect!(test_119_testcases, "Usage: prog -v ...", &["-vvvvvv"], vec!(("-v", Counted(6))));
+
+test_expect!(test_120_testcases, "Usage: prog [-v | -vv | -vvv]
+
+This one is probably most readable user-friednly variant.", &[], vec!(("-v", Counted(0))));
+
+test_expect!(test_121_testcases, "Usage: prog [-v | -vv | -vvv]
+
+This one is probably most readable user-friednly variant.", &["-v"], vec!(("-v", Counted(1))));
+
+test_expect!(test_122_testcases, "Usage: prog [-v | -vv | -vvv]
+
+This one is probably most readable user-friednly variant.", &["-vv"], vec!(("-v", Counted(2))));
+
+test_user_error!(test_123_testcases, "Usage: prog [-v | -vv | -vvv]
+
+This one is probably most readable user-friednly variant.", &["-vvvv"]);
+
+test_expect!(test_124_testcases, "usage: prog [--ver --ver]", &["--ver", "--ver"], vec!(("--ver", Counted(2))));
+
+test_expect!(test_125_testcases, "usage: prog [go]", &["go"], vec!(("go", Switch(true))));
+
+test_expect!(test_126_testcases, "usage: prog [go go]", &[], vec!(("go", Counted(0))));
+
+test_expect!(test_127_testcases, "usage: prog [go go]", &["go"], vec!(("go", Counted(1))));
+
+test_expect!(test_128_testcases, "usage: prog [go go]", &["go", "go"], vec!(("go", Counted(2))));
+
+test_user_error!(test_129_testcases, "usage: prog [go go]", &["go", "go", "go"]);
+
+test_expect!(test_130_testcases, "usage: prog go...", &["go", "go", "go", "go", "go"], vec!(("go", Counted(5))));
+
+test_expect!(test_131_testcases, "usage: prog [options] [-a]
+
+options: -a
+         -b", &["-a"], vec!(("-a", Switch(true)), ("-b", Switch(false))));
+
+test_user_error!(test_132_testcases, "usage: prog [options] [-a]
+
+options: -a
+         -b", &["-aa"]);
+
+test_expect!(test_133_testcases, "Usage: prog [options] A
+
+Options:
+    -q  Be quiet
+    -v  Be verbose.", &["arg"], vec!(("A", Plain(Some("arg".to_string()))), ("-v", Switch(false)), ("-q", Switch(false))));
+
+test_expect!(test_134_testcases, "Usage: prog [options] A
+
+Options:
+    -q  Be quiet
+    -v  Be verbose.", &["-v", "arg"], vec!(("A", Plain(Some("arg".to_string()))), ("-v", Switch(true)), ("-q", Switch(false))));
+
+test_expect!(test_135_testcases, "Usage: prog [options] A
+
+Options:
+    -q  Be quiet
+    -v  Be verbose.", &["-q", "arg"], vec!(("A", Plain(Some("arg".to_string()))), ("-v", Switch(false)), ("-q", Switch(true))));
+
+test_expect!(test_136_testcases, "usage: prog [-]", &["-"], vec!(("-", Switch(true))));
+
+test_expect!(test_137_testcases, "usage: prog [-]", &[], vec!(("-", Switch(false))));
+
+test_expect!(test_138_testcases, "usage: prog [NAME [NAME ...]]", &["a", "b"], vec!(("NAME", List(vec!("a".to_string(), "b".to_string())))));
+
+test_expect!(test_139_testcases, "usage: prog [NAME [NAME ...]]", &[], vec!(("NAME", List(vec!()))));
+
+test_expect!(test_140_testcases, "usage: prog [options]
+
+options:
+ -a        Add
+ -m <msg>  Message", &["-a"], vec!(("-m", Plain(None)), ("-a", Switch(true))));
+
+test_expect!(test_141_testcases, "usage: prog --hello", &["--hello"], vec!(("--hello", Switch(true))));
+
+test_expect!(test_142_testcases, "usage: prog [--hello=<world>]", &[], vec!(("--hello", Plain(None))));
+
+test_expect!(test_143_testcases, "usage: prog [--hello=<world>]", &["--hello", "wrld"], vec!(("--hello", Plain(Some("wrld".to_string())))));
+
+test_expect!(test_144_testcases, "usage: prog [-o]", &[], vec!(("-o", Switch(false))));
+
+test_expect!(test_145_testcases, "usage: prog [-o]", &["-o"], vec!(("-o", Switch(true))));
+
+test_expect!(test_146_testcases, "usage: prog [-opr]", &["-op"], vec!(("-o", Switch(true)), ("-p", Switch(true)), ("-r", Switch(false))));
+
+test_expect!(test_147_testcases, "usage: git [-v | --verbose]", &["-v"], vec!(("-v", Switch(true)), ("--verbose", Switch(false))));
+
+test_expect!(test_148_testcases, "usage: git remote [-v | --verbose]", &["remote", "-v"], vec!(("-v", Switch(true)), ("remote", Switch(true)), ("--verbose", Switch(false))));
+
+test_expect!(test_149_testcases, "usage: prog", &[], vec!());
+
+test_expect!(test_150_testcases, "usage: prog
+           prog <a> <b>", &["1", "2"], vec!(("<a>", Plain(Some("1".to_string()))), ("<b>", Plain(Some("2".to_string())))));
+
+test_expect!(test_151_testcases, "usage: prog
+           prog <a> <b>", &[], vec!(("<a>", Plain(None)), ("<b>", Plain(None))));
+
+test_expect!(test_152_testcases, "usage: prog <a> <b>
+           prog", &[], vec!(("<a>", Plain(None)), ("<b>", Plain(None))));
+
+test_expect!(test_153_testcases, "usage: prog [--file=<f>]", &[], vec!(("--file", Plain(None))));
+
+test_expect!(test_154_testcases, "usage: prog [--file=<f>]
+
+options: --file <a>", &[], vec!(("--file", Plain(None))));
+
+test_expect!(test_155_testcases, "Usage: prog [-a <host:port>]
+
+Options: -a, --address <host:port>  TCP address [default: localhost:6283].", &[], vec!(("--address", Plain(Some("localhost:6283".to_string())))));
+
+test_expect!(test_156_testcases, "usage: prog --long=<arg> ...", &["--long", "one"], vec!(("--long", List(vec!("one".to_string())))));
+
+test_expect!(test_157_testcases, "usage: prog --long=<arg> ...", &["--long", "one", "--long", "two"], vec!(("--long", List(vec!("one".to_string(), "two".to_string())))));
+
+test_expect!(test_158_testcases, "usage: prog (go <direction> --speed=<km/h>)...", &["go", "left", "--speed=5", "go", "right", "--speed=9"], vec!(("go", Counted(2)), ("<direction>", List(vec!("left".to_string(), "right".to_string()))), ("--speed", List(vec!("5".to_string(), "9".to_string())))));
+
+test_expect!(test_159_testcases, "usage: prog [options] -a
+
+options: -a", &["-a"], vec!(("-a", Switch(true))));
+
+test_expect!(test_160_testcases, "usage: prog [-o <o>]...
+
+options: -o <o>  [default: x]", &["-o", "this", "-o", "that"], vec!(("-o", List(vec!("this".to_string(), "that".to_string())))));
+
+test_expect!(test_161_testcases, "usage: prog [-o <o>]...
+
+options: -o <o>  [default: x]", &[], vec!(("-o", List(vec!("x".to_string())))));
+
+test_expect!(test_162_testcases, "usage: prog [-o <o>]...
+
+options: -o <o>  [default: x y]", &["-o", "this"], vec!(("-o", List(vec!("this".to_string())))));
+
+test_expect!(test_163_testcases, "usage: prog [-o <o>]...
+
+options: -o <o>  [default: x y]", &[], vec!(("-o", List(vec!("x".to_string(), "y".to_string())))));
+
+test_expect!(test_164_testcases, "usage: prog -pPATH
+
+options: -p PATH", &["-pHOME"], vec!(("-p", Plain(Some("HOME".to_string())))));
+
+test_expect!(test_165_testcases, "Usage: foo (--xx=X|--yy=Y)...", &["--xx=1", "--yy=2"], vec!(("--yy", List(vec!("2".to_string()))), ("--xx", List(vec!("1".to_string())))));
+
+test_expect!(test_166_testcases, "usage: prog [<input file>]", &["f.txt"], vec!(("<input file>", Plain(Some("f.txt".to_string())))));
+
+test_expect!(test_167_testcases, "usage: prog [--input=<file name>]...", &["--input", "a.txt", "--input=b.txt"], vec!(("--input", List(vec!("a.txt".to_string(), "b.txt".to_string())))));
+
+test_expect!(test_168_testcases, "usage: prog good [options]
+           prog fail [options]
+
+options: --loglevel=N", &["fail", "--loglevel", "5"], vec!(("fail", Switch(true)), ("good", Switch(false)), ("--loglevel", Plain(Some("5".to_string())))));
+
+test_expect!(test_169_testcases, "usage:prog --foo", &["--foo"], vec!(("--foo", Switch(true))));
+
+test_expect!(test_170_testcases, "PROGRAM USAGE: prog --foo", &["--foo"], vec!(("--foo", Switch(true))));
+
+test_expect!(test_171_testcases, "Usage: prog --foo
+           prog --bar
+NOT PART OF SECTION", &["--foo"], vec!(("--bar", Switch(false)), ("--foo", Switch(true))));
+
+test_expect!(test_172_testcases, "Usage:
+ prog --foo
+ prog --bar
+
+NOT PART OF SECTION", &["--foo"], vec!(("--bar", Switch(false)), ("--foo", Switch(true))));
+
+test_expect!(test_173_testcases, "Usage:
+ prog --foo
+ prog --bar
+NOT PART OF SECTION", &["--foo"], vec!(("--bar", Switch(false)), ("--foo", Switch(true))));
+
+test_expect!(test_174_testcases, "Usage: prog [options]
+
+global options: --foo
+local options: --baz
+               --bar
+other options:
+ --egg
+ --spam
+-not-an-option-", &["--bar", "--egg"], vec!(("--bar", Switch(true)), ("--egg", Switch(true)), ("--spam", Switch(false))));
+
+test_expect!(test_175_testcases, "Usage: prog [-a] [--] [<arg>...]", &["-a"], vec!(("<arg>", List(vec!())), ("-a", Switch(true))));
+
+test_expect!(test_176_testcases, "Usage: prog [-a] [--] [<arg>...]", &["--"], vec!(("<arg>", List(vec!())), ("-a", Switch(false))));
+
+test_expect!(test_177_testcases, "Usage: prog [-a] [--] [<arg>...]", &["-a", "--", "-b"], vec!(("<arg>", List(vec!("-b".to_string()))), ("-a", Switch(true))));
+
+test_expect!(test_178_testcases, "Usage: prog [-a] [--] [<arg>...]", &["-a", "--", "-a"], vec!(("<arg>", List(vec!("-a".to_string()))), ("-a", Switch(true))));
+
+test_expect!(test_179_testcases, "Usage: prog [-a] [--] [<arg>...]", &["--", "-a"], vec!(("<arg>", List(vec!("-a".to_string()))), ("-a", Switch(false))));
+
+test_expect!(test_180_testcases, "Usage: prog test [options] [--] [<args>...]", &["test", "a", "--", "-b"], vec!(("<args>", List(vec!("a".to_string(), "-b".to_string())))));
+
+test_expect!(test_181_testcases, "Usage: prog test [options] [--] [<args>...]", &["test", "--", "-b"], vec!(("<args>", List(vec!("-b".to_string())))));
+
+test_user_error!(test_182_testcases, "Usage: prog test [options] [--] [<args>...]", &["test", "a", "-b"]);
+
+test_expect!(test_183_testcases, "Usage: prog test [options] [--] [<args>...]", &["test", "--", "-b", "--"], vec!(("<args>", List(vec!("-b".to_string(), "--".to_string())))));
+
+test_expect!(test_184_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &[], vec!(("-a", Counted(0))));
+
+test_expect!(test_185_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &["-a"], vec!(("-a", Counted(1))));
+
+test_expect!(test_186_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &["-a", "-a"], vec!(("-a", Counted(2))));
+
+test_expect!(test_187_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &["-aa"], vec!(("-a", Counted(2))));
+
+test_expect!(test_188_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &["-a", "-a", "-a"], vec!(("-a", Counted(3))));
+
+test_expect!(test_189_testcases, "Usage: prog [options]
+
+Options:
+  -a ...  Foo", &["-aaa"], vec!(("-a", Counted(3))));
+
+test_expect!(test_190_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &[], vec!(("-a", Counted(0))));
+
+test_expect!(test_191_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &["-a"], vec!(("-a", Counted(1))));
+
+test_expect!(test_192_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &["-a", "--all"], vec!(("-a", Counted(2))));
+
+test_expect!(test_193_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &["-aa", "--all"], vec!(("-a", Counted(3))));
+
+test_expect!(test_194_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &["--all"], vec!(("-a", Counted(1))));
+
+test_expect!(test_195_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ...  Foo", &["--all", "--all"], vec!(("-a", Counted(2))));
+
+test_expect!(test_196_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &[], vec!(("-a", List(vec!()))));
+
+test_expect!(test_197_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &["-a", "1"], vec!(("-a", List(vec!("1".to_string())))));
+
+test_expect!(test_198_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &["-a", "2", "--all", "3"], vec!(("-a", List(vec!("2".to_string(), "3".to_string())))));
+
+test_expect!(test_199_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &["-a4", "-a5", "--all", "6"], vec!(("-a", List(vec!("4".to_string(), "5".to_string(), "6".to_string())))));
+
+test_expect!(test_200_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &["--all", "7"], vec!(("-a", List(vec!("7".to_string())))));
+
+test_expect!(test_201_testcases, "Usage: prog [options]
+
+Options:
+  -a, --all ARG ...  Foo", &["--all", "8", "--all", "9"], vec!(("-a", List(vec!("8".to_string(), "9".to_string())))));
+
+test_expect!(test_202_testcases, "Usage: prog [options]
+
+Options:
+  --all ...  Foo", &[], vec!(("--all", Counted(0))));
+
+test_expect!(test_203_testcases, "Usage: prog [options]
+
+Options:
+  --all ...  Foo", &["--all"], vec!(("--all", Counted(1))));
+
+test_expect!(test_204_testcases, "Usage: prog [options]
+
+Options:
+  --all ...  Foo", &["--all", "--all"], vec!(("--all", Counted(2))));
+
+test_expect!(test_205_testcases, "Usage: prog [options]
+
+Options:
+  --all=ARG ...  Foo", &[], vec!(("--all", List(vec!()))));
+
+test_expect!(test_206_testcases, "Usage: prog [options]
+
+Options:
+  --all=ARG ...  Foo", &["--all", "1"], vec!(("--all", List(vec!("1".to_string())))));
+
+test_expect!(test_207_testcases, "Usage: prog [options]
+
+Options:
+  --all=ARG ...  Foo", &["--all", "2", "--all", "3"], vec!(("--all", List(vec!("2".to_string(), "3".to_string())))));
+
+test_user_error!(test_208_testcases, "Usage: prog [options]
+
+Options:
+  --all  ...  Foo", &["--all", "--all"]);
+
+test_user_error!(test_209_testcases, "Usage: prog [options]
+
+Options:
+  --all ARG  ...  Foo", &["--all", "foo", "--all", "bar"]);
+
+test_expect!(test_210_testcases, "Usage: prog --speed=ARG", &["--speed", "20"], vec!(("--speed", Plain(Some("20".to_string())))));
+
+test_expect!(test_211_testcases, "Usage: prog --speed=ARG", &["--speed=20"], vec!(("--speed", Plain(Some("20".to_string())))));
+
+test_expect!(test_212_testcases, "Usage: prog --speed=ARG", &["--speed=-20"], vec!(("--speed", Plain(Some("-20".to_string())))));
+
+test_expect!(test_213_testcases, "Usage: prog --speed=ARG", &["--speed", "-20"], vec!(("--speed", Plain(Some("-20".to_string())))));
+
+test_expect!(test_214_testcases, "usage: prog [--datetime=<regex>]
+
+options: --datetime=<regex>    Regex for datetimes [default: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}]", &[], vec!(("--datetime", Plain(Some("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}".to_string())))));
+
+test_expect!(test_215_testcases, "Usage: prog [options]
+
+Options:
+  -x ARG
+  -y", &["-x-y"], vec!(("-x", Plain(Some("-y".to_string())))));
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/docopt/src/wordlist.rs
@@ -0,0 +1,114 @@
+#[macro_use]
+extern crate lazy_static;
+
+#[macro_use]
+extern crate serde_derive;
+
+extern crate regex;
+extern crate serde;
+extern crate strsim;
+
+use std::collections::HashMap;
+use std::io::{self, Read, Write};
+
+use dopt::Docopt;
+use parse::{Atom, Parser};
+
+// cheat until we get syntax extensions back :-(
+macro_rules! regex(
+    ($s:expr) => (::regex::Regex::new($s).unwrap());
+);
+
+macro_rules! werr(
+    ($($arg:tt)*) => ({
+        use std::io::{Write, stderr};
+        write!(&mut stderr(), $($arg)*).unwrap();
+    })
+);
+
+fn cap_or_empty<'t>(caps: &regex::Captures<'t>, name: &str) -> &'t str {
+    caps.name(name).map_or("", |m| m.as_str())
+}
+
+#[allow(dead_code)]
+mod dopt;
+#[allow(dead_code)]
+mod parse;
+#[allow(dead_code)]
+mod synonym;
+
+const USAGE: &'static str = "
+Usage: docopt-wordlist [(<name> <possibles>)] ...
+
+docopt-wordlist prints a list of available flags and commands arguments for the
+given usage (provided on stdin).
+
+Example use:
+
+  your-command --help | docopt-wordlist
+
+This command also supports completing positional arguments when given a list of
+choices. The choices are included in the word list if and only if the argument
+name appears in the usage string. For example:
+
+  your-command --help | docopt-wordlist 'arg' 'a b c'
+
+Which will only include 'a', 'b' and 'c' in the wordlist if
+'your-command --help' contains a positional argument named 'arg'.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_name: Vec<String>,
+    arg_possibles: Vec<String>,
+}
+
+fn main() {
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.deserialize())
+        .unwrap_or_else(|e| e.exit());
+    match run(args) {
+        Ok(_) => {},
+        Err(err) => {
+            write!(&mut io::stderr(), "{}", err).unwrap();
+            ::std::process::exit(1)
+        }
+    }
+}
+
+fn run(args: Args) -> Result<(), String> {
+    let mut usage = String::new();
+    io::stdin().read_to_string(&mut usage).map_err(|e| e.to_string())?;
+    let parsed = Parser::new(&usage).map_err(|e| e.to_string())?;
+    let arg_possibles: HashMap<String, Vec<String>> =
+        args.arg_name.iter()
+                     .zip(args.arg_possibles.iter())
+                     .map(|(name, possibles)| {
+                         let choices =
+                             regex!(r"[ \t]+").split(&**possibles)
+                                              .map(|s| s.to_string())
+                                              .collect::<Vec<String>>();
+                         (name.clone(), choices)
+                     })
+                     .collect();
+
+    let mut words = vec![];
+    for k in parsed.descs.keys() {
+        if let Atom::Positional(ref arg_name) = *k {
+            if let Some(choices) = arg_possibles.get(arg_name) {
+                words.extend(choices.iter().map(|s| s.clone()));
+            }
+            // If the user hasn't given choices for this positional argument,
+            // then there's really nothing to complete here.
+        } else {
+            words.push(k.to_string());
+        }
+    }
+    for (k, _) in parsed.descs.synonyms() {
+        // We don't need to do anything special here since synonyms can
+        // only be flags, which we always include in the wordlist.
+        words.push(k.to_string());
+    }
+    println!("{}", words.join(" "));
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"f8e54ea908a294d46381a1bd608da3fcc7fb0a87cb15f546b93b74ee9c97bb2b","Cargo.toml":"63ff1e6e9d93ec6a81fb28f199ccbf9299e177152cd751f568623717e85ed83a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"11d2194be1dc7460ee631a32884516f78d5d95dc6e5efa9115767a8f55f55a06","measurements.txt":"46606bc04662362369479bce5c31b109984c1a3446d7f0566556257af91b86e2","src/bitvec.rs":"c6c66c348776ff480b7ff6e4a3e0f64554a4194266f614408b45b5e3c324ec0a","src/cc/mod.rs":"fc486ba406d5761b1bd63621c37981c2b43966d269f8a596595fca36f8b395a4","src/cc/test.rs":"b6805fd4f22b3a3214c9759a674647e8b1dc83118f81c83955949a7414298423","src/constraint/mod.rs":"7df86d708ba692edd5bdb26b1da20720ee5bf51f741985c8193eb54db9365b4b","src/constraint/test.rs":"6666ec1411a61462777c88e7edf73f4bf7c04d4021007cf3340fd7ee22cece95","src/debug.rs":"0c24b9d2302c66e8f3e615c2a6689d88bc1eeac8844ae1f239fd3244c7f2ce6f","src/graph/mod.rs":"3a98ddddb4650744d5462ee442405551272e6c0ff820fd85c26dfec133974671","src/graph/tests.rs":"e2afc7912203e158d37d1f951cb76e6f67eb63890573649b3b2e9ea3afe5ba01","src/lib.rs":"d4584bb7efa3269a328d1ef373fef02e177efb8874f81556a124a58ea18fad87","src/snapshot_vec.rs":"0654cf102f05e98694b74076d5b2fcb7d52cfcbd1771853db22784ea7ad50cb1","src/unify/mod.rs":"0f8a78332c43d6776c2afa93aef174d5d10fb83a5046f0b7081262b754a31da3","src/unify/tests.rs":"9dfc23f77c6fc0565d90b0f74eceeadf666cd9c728aac388b33f138fbc30b50c"},"package":"cabe5a5078ac8c506d3e4430763b1ba9b609b1286913e7d08e581d1c2de9b7e5"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/.travis.yml
@@ -0,0 +1,5 @@
+language: rust
+rust:
+  - nightly
+script:
+  - cargo test
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "ena"
+description = "Union-find, congruence closure, and other unification code. Based on code from rustc."
+license = "MIT/Apache-2.0"
+homepage = "https://github.com/nikomatsakis/ena"
+repository = "https://github.com/nikomatsakis/ena"
+version = "0.5.0"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2010 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/README.md
@@ -0,0 +1,19 @@
+[![Build Status](https://travis-ci.org/nikomatsakis/rayon.svg?branch=master)](https://travis-ci.org/nikomatsakis/ena)
+
+An implementation of union-find / congruence-closure in Rust. Forked
+from rustc for independent experimentation. My intention is to iterate
+and improve this code and gradually bring back changes into rustc
+itself, but also to enable other crates.io packages to use the same
+code.
+
+### Name
+
+The name "ena" comes from the Greek word for "one".
+
+### License
+
+Like rustc itself, this code is dual-licensed under the MIT and Apache
+licenses. Pull requests, comments, and other contributions are assumed
+to imply consent to those terms. Moreover, it is understood that any
+changes here may well be used in rustc itself under the same terms.
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/measurements.txt
@@ -0,0 +1,21 @@
+base
+test unify::test::big_array_bench ... bench:   1,416,793 ns/iter (+/- 216,475)
+
+assert -> debug_assert
+test unify::test::big_array_bench ... bench:   1,420,368 ns/iter (+/- 144,433)
+test unify::test::big_array_bench ... bench:   1,414,448 ns/iter (+/- 219,137)
+
+don't copy for redirects
+test unify::test::big_array_bench ... bench:   1,349,796 ns/iter (+/- 233,931)
+test unify::test::big_array_bench ... bench:   1,367,082 ns/iter (+/- 301,644)
+test unify::test::big_array_bench ... bench:   1,358,154 ns/iter (+/- 348,796)
+
+copy less
+test unify::test::big_array_bench ... bench:     744,775 ns/iter (+/- 51,865)
+test unify::test::big_array_bench ... bench:     750,939 ns/iter (+/- 146,417)
+test unify::test::big_array_bench ... bench:     754,104 ns/iter (+/- 121,968)
+
+s/set-value/update-value/
+test unify::test::big_array_bench ... bench:     731,531 ns/iter (+/- 125,685)
+test unify::test::big_array_bench ... bench:     725,162 ns/iter (+/- 99,013)
+test unify::test::big_array_bench ... bench:     735,473 ns/iter (+/- 121,156)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/bitvec.rs
@@ -0,0 +1,301 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+/// A very simple BitVector type.
+pub struct BitVector {
+    data: Vec<u64>,
+}
+
+impl BitVector {
+    pub fn new(num_bits: usize) -> BitVector {
+        let num_words = u64s(num_bits);
+        BitVector { data: vec![0; num_words] }
+    }
+
+    pub fn contains(&self, bit: usize) -> bool {
+        let (word, mask) = word_mask(bit);
+        (self.data[word] & mask) != 0
+    }
+
+    /// Returns true if the bit has changed.
+    pub fn insert(&mut self, bit: usize) -> bool {
+        let (word, mask) = word_mask(bit);
+        let data = &mut self.data[word];
+        let value = *data;
+        let new_value = value | mask;
+        *data = new_value;
+        new_value != value
+    }
+
+    pub fn insert_all(&mut self, all: &BitVector) -> bool {
+        assert!(self.data.len() == all.data.len());
+        let mut changed = false;
+        for (i, j) in self.data.iter_mut().zip(&all.data) {
+            let value = *i;
+            *i = value | *j;
+            if value != *i {
+                changed = true;
+            }
+        }
+        changed
+    }
+
+    pub fn grow(&mut self, num_bits: usize) {
+        let num_words = u64s(num_bits);
+        let extra_words = self.data.len() - num_words;
+        self.data.extend((0..extra_words).map(|_| 0));
+    }
+
+    /// Iterates over indexes of set bits in a sorted order
+    pub fn iter<'a>(&'a self) -> BitVectorIter<'a> {
+        BitVectorIter {
+            iter: self.data.iter(),
+            current: 0,
+            idx: 0,
+        }
+    }
+}
+
+pub struct BitVectorIter<'a> {
+    iter: ::std::slice::Iter<'a, u64>,
+    current: u64,
+    idx: usize,
+}
+
+impl<'a> Iterator for BitVectorIter<'a> {
+    type Item = usize;
+    fn next(&mut self) -> Option<usize> {
+        while self.current == 0 {
+            self.current = if let Some(&i) = self.iter.next() {
+                if i == 0 {
+                    self.idx += 64;
+                    continue;
+                } else {
+                    self.idx = u64s(self.idx) * 64;
+                    i
+                }
+            } else {
+                return None;
+            }
+        }
+        let offset = self.current.trailing_zeros() as usize;
+        self.current >>= offset;
+        self.current >>= 1; // shift otherwise overflows for 0b1000_0000_…_0000
+        self.idx += offset + 1;
+        return Some(self.idx - 1);
+    }
+}
+
+/// A "bit matrix" is basically a square matrix of booleans
+/// represented as one gigantic bitvector. In other words, it is as if
+/// you have N bitvectors, each of length N. Note that `elements` here is `N`/
+#[derive(Clone)]
+pub struct BitMatrix {
+    elements: usize,
+    vector: Vec<u64>,
+}
+
+impl BitMatrix {
+    // Create a new `elements x elements` matrix, initially empty.
+    pub fn new(elements: usize) -> BitMatrix {
+        // For every element, we need one bit for every other
+        // element. Round up to an even number of u64s.
+        let u64s_per_elem = u64s(elements);
+        BitMatrix {
+            elements: elements,
+            vector: vec![0; elements * u64s_per_elem],
+        }
+    }
+
+    /// The range of bits for a given element.
+    fn range(&self, element: usize) -> (usize, usize) {
+        let u64s_per_elem = u64s(self.elements);
+        let start = element * u64s_per_elem;
+        (start, start + u64s_per_elem)
+    }
+
+    pub fn add(&mut self, source: usize, target: usize) -> bool {
+        let (start, _) = self.range(source);
+        let (word, mask) = word_mask(target);
+        let mut vector = &mut self.vector[..];
+        let v1 = vector[start + word];
+        let v2 = v1 | mask;
+        vector[start + word] = v2;
+        v1 != v2
+    }
+
+    /// Do the bits from `source` contain `target`?
+    ///
+    /// Put another way, if the matrix represents (transitive)
+    /// reachability, can `source` reach `target`?
+    pub fn contains(&self, source: usize, target: usize) -> bool {
+        let (start, _) = self.range(source);
+        let (word, mask) = word_mask(target);
+        (self.vector[start + word] & mask) != 0
+    }
+
+    /// Returns those indices that are reachable from both `a` and
+    /// `b`. This is an O(n) operation where `n` is the number of
+    /// elements (somewhat independent from the actual size of the
+    /// intersection, in particular).
+    pub fn intersection(&self, a: usize, b: usize) -> Vec<usize> {
+        let (a_start, a_end) = self.range(a);
+        let (b_start, b_end) = self.range(b);
+        let mut result = Vec::with_capacity(self.elements);
+        for (base, (i, j)) in (a_start..a_end).zip(b_start..b_end).enumerate() {
+            let mut v = self.vector[i] & self.vector[j];
+            for bit in 0..64 {
+                if v == 0 {
+                    break;
+                }
+                if v & 0x1 != 0 {
+                    result.push(base * 64 + bit);
+                }
+                v >>= 1;
+            }
+        }
+        result
+    }
+
+    /// Add the bits from `read` to the bits from `write`,
+    /// return true if anything changed.
+    ///
+    /// This is used when computing transitive reachability because if
+    /// you have an edge `write -> read`, because in that case
+    /// `write` can reach everything that `read` can (and
+    /// potentially more).
+    pub fn merge(&mut self, read: usize, write: usize) -> bool {
+        let (read_start, read_end) = self.range(read);
+        let (write_start, write_end) = self.range(write);
+        let vector = &mut self.vector[..];
+        let mut changed = false;
+        for (read_index, write_index) in (read_start..read_end).zip(write_start..write_end) {
+            let v1 = vector[write_index];
+            let v2 = v1 | vector[read_index];
+            vector[write_index] = v2;
+            changed = changed | (v1 != v2);
+        }
+        changed
+    }
+}
+
+fn u64s(elements: usize) -> usize {
+    (elements + 63) / 64
+}
+
+fn word_mask(index: usize) -> (usize, u64) {
+    let word = index / 64;
+    let mask = 1 << (index % 64);
+    (word, mask)
+}
+
+#[test]
+fn bitvec_iter_works() {
+    let mut bitvec = BitVector::new(100);
+    bitvec.insert(1);
+    bitvec.insert(10);
+    bitvec.insert(19);
+    bitvec.insert(62);
+    bitvec.insert(63);
+    bitvec.insert(64);
+    bitvec.insert(65);
+    bitvec.insert(66);
+    bitvec.insert(99);
+    assert_eq!(bitvec.iter().collect::<Vec<_>>(),
+               [1, 10, 19, 62, 63, 64, 65, 66, 99]);
+}
+
+#[test]
+fn bitvec_iter_works_2() {
+    let mut bitvec = BitVector::new(300);
+    bitvec.insert(1);
+    bitvec.insert(10);
+    bitvec.insert(19);
+    bitvec.insert(62);
+    bitvec.insert(66);
+    bitvec.insert(99);
+    bitvec.insert(299);
+    assert_eq!(bitvec.iter().collect::<Vec<_>>(),
+               [1, 10, 19, 62, 66, 99, 299]);
+
+}
+
+#[test]
+fn bitvec_iter_works_3() {
+    let mut bitvec = BitVector::new(319);
+    bitvec.insert(0);
+    bitvec.insert(127);
+    bitvec.insert(191);
+    bitvec.insert(255);
+    bitvec.insert(319);
+    assert_eq!(bitvec.iter().collect::<Vec<_>>(), [0, 127, 191, 255, 319]);
+}
+
+#[test]
+fn union_two_vecs() {
+    let mut vec1 = BitVector::new(65);
+    let mut vec2 = BitVector::new(65);
+    assert!(vec1.insert(3));
+    assert!(!vec1.insert(3));
+    assert!(vec2.insert(5));
+    assert!(vec2.insert(64));
+    assert!(vec1.insert_all(&vec2));
+    assert!(!vec1.insert_all(&vec2));
+    assert!(vec1.contains(3));
+    assert!(!vec1.contains(4));
+    assert!(vec1.contains(5));
+    assert!(!vec1.contains(63));
+    assert!(vec1.contains(64));
+}
+
+#[test]
+fn grow() {
+    let mut vec1 = BitVector::new(65);
+    assert!(vec1.insert(3));
+    assert!(!vec1.insert(3));
+    assert!(vec1.insert(5));
+    assert!(vec1.insert(64));
+    vec1.grow(128);
+    assert!(vec1.contains(3));
+    assert!(vec1.contains(5));
+    assert!(vec1.contains(64));
+    assert!(!vec1.contains(126));
+}
+
+#[test]
+fn matrix_intersection() {
+    let mut vec1 = BitMatrix::new(200);
+
+    // (*) Elements reachable from both 2 and 65.
+
+    vec1.add(2, 3);
+    vec1.add(2, 6);
+    vec1.add(2, 10); // (*)
+    vec1.add(2, 64); // (*)
+    vec1.add(2, 65);
+    vec1.add(2, 130);
+    vec1.add(2, 160); // (*)
+
+    vec1.add(64, 133);
+
+    vec1.add(65, 2);
+    vec1.add(65, 8);
+    vec1.add(65, 10); // (*)
+    vec1.add(65, 64); // (*)
+    vec1.add(65, 68);
+    vec1.add(65, 133);
+    vec1.add(65, 160); // (*)
+
+    let intersection = vec1.intersection(2, 64);
+    assert!(intersection.is_empty());
+
+    let intersection = vec1.intersection(2, 65);
+    assert_eq!(intersection, &[10, 64, 160]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/cc/mod.rs
@@ -0,0 +1,436 @@
+//! An implementation of the Congruence Closure algorithm based on the
+//! paper "Fast Decision Procedures Based on Congruence Closure" by Nelson
+//! and Oppen, JACM 1980.
+
+use graph::{self, Graph, NodeIndex};
+use std::collections::HashMap;
+use std::fmt::Debug;
+use std::hash::Hash;
+use std::iter;
+use unify::{UnifyKey, UnifyValue, InfallibleUnifyValue, UnificationTable, UnionedKeys};
+
+#[cfg(test)]
+mod test;
+
+pub struct CongruenceClosure<K: Key> {
+    map: HashMap<K, Token>,
+    table: UnificationTable<Token>,
+    graph: Graph<K, ()>,
+}
+
+pub trait Key: Hash + Eq + Clone + Debug {
+    // If this Key has some efficient way of converting itself into a
+    // congruence closure `Token`, then it shold return `Some(token)`.
+    // Otherwise, return `None`, in which case the CC will internally
+    // map the key to a token. Typically, this is used by layers that
+    // wrap the CC, where inference variables are mapped directly to
+    // particular tokens.
+    fn to_token(&self) -> Option<Token> {
+        None
+    }
+    fn key_kind(&self) -> KeyKind;
+    fn shallow_eq(&self, key: &Self) -> bool;
+    fn successors(&self) -> Vec<Self>;
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum KeyKind {
+    Applicative,
+    Generative,
+}
+use self::KeyKind::*;
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub struct Token {
+    // this is the index both for the graph and the unification table,
+    // since for every node there is also a slot in the unification
+    // table
+    index: u32,
+}
+
+impl Token {
+    fn new(index: u32) -> Token {
+        Token { index: index }
+    }
+
+    fn from_node(node: NodeIndex) -> Token {
+        Token { index: node.0 as u32 }
+    }
+
+    fn node(&self) -> NodeIndex {
+        NodeIndex(self.index as usize)
+    }
+}
+
+impl UnifyKey for Token {
+    type Value = KeyKind;
+    fn index(&self) -> u32 {
+        self.index
+    }
+    fn from_index(i: u32) -> Token {
+        Token::new(i)
+    }
+    fn tag() -> &'static str {
+        "CongruenceClosure"
+    }
+    fn order_roots(a: Self,
+                   &a_value: &KeyKind,
+                   b: Self,
+                   &b_value: &KeyKind)
+                   -> Option<(Self, Self)> {
+        if a_value == b_value {
+            None
+        } else if a_value == Generative {
+            Some((a, b))
+        } else {
+            debug_assert!(b_value == Generative);
+            Some((b, a))
+        }
+    }
+}
+
+impl UnifyValue for KeyKind {
+    fn unify_values(&kind1: &Self, &kind2: &Self) -> Result<Self, (Self, Self)> {
+        match (kind1, kind2) {
+            (Generative, _) => Ok(Generative),
+            (_, Generative) => Ok(Generative),
+            (Applicative, Applicative) => Ok(Applicative),
+        }
+    }
+}
+
+impl InfallibleUnifyValue for KeyKind {}
+
+impl<K: Key> CongruenceClosure<K> {
+    pub fn new() -> CongruenceClosure<K> {
+        CongruenceClosure {
+            map: HashMap::new(),
+            table: UnificationTable::new(),
+            graph: Graph::new(),
+        }
+    }
+
+    /// Manually create a new CC token. You don't normally need to do
+    /// this, as CC tokens are automatically created for each key when
+    /// we first observe it. However, if you wish to have keys that
+    /// make use of the `to_token` method to bypass the `key -> token`
+    /// map, then you can use this function to make a new-token.  The
+    /// callback `key_op` will be invoked to create the key for the
+    /// fresh token (typically, it will wrap the token in some kind of
+    /// enum indicating an inference variable).
+    ///
+    /// **WARNING:** The new key **must** be a leaf (no successor
+    /// keys) or else things will not work right. This invariant is
+    /// not currently checked.
+    pub fn new_token<OP>(&mut self, key_kind: KeyKind, key_op: OP) -> Token
+        where OP: FnOnce(Token) -> K
+    {
+        let token = self.table.new_key(key_kind);
+        let key = key_op(token);
+        let node = self.graph.add_node(key);
+        assert_eq!(token.node(), node);
+        token
+    }
+
+    /// Return the key for a given token
+    pub fn key(&self, token: Token) -> &K {
+        self.graph.node_data(token.node())
+    }
+
+    /// Indicates they `key1` and `key2` are equivalent.
+    pub fn merge(&mut self, key1: K, key2: K) {
+        let token1 = self.add(key1);
+        let token2 = self.add(key2);
+        self.algorithm().merge(token1, token2);
+    }
+
+    /// Indicates whether `key1` and `key2` are equivalent.
+    pub fn merged(&mut self, key1: K, key2: K) -> bool {
+        // Careful: you cannot naively remove the `add` calls
+        // here. The reason is because of patterns like the test
+        // `struct_union_no_add`. If we unify X and Y, and then unify
+        // F(X) and F(Z), we need to be sure to figure out that F(Y)
+        // == F(Z). This requires a non-trivial deduction step, so
+        // just checking if the arguments are congruent will fail,
+        // because `Y == Z` does not hold.
+
+        debug!("merged: called({:?}, {:?})", key1, key2);
+
+        let token1 = self.add(key1);
+        let token2 = self.add(key2);
+        self.algorithm().unioned(token1, token2)
+    }
+
+    /// Returns an iterator over all keys that are known to have been
+    /// merged with `key`. This is a bit dubious, since the set of
+    /// merged keys will be dependent on what has been added, and is
+    /// not the full set of equivalencies that one might imagine. See the
+    /// test `merged_keys` for an example.
+    pub fn merged_keys(&mut self, key: K) -> MergedKeys<K> {
+        let token = self.add(key);
+        MergedKeys {
+            graph: &self.graph,
+            iterator: self.table.unioned_keys(token),
+        }
+    }
+
+    /// Add a key into the CC table, returning the corresponding
+    /// token. This is not part of the public API, though it could be
+    /// if we wanted.
+    fn add(&mut self, key: K) -> Token {
+        debug!("add(): key={:?}", key);
+
+        let (is_new, token) = self.get_or_add(&key);
+        debug!("add: key={:?} is_new={:?} token={:?}", key, is_new, token);
+
+        // if this node is already in the graph, we are done
+        if !is_new {
+            return token;
+        }
+
+        // Otherwise, we want to add the 'successors' also. So, for
+        // example, if we are adding `Box<Foo>`, the successor would
+        // be `Foo`.  So go ahead and recursively add `Foo` if it
+        // doesn't already exist.
+        let successors: Vec<_> = key.successors()
+            .into_iter()
+            .map(|s| self.add(s))
+            .collect();
+
+        debug!("add: key={:?} successors={:?}", key, successors);
+
+        // Now we have to be a bit careful. It might be that we are
+        // adding `Box<Foo>`, but `Foo` was already present, and in
+        // fact equated with `Bar`. That is, maybe we had a graph like:
+        //
+        //      Box<Bar> -> Bar == Foo
+        //
+        // Now we just added `Box<Foo>`, but we need to equate
+        // `Box<Foo>` and `Box<Bar>`.
+        for successor in successors {
+            // get set of predecessors for each successor BEFORE we add the new node;
+            // this would be `Box<Bar>` in the above example.
+            let predecessors: Vec<_> = self.algorithm().all_preds(successor);
+
+            debug!("add: key={:?} successor={:?} predecessors={:?}",
+                   key,
+                   successor,
+                   predecessors);
+
+            // add edge from new node `Box<Foo>` to its successor `Foo`
+            self.graph.add_edge(token.node(), successor.node(), ());
+
+            // Now we have to consider merging the old predecessors,
+            // like `Box<Bar>`, with this new node `Box<Foo>`.
+            //
+            // Note that in other cases it might be that no merge will
+            // occur. For example, if we were adding `(A1, B1)` to a
+            // graph like this:
+            //
+            //     (A, B) -> A == A1
+            //        |
+            //        v
+            //        B
+            //
+            // In this case, the predecessor would be `(A, B)`; but we don't
+            // know that `B == B1`, so we can't merge that with `(A1, B1)`.
+            for predecessor in predecessors {
+                self.algorithm().maybe_merge(token, predecessor);
+            }
+        }
+
+        token
+    }
+
+    /// Gets the token for a key, if any.
+    fn get(&self, key: &K) -> Option<Token> {
+        key.to_token()
+            .or_else(|| self.map.get(key).cloned())
+    }
+
+    /// Gets the token for a key, adding one if none exists. Returns the token
+    /// and a boolean indicating whether it had to be added.
+    fn get_or_add(&mut self, key: &K) -> (bool, Token) {
+        if let Some(token) = self.get(key) {
+            return (false, token);
+        }
+
+        let token = self.new_token(key.key_kind(), |_| key.clone());
+        self.map.insert(key.clone(), token);
+        (true, token)
+    }
+
+    fn algorithm(&mut self) -> Algorithm<K> {
+        Algorithm {
+            graph: &self.graph,
+            table: &mut self.table,
+        }
+    }
+}
+
+// # Walking merged keys
+
+pub struct MergedKeys<'cc, K: Key + 'cc> {
+    graph: &'cc Graph<K, ()>,
+    iterator: UnionedKeys<'cc, Token>,
+}
+
+impl<'cc, K: Key> Iterator for MergedKeys<'cc, K> {
+    type Item = K;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iterator
+            .next()
+            .map(|token| self.graph.node_data(token.node()).clone())
+    }
+}
+
+// # The core algorithm
+
+struct Algorithm<'a, K: Key + 'a> {
+    graph: &'a Graph<K, ()>,
+    table: &'a mut UnificationTable<Token>,
+}
+
+impl<'a, K: Key> Algorithm<'a, K> {
+    fn merge(&mut self, u: Token, v: Token) {
+        debug!("merge(): u={:?} v={:?}", u, v);
+
+        if self.unioned(u, v) {
+            return;
+        }
+
+        let u_preds = self.all_preds(u);
+        let v_preds = self.all_preds(v);
+
+        self.union(u, v);
+
+        for &p_u in &u_preds {
+            for &p_v in &v_preds {
+                self.maybe_merge(p_u, p_v);
+            }
+        }
+    }
+
+    fn all_preds(&mut self, u: Token) -> Vec<Token> {
+        let graph = self.graph;
+        self.table
+            .unioned_keys(u)
+            .flat_map(|k| graph.predecessor_nodes(k.node()))
+            .map(|i| Token::from_node(i))
+            .collect()
+    }
+
+    fn maybe_merge(&mut self, p_u: Token, p_v: Token) {
+        debug!("maybe_merge(): p_u={:?} p_v={:?}",
+               self.key(p_u),
+               self.key(p_v));
+
+        if !self.unioned(p_u, p_v) && self.shallow_eq(p_u, p_v) && self.congruent(p_u, p_v) {
+            self.merge(p_u, p_v);
+        }
+    }
+
+    // Check whether each of the successors are unioned. So if you
+    // have `Box<X1>` and `Box<X2>`, this is true if `X1 == X2`. (The
+    // result of this fn is not really meaningful unless the two nodes
+    // are shallow equal here.)
+    fn congruent(&mut self, p_u: Token, p_v: Token) -> bool {
+        debug_assert!(self.shallow_eq(p_u, p_v));
+        debug!("congruent({:?}, {:?})", self.key(p_u), self.key(p_v));
+        let succs_u = self.successors(p_u);
+        let succs_v = self.successors(p_v);
+        let r = succs_u.zip(succs_v).all(|(s_u, s_v)| {
+            debug!("congruent: s_u={:?} s_v={:?}", s_u, s_v);
+            self.unioned(s_u, s_v)
+        });
+        debug!("congruent({:?}, {:?}) = {:?}",
+               self.key(p_u),
+               self.key(p_v),
+               r);
+        r
+    }
+
+    fn key(&self, u: Token) -> &'a K {
+        self.graph.node_data(u.node())
+    }
+
+    // Compare the local data, not considering successor nodes. So e.g
+    // `Box<X>` and `Box<Y>` are shallow equal for any `X` and `Y`.
+    fn shallow_eq(&self, u: Token, v: Token) -> bool {
+        let r = self.key(u).shallow_eq(self.key(v));
+        debug!("shallow_eq({:?}, {:?}) = {:?}", self.key(u), self.key(v), r);
+        r
+    }
+
+    fn token_kind(&self, u: Token) -> KeyKind {
+        self.graph.node_data(u.node()).key_kind()
+    }
+
+    fn unioned(&mut self, u: Token, v: Token) -> bool {
+        let r = self.table.unioned(u, v);
+        debug!("unioned(u={:?}, v={:?}) = {:?}",
+               self.key(u),
+               self.key(v),
+               r);
+        r
+    }
+
+    fn union(&mut self, u: Token, v: Token) {
+        debug!("union(u={:?}, v={:?})", self.key(u), self.key(v));
+
+        // find the roots of `u` and `v`; if `u` and `v` have been unioned
+        // with anything generative, these will be generative.
+        let u = self.table.find(u);
+        let v = self.table.find(v);
+
+        // u and v are now union'd
+        self.table.union(u, v);
+
+        // if both `u` and `v` were generative, we can now propagate
+        // the constraint that their successors must also be the same
+        if self.token_kind(u) == Generative && self.token_kind(v) == Generative {
+            if self.shallow_eq(u, v) {
+                let mut succs_u = self.successors(u);
+                let mut succs_v = self.successors(v);
+                for (succ_u, succ_v) in succs_u.by_ref().zip(succs_v.by_ref()) {
+                    // assume # of succ is equal because types are WF (asserted below)
+                    self.merge(succ_u, succ_v);
+                }
+                debug_assert!(succs_u.next().is_none());
+                debug_assert!(succs_v.next().is_none());
+            } else {
+                // error: user asked us to union i32/u32 or Vec<T>/Vec<U>;
+                // for now just panic.
+                panic!("inconsistent conclusion: {:?} vs {:?}",
+                       self.key(u),
+                       self.key(v));
+            }
+        }
+    }
+
+    fn successors(&self, token: Token) -> iter::Map<graph::AdjacentTargets<'a, K, ()>,
+                                                    fn(NodeIndex) -> Token> {
+        self.graph
+            .successor_nodes(token.node())
+            .map(Token::from_node)
+    }
+
+    fn predecessors(&self, token: Token) -> iter::Map<graph::AdjacentSources<'a, K, ()>,
+                                                      fn(NodeIndex) -> Token> {
+        self.graph
+            .predecessor_nodes(token.node())
+            .map(Token::from_node)
+    }
+
+    /// If `token` has been unioned with something generative, returns
+    /// `Ok(u)` where `u` is the generative token. Otherwise, returns
+    /// `Err(v)` where `v` is the root of `token`.
+    fn normalize_to_generative(&mut self, token: Token) -> Result<Token, Token> {
+        let token = self.table.find(token);
+        match self.token_kind(token) {
+            Generative => Ok(token),
+            Applicative => Err(token),
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/cc/test.rs
@@ -0,0 +1,349 @@
+// use debug::Logger;
+use cc::{CongruenceClosure, Key, KeyKind, Token};
+use self::TypeStruct::*;
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+enum TypeStruct {
+    // e.g., `<T as Iterator>::Item` would be `Assoc(Iterator::Item, vec![T])`
+    Assoc(&'static str, Vec<Type>),
+
+    // skolemized version of in-scope generic, e.g., the `T` when checking `fn foo<T>`
+    Skolem(u32),
+
+    // inference variable (existentially quantified)
+    Variable(Token),
+
+    // a nominal type applied to arguments, e.g. `i32` or `Vec<T>`
+    Nominal(&'static str, Vec<Type>),
+}
+
+type Type = Box<TypeStruct>;
+
+impl Key for Type {
+    fn to_token(&self) -> Option<Token> {
+        match **self {
+            TypeStruct::Variable(t) => Some(t),
+            _ => None,
+        }
+    }
+
+    fn key_kind(&self) -> KeyKind {
+        match **self {
+            TypeStruct::Assoc(..) |
+            TypeStruct::Variable(_) |
+            TypeStruct::Skolem(_) =>
+                KeyKind::Applicative,
+
+            TypeStruct::Nominal(..) =>
+                KeyKind::Generative,
+        }
+    }
+
+    fn shallow_eq(&self, key: &Type) -> bool {
+        match (&**self, &**key) {
+            (&Assoc(i, _), &Assoc(j, _)) => i == j,
+            (&Skolem(i), &Skolem(j)) => i == j,
+            (&Nominal(i, _), &Nominal(j, _)) => i == j,
+            _ => false,
+        }
+    }
+
+    fn successors(&self) -> Vec<Self> {
+        match **self {
+            Assoc(_, ref s) => s.clone(),
+            Skolem(_) => vec![],
+            Variable(_) => vec![],
+            Nominal(_, ref s) => s.clone(),
+        }
+    }
+}
+
+fn skolem(x: u32) -> Type {
+    Box::new(Skolem(x))
+}
+
+fn iterator_item(t: Type) -> Type {
+    Box::new(Assoc("Iterator::Item", vec![t]))
+}
+
+fn integer() -> Type {
+    Box::new(Nominal("integer", vec![]))
+}
+
+fn character() -> Type {
+    Box::new(Nominal("char", vec![]))
+}
+
+fn vec(t: Type) -> Type {
+    Box::new(Nominal("Vec", vec![t]))
+}
+
+fn inference_var<'tcx>(cc: &mut CongruenceClosure<Type>) -> Type {
+    let token = cc.new_token(KeyKind::Applicative,
+                             move |token| Box::new(TypeStruct::Variable(token)));
+    cc.key(token).clone()
+}
+
+#[test]
+fn simple_as_it_gets() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+    assert!(cc.merged(skolem(0), skolem(0)));
+    assert!(!cc.merged(skolem(0), skolem(1)));
+    assert!(cc.merged(skolem(1), skolem(1)));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(0))));
+    assert!(!cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+    assert!(cc.merged(iterator_item(skolem(1)), iterator_item(skolem(1))));
+}
+
+#[test]
+fn union_vars() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+    cc.merge(skolem(0), skolem(1));
+    assert!(cc.merged(skolem(0), skolem(1)));
+}
+
+#[test]
+fn union_iterator_item_then_test_var() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+    cc.merge(skolem(0), skolem(1));
+    assert!(cc.merged(skolem(0), skolem(1)));
+}
+
+#[test]
+fn union_direct() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.add(iterator_item(skolem(0)));
+    cc.add(iterator_item(skolem(1)));
+    cc.add(skolem(0));
+    cc.add(skolem(1));
+
+    cc.merge(skolem(0), skolem(1));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+macro_rules! indirect_test {
+    ($test_name:ident: $a:expr, $b:expr; $c:expr, $d:expr) => {
+        #[test]
+        fn $test_name() {
+            // Variant 1: call `add` explicitly
+            //
+            // This caused bugs because nodes were pre-existing.
+            {
+                let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+                cc.add(iterator_item(skolem(0)));
+                cc.add(iterator_item(skolem(2)));
+                cc.add(skolem(0));
+                cc.add(skolem(1));
+                cc.add(skolem(2));
+
+                cc.merge($a, $b);
+                cc.merge($c, $d);
+                assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(2))));
+            }
+
+            // Variant 2: never call `add` explicitly
+            //
+            // This is more how we expect library to be used in practice.
+            {
+                let mut cc2: CongruenceClosure<Type> = CongruenceClosure::new();
+                cc2.merge($a, $b);
+                cc2.merge($c, $d);
+                assert!(cc2.merged(iterator_item(skolem(0)), iterator_item(skolem(2))));
+            }
+        }
+    }
+}
+
+// The indirect tests test for the case where we merge V0 and V1, and
+// we merged V1 and V2, and we want to use this to conclude that
+// Assoc(V0) and Assoc(V2) are merged -- but there is no node created for
+// Assoc(V1).
+indirect_test! { indirect_test_1: skolem(1), skolem(2); skolem(1), skolem(0) }
+indirect_test! { indirect_test_2: skolem(2), skolem(1); skolem(1), skolem(0) }
+indirect_test! { indirect_test_3: skolem(1), skolem(2); skolem(0), skolem(1) }
+indirect_test! { indirect_test_4: skolem(2), skolem(1); skolem(0), skolem(1) }
+
+// Here we determine that `Assoc(V0) == Assoc(V1)` because `V0==V1`,
+// but we never add nodes for `Assoc(_)`.
+#[test]
+fn merged_no_add() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(skolem(0), skolem(1));
+
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+// Here we determine that `Assoc(V0) == Assoc(V2)` because `V0==V1==V2`,
+// but we never add nodes for `Assoc(_)`.
+#[test]
+fn merged_no_add_indirect() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(skolem(0), skolem(1));
+    cc.merge(skolem(1), skolem(2));
+
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(2))));
+}
+
+// Here we determine that `Assoc(V0) == Assoc(V2)` because `V0==V1==V2`,
+// but we never add nodes for `Assoc(_)`.
+#[test]
+fn iterator_item_not_merged() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(iterator_item(skolem(0)), iterator_item(skolem(1)));
+
+    assert!(!cc.merged(skolem(0), skolem(1)));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+// Here we show that merging `Assoc(V1) == Assoc(V2)` does NOT imply that
+// `V1 == V2`.
+#[test]
+fn merge_fns_not_inputs() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(iterator_item(skolem(0)), iterator_item(skolem(1)));
+
+    assert!(!cc.merged(skolem(0), skolem(1)));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+#[test]
+fn inf_var_union() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    let v0 = inference_var(&mut cc);
+    let v1 = inference_var(&mut cc);
+    let v2 = inference_var(&mut cc);
+    let iterator_item_v0 = iterator_item(v0.clone());
+    let iterator_item_v1 = iterator_item(v1.clone());
+    let iterator_item_v2 = iterator_item(v2.clone());
+
+    cc.merge(v0.clone(), v1.clone());
+
+    assert!(cc.map.is_empty()); // inf variables don't take up map slots
+
+    assert!(cc.merged(iterator_item_v0.clone(), iterator_item_v1.clone()));
+    assert!(!cc.merged(iterator_item_v0.clone(), iterator_item_v2.clone()));
+
+    cc.merge(iterator_item_v0.clone(), iterator_item_v2.clone());
+    assert!(cc.merged(iterator_item_v0.clone(), iterator_item_v2.clone()));
+    assert!(cc.merged(iterator_item_v1.clone(), iterator_item_v2.clone()));
+
+    assert_eq!(cc.map.len(), 3); // each iterator_item needs an entry
+}
+
+#[test]
+fn skolem_union_no_add() {
+
+    // This particular pattern of unifications exploits a potentially
+    // subtle bug:
+    // - We merge `skolem(0)` and `skolem(1)`
+    //   and then merge `Assoc(skolem(0))` and `Assoc(skolem(2))`.
+    // - From this we should be able to deduce that `Assoc(skolem(1)) == Assoc(skolem(2))`.
+    // - However, if we are not careful with accounting for
+    //   predecessors and so forth, this fails. For example, when
+    //   adding `Assoc(skolem(1))`, we have to consider `Assoc(skolem(0))`
+    //   to be a predecessor of `skolem(1)`.
+
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(skolem(0), skolem(1));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+    assert!(!cc.merged(iterator_item(skolem(0)), iterator_item(skolem(2))));
+
+    cc.merge(iterator_item(skolem(0)), iterator_item(skolem(2)));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(2))));
+    assert!(cc.merged(iterator_item(skolem(1)), iterator_item(skolem(2))));
+}
+
+#[test]
+fn merged_keys() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(skolem(0), skolem(1));
+    cc.merge(iterator_item(skolem(0)), iterator_item(skolem(2)));
+
+    // Here we don't yet see `iterator_item(skolem(1))` because it has no
+    // corresponding node:
+    let keys: Vec<Type> = cc.merged_keys(iterator_item(skolem(2))).collect();
+    assert_eq!(&keys[..], &[iterator_item(skolem(2)), iterator_item(skolem(0))]);
+
+    // But of course `merged` returns true (and adds a node):
+    assert!(cc.merged(iterator_item(skolem(1)), iterator_item(skolem(2))));
+
+    // So now we see it:
+    let keys: Vec<Type> = cc.merged_keys(iterator_item(skolem(2))).collect();
+    assert_eq!(&keys[..], &[iterator_item(skolem(2)),
+                            iterator_item(skolem(1)),
+                            iterator_item(skolem(0))]);
+}
+
+// Here we show that merging `Vec<V1> == Vec<V2>` DOES imply that
+// `V1 == V2`.
+#[test]
+fn merge_vecs() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(vec(skolem(0)), vec(skolem(1)));
+
+    assert!(cc.merged(skolem(0), skolem(1)));
+    assert!(cc.merged(vec(skolem(0)), vec(skolem(1))));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+// Here we show that merging `Vec<V1::Item> == Vec<V2::Item>` does NOT imply that
+// `V1 == V2`.
+#[test]
+fn merge_vecs_of_items() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(vec(iterator_item(skolem(0))),
+             vec(iterator_item(skolem(1))));
+
+    assert!(!cc.merged(skolem(0), skolem(1)));
+    assert!(!cc.merged(vec(skolem(0)), vec(skolem(1))));
+    assert!(cc.merged(vec(iterator_item(skolem(0))),
+                      vec(iterator_item(skolem(1)))));
+    assert!(cc.merged(iterator_item(vec(iterator_item(skolem(0)))),
+                      iterator_item(vec(iterator_item(skolem(1))))));
+    assert!(cc.merged(iterator_item(iterator_item(vec(iterator_item(skolem(0))))),
+                      iterator_item(iterator_item(vec(iterator_item(skolem(1)))))));
+    assert!(cc.merged(iterator_item(skolem(0)), iterator_item(skolem(1))));
+}
+
+// Here we merge `Vec<Int>::Item` with `Int` and then merge that later
+// with an inference variable, and show that we concluded that the
+// variable is (indeed) `Int`.
+#[test]
+fn merge_iterator_item_generative() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+    cc.merge(iterator_item(vec(integer())), integer());
+    let v0 = inference_var(&mut cc);
+    cc.merge(iterator_item(vec(integer())), v0.clone());
+    assert!(cc.merged(v0.clone(), integer()));
+    assert!(cc.merged(vec(iterator_item(vec(integer()))), vec(integer())));
+}
+
+#[test]
+fn merge_ripple() {
+    let mut cc: CongruenceClosure<Type> = CongruenceClosure::new();
+
+    cc.merge(iterator_item(skolem(1)), vec(skolem(0)));
+    cc.merge(iterator_item(skolem(2)), vec(integer()));
+
+    assert!(!cc.merged(iterator_item(skolem(1)), iterator_item(skolem(2))));
+
+    println!("------------------------------");
+    cc.merge(skolem(0), integer());
+
+    println!("------------------------------");
+    assert!(cc.merged(iterator_item(skolem(1)),
+                      iterator_item(skolem(2))));
+    assert!(cc.merged(iterator_item(iterator_item(skolem(1))),
+                      iterator_item(iterator_item(skolem(2)))));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/constraint/mod.rs
@@ -0,0 +1,160 @@
+//! Constraint graph.
+
+#![allow(dead_code)]
+
+use graph::{Graph, NodeIndex};
+use std::collections::VecDeque;
+use std::u32;
+
+#[cfg(test)]
+mod test;
+
+pub trait Lattice {
+    type Element: Clone + Eq;
+
+    fn lub(&self, elem1: &Self::Element, elem2: &Self::Element) -> Option<Self::Element>;
+}
+
+pub struct ConstraintGraph<L: Lattice> {
+    graph: Graph<(), ()>,
+    values: Vec<L::Element>,
+    lattice: L,
+}
+
+#[derive(Copy, Clone)]
+pub struct Var {
+    index: u32,
+}
+
+impl Var {
+    pub fn index(&self) -> usize {
+        self.index as usize
+    }
+
+    fn to_node_index(self) -> NodeIndex {
+        NodeIndex(self.index as usize)
+    }
+
+    fn from_node_index(ni: NodeIndex) -> Var {
+        assert!(ni.0 < (u32::MAX as usize));
+        Var { index: ni.0 as u32 }
+    }
+}
+
+impl<L> ConstraintGraph<L>
+    where L: Lattice
+{
+    fn new(lattice: L) -> ConstraintGraph<L> {
+        ConstraintGraph {
+            graph: Graph::new(),
+            values: Vec::new(),
+            lattice: lattice,
+        }
+    }
+
+    fn new_var(&mut self, initial_value: L::Element) -> Var {
+        assert_eq!(self.graph.all_nodes().len(), self.values.len());
+        let node_index = self.graph.add_node(());
+        self.values.push(initial_value);
+        Var::from_node_index(node_index)
+    }
+
+    pub fn constrain_var(&mut self, var: Var, value: L::Element) -> Vec<PropagationError<L>> {
+        let propagation = Propagation::new(&self.lattice, &self.graph, &mut self.values);
+        propagation.propagate(value, var)
+    }
+
+    pub fn add_edge(&mut self, source: Var, target: Var) -> Vec<PropagationError<L>> {
+        let source_node = source.to_node_index();
+        let target_node = target.to_node_index();
+
+        if self.graph
+               .successor_nodes(source_node)
+               .any(|n| n == target_node) {
+            return vec![];
+        }
+
+        self.graph.add_edge(source_node, target_node, ());
+        let value = self.current_value(source);
+        self.constrain_var(target, value)
+    }
+
+    pub fn current_value(&self, node: Var) -> L::Element {
+        self.values[node.index()].clone()
+    }
+}
+
+/// ////////////////////////////////////////////////////////////////////////
+
+struct Propagation<'p, L>
+    where L: Lattice + 'p,
+          L::Element: 'p
+{
+    lattice: &'p L,
+    graph: &'p Graph<(), ()>,
+    values: &'p mut Vec<L::Element>,
+    queue: VecDeque<Var>,
+    errors: Vec<PropagationError<L>>,
+}
+
+pub struct PropagationError<L>
+    where L: Lattice
+{
+    var: Var,
+    old_value: L::Element,
+    new_value: L::Element,
+}
+
+impl<'p, L> Propagation<'p, L>
+    where L: Lattice,
+          L::Element: 'p
+{
+    fn new(lattice: &'p L,
+           graph: &'p Graph<(), ()>,
+           values: &'p mut Vec<L::Element>)
+           -> Propagation<'p, L> {
+        Propagation {
+            lattice: lattice,
+            graph: graph,
+            values: values,
+            queue: VecDeque::new(),
+            errors: Vec::new(),
+        }
+    }
+
+    fn propagate(mut self, value: L::Element, var: Var) -> Vec<PropagationError<L>> {
+        self.update_node(value, var);
+
+        while let Some(dirty) = self.queue.pop_front() {
+            let value = self.values[dirty.index()].clone();
+
+            for succ_node_index in self.graph.successor_nodes(dirty.to_node_index()) {
+                let succ_var = Var::from_node_index(succ_node_index);
+                self.update_node(value.clone(), succ_var);
+            }
+        }
+
+        self.errors
+    }
+
+    fn update_node(&mut self, value: L::Element, var: Var) {
+        let cur_value = self.values[var.index()].clone();
+        match self.lattice.lub(&cur_value, &value) {
+            Some(new_value) => {
+                if cur_value != new_value {
+                    self.values[var.index()] = value;
+                    self.queue.push_back(var);
+                }
+            }
+
+            None => {
+                // Error. Record for later.
+                self.errors.push(PropagationError::<L> {
+                    var: var,
+                    old_value: cur_value,
+                    new_value: value,
+                });
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/constraint/test.rs
@@ -0,0 +1,69 @@
+use super::*;
+
+use std::cmp;
+
+struct MaxLattice;
+
+impl Lattice for MaxLattice {
+    type Element = u32;
+
+    fn lub(&self, elem1: &u32, elem2: &u32) -> Option<u32> {
+        Some(cmp::max(*elem1, *elem2))
+    }
+}
+
+#[test]
+fn basic() {
+    // v1 --+--> v2
+    //      |
+    // v3 --+
+
+    let mut graph = ConstraintGraph::new(MaxLattice);
+    let v1 = graph.new_var(3);
+    let v2 = graph.new_var(0);
+    graph.add_edge(v1, v2);
+    assert_eq!(graph.current_value(v1), 3);
+    assert_eq!(graph.current_value(v2), 3);
+
+    let v3 = graph.new_var(5);
+    graph.add_edge(v3, v2);
+    assert_eq!(graph.current_value(v1), 3);
+    assert_eq!(graph.current_value(v2), 5);
+    assert_eq!(graph.current_value(v3), 5);
+
+    graph.constrain_var(v1, 10);
+    assert_eq!(graph.current_value(v1), 10);
+    assert_eq!(graph.current_value(v2), 10);
+    assert_eq!(graph.current_value(v3), 5);
+}
+
+
+#[test]
+fn cycle() {
+    // v1 ----> v2
+    // ^        |
+    // |        v
+    // v3 <---- v3
+
+    let mut graph = ConstraintGraph::new(MaxLattice);
+    let vars = [graph.new_var(0), graph.new_var(0), graph.new_var(0), graph.new_var(0)];
+
+    for i in 0..4 {
+        graph.add_edge(vars[i], vars[(i + 1) % vars.len()]);
+    }
+
+    graph.constrain_var(vars[1], 3);
+    assert!(vars.iter().all(|&var| graph.current_value(var) == 3));
+
+    graph.constrain_var(vars[2], 5);
+    assert!(vars.iter().all(|&var| graph.current_value(var) == 5));
+
+    graph.constrain_var(vars[3], 2);
+    assert!(vars.iter().all(|&var| graph.current_value(var) == 5));
+
+    graph.constrain_var(vars[3], 6);
+    assert!(vars.iter().all(|&var| graph.current_value(var) == 6));
+
+    graph.constrain_var(vars[0], 10);
+    assert!(vars.iter().all(|&var| graph.current_value(var) == 10));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/debug.rs
@@ -0,0 +1,43 @@
+#[cfg(test)]
+use std::cell::Cell;
+
+#[cfg(test)]
+thread_local!(pub static ENABLED: Cell<u32> = Cell::new(0));
+
+#[cfg(test)]
+#[macro_export]
+macro_rules! debug {
+    ($($arg:tt)*) => (
+        ::debug::ENABLED.with(|slot| {
+            if slot.get() != 0 {
+                println!("{}", format_args!($($arg)+));
+            }
+        })
+    )
+}
+
+#[cfg(not(test))]
+#[macro_export]
+macro_rules! debug {
+    ($($arg:tt)*) => ( () )
+}
+
+#[cfg(test)]
+pub struct Logger {
+    _x: (),
+}
+
+#[cfg(test)]
+impl Logger {
+    pub fn new() -> Logger {
+        ENABLED.with(|slot| slot.set(slot.get() + 1));
+        Logger { _x: () }
+    }
+}
+
+#[cfg(test)]
+impl Drop for Logger {
+    fn drop(&mut self) {
+        ENABLED.with(|slot| slot.set(slot.get() - 1));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/graph/mod.rs
@@ -0,0 +1,427 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A graph module for use in dataflow, region resolution, and elsewhere.
+//!
+//! # Interface details
+//!
+//! You customize the graph by specifying a "node data" type `N` and an
+//! "edge data" type `E`. You can then later gain access (mutable or
+//! immutable) to these "user-data" bits. Currently, you can only add
+//! nodes or edges to the graph. You cannot remove or modify them once
+//! added. This could be changed if we have a need.
+//!
+//! # Implementation details
+//!
+//! The main tricky thing about this code is the way that edges are
+//! stored. The edges are stored in a central array, but they are also
+//! threaded onto two linked lists for each node, one for incoming edges
+//! and one for outgoing edges. Note that every edge is a member of some
+//! incoming list and some outgoing list.  Basically you can load the
+//! first index of the linked list from the node data structures (the
+//! field `first_edge`) and then, for each edge, load the next index from
+//! the field `next_edge`). Each of those fields is an array that should
+//! be indexed by the direction (see the type `Direction`).
+
+use bitvec::BitVector;
+use std::fmt::{Formatter, Error, Debug};
+use std::usize;
+use snapshot_vec::{SnapshotVec, SnapshotVecDelegate};
+
+#[cfg(test)]
+mod tests;
+
+pub struct Graph<N, E> {
+    nodes: SnapshotVec<Node<N>>,
+    edges: SnapshotVec<Edge<E>>,
+}
+
+pub struct Node<N> {
+    first_edge: [EdgeIndex; 2], // see module comment
+    pub data: N,
+}
+
+pub struct Edge<E> {
+    next_edge: [EdgeIndex; 2], // see module comment
+    source: NodeIndex,
+    target: NodeIndex,
+    pub data: E,
+}
+
+impl<N> SnapshotVecDelegate for Node<N> {
+    type Value = Node<N>;
+    type Undo = ();
+
+    fn reverse(_: &mut Vec<Node<N>>, _: ()) {}
+}
+
+impl<N> SnapshotVecDelegate for Edge<N> {
+    type Value = Edge<N>;
+    type Undo = ();
+
+    fn reverse(_: &mut Vec<Edge<N>>, _: ()) {}
+}
+
+impl<E: Debug> Debug for Edge<E> {
+    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
+        write!(f,
+               "Edge {{ next_edge: [{:?}, {:?}], source: {:?}, target: {:?}, data: {:?} }}",
+               self.next_edge[0],
+               self.next_edge[1],
+               self.source,
+               self.target,
+               self.data)
+    }
+}
+
+#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)]
+pub struct NodeIndex(pub usize);
+
+#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)]
+pub struct EdgeIndex(pub usize);
+
+pub const INVALID_EDGE_INDEX: EdgeIndex = EdgeIndex(usize::MAX);
+
+// Use a private field here to guarantee no more instances are created:
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub struct Direction {
+    repr: usize,
+}
+
+pub const OUTGOING: Direction = Direction { repr: 0 };
+
+pub const INCOMING: Direction = Direction { repr: 1 };
+
+impl NodeIndex {
+    /// Returns unique id (unique with respect to the graph holding associated node).
+    pub fn node_id(&self) -> usize {
+        self.0
+    }
+}
+
+impl EdgeIndex {
+    /// Returns unique id (unique with respect to the graph holding associated edge).
+    pub fn edge_id(&self) -> usize {
+        self.0
+    }
+}
+
+impl<N: Debug, E: Debug> Graph<N, E> {
+    pub fn new() -> Graph<N, E> {
+        Graph {
+            nodes: SnapshotVec::new(),
+            edges: SnapshotVec::new(),
+        }
+    }
+
+    // # Simple accessors
+
+    #[inline]
+    pub fn all_nodes(&self) -> &[Node<N>] {
+        &self.nodes
+    }
+
+    #[inline]
+    pub fn len_nodes(&self) -> usize {
+        self.nodes.len()
+    }
+
+    #[inline]
+    pub fn all_edges(&self) -> &[Edge<E>] {
+        &self.edges
+    }
+
+    #[inline]
+    pub fn len_edges(&self) -> usize {
+        self.edges.len()
+    }
+
+    // # Node construction
+
+    pub fn next_node_index(&self) -> NodeIndex {
+        NodeIndex(self.nodes.len())
+    }
+
+    pub fn add_node(&mut self, data: N) -> NodeIndex {
+        let idx = self.next_node_index();
+        self.nodes.push(Node {
+            first_edge: [INVALID_EDGE_INDEX, INVALID_EDGE_INDEX],
+            data: data,
+        });
+        idx
+    }
+
+    pub fn mut_node_data(&mut self, idx: NodeIndex) -> &mut N {
+        &mut self.nodes[idx.0].data
+    }
+
+    pub fn node_data(&self, idx: NodeIndex) -> &N {
+        &self.nodes[idx.0].data
+    }
+
+    pub fn node(&self, idx: NodeIndex) -> &Node<N> {
+        &self.nodes[idx.0]
+    }
+
+    // # Edge construction and queries
+
+    pub fn next_edge_index(&self) -> EdgeIndex {
+        EdgeIndex(self.edges.len())
+    }
+
+    pub fn add_edge(&mut self, source: NodeIndex, target: NodeIndex, data: E) -> EdgeIndex {
+        debug!("graph: add_edge({:?}, {:?}, {:?})", source, target, data);
+
+        let idx = self.next_edge_index();
+
+        // read current first of the list of edges from each node
+        let source_first = self.nodes[source.0].first_edge[OUTGOING.repr];
+        let target_first = self.nodes[target.0].first_edge[INCOMING.repr];
+
+        // create the new edge, with the previous firsts from each node
+        // as the next pointers
+        self.edges.push(Edge {
+            next_edge: [source_first, target_first],
+            source: source,
+            target: target,
+            data: data,
+        });
+
+        // adjust the firsts for each node target be the next object.
+        self.nodes[source.0].first_edge[OUTGOING.repr] = idx;
+        self.nodes[target.0].first_edge[INCOMING.repr] = idx;
+
+        return idx;
+    }
+
+    pub fn mut_edge_data(&mut self, idx: EdgeIndex) -> &mut E {
+        &mut self.edges[idx.0].data
+    }
+
+    pub fn edge_data(&self, idx: EdgeIndex) -> &E {
+        &self.edges[idx.0].data
+    }
+
+    pub fn edge(&self, idx: EdgeIndex) -> &Edge<E> {
+        &self.edges[idx.0]
+    }
+
+    pub fn first_adjacent(&self, node: NodeIndex, dir: Direction) -> EdgeIndex {
+        //! Accesses the index of the first edge adjacent to `node`.
+        //! This is useful if you wish to modify the graph while walking
+        //! the linked list of edges.
+
+        self.nodes[node.0].first_edge[dir.repr]
+    }
+
+    pub fn next_adjacent(&self, edge: EdgeIndex, dir: Direction) -> EdgeIndex {
+        //! Accesses the next edge in a given direction.
+        //! This is useful if you wish to modify the graph while walking
+        //! the linked list of edges.
+
+        self.edges[edge.0].next_edge[dir.repr]
+    }
+
+    // # Iterating over nodes, edges
+
+    pub fn each_node<'a, F>(&'a self, mut f: F) -> bool
+        where F: FnMut(NodeIndex, &'a Node<N>) -> bool
+    {
+        //! Iterates over all edges defined in the graph.
+        self.nodes.iter().enumerate().all(|(i, node)| f(NodeIndex(i), node))
+    }
+
+    pub fn each_edge<'a, F>(&'a self, mut f: F) -> bool
+        where F: FnMut(EdgeIndex, &'a Edge<E>) -> bool
+    {
+        //! Iterates over all edges defined in the graph
+        self.edges.iter().enumerate().all(|(i, edge)| f(EdgeIndex(i), edge))
+    }
+
+    pub fn outgoing_edges(&self, source: NodeIndex) -> AdjacentEdges<N, E> {
+        self.adjacent_edges(source, OUTGOING)
+    }
+
+    pub fn incoming_edges(&self, source: NodeIndex) -> AdjacentEdges<N, E> {
+        self.adjacent_edges(source, INCOMING)
+    }
+
+    pub fn adjacent_edges(&self, source: NodeIndex, direction: Direction) -> AdjacentEdges<N, E> {
+        let first_edge = self.node(source).first_edge[direction.repr];
+        AdjacentEdges {
+            graph: self,
+            direction: direction,
+            next: first_edge,
+        }
+    }
+
+    pub fn successor_nodes(&self, source: NodeIndex) -> AdjacentTargets<N, E> {
+        self.outgoing_edges(source).targets()
+    }
+
+    pub fn predecessor_nodes(&self, target: NodeIndex) -> AdjacentSources<N, E> {
+        self.incoming_edges(target).sources()
+    }
+
+    // # Fixed-point iteration
+    //
+    // A common use for graphs in our compiler is to perform
+    // fixed-point iteration. In this case, each edge represents a
+    // constraint, and the nodes themselves are associated with
+    // variables or other bitsets. This method facilitates such a
+    // computation.
+
+    pub fn iterate_until_fixed_point<'a, F>(&'a self, mut op: F)
+        where F: FnMut(usize, EdgeIndex, &'a Edge<E>) -> bool
+    {
+        let mut iteration = 0;
+        let mut changed = true;
+        while changed {
+            changed = false;
+            iteration += 1;
+            for (i, edge) in self.edges.iter().enumerate() {
+                changed |= op(iteration, EdgeIndex(i), edge);
+            }
+        }
+    }
+
+    pub fn depth_traverse<'a>(&'a self, start: NodeIndex) -> DepthFirstTraversal<'a, N, E> {
+        DepthFirstTraversal {
+            graph: self,
+            stack: vec![start],
+            visited: BitVector::new(self.nodes.len()),
+        }
+    }
+}
+
+// # Iterators
+
+pub struct AdjacentEdges<'g, N, E>
+    where N: 'g,
+          E: 'g
+{
+    graph: &'g Graph<N, E>,
+    direction: Direction,
+    next: EdgeIndex,
+}
+
+impl<'g, N, E> AdjacentEdges<'g, N, E> {
+    fn targets(self) -> AdjacentTargets<'g, N, E> {
+        AdjacentTargets { edges: self }
+    }
+
+    fn sources(self) -> AdjacentSources<'g, N, E> {
+        AdjacentSources { edges: self }
+    }
+}
+
+impl<'g, N: Debug, E: Debug> Iterator for AdjacentEdges<'g, N, E> {
+    type Item = (EdgeIndex, &'g Edge<E>);
+
+    fn next(&mut self) -> Option<(EdgeIndex, &'g Edge<E>)> {
+        let edge_index = self.next;
+        if edge_index == INVALID_EDGE_INDEX {
+            return None;
+        }
+
+        let edge = self.graph.edge(edge_index);
+        self.next = edge.next_edge[self.direction.repr];
+        Some((edge_index, edge))
+    }
+}
+
+pub struct AdjacentTargets<'g, N: 'g, E: 'g>
+    where N: 'g,
+          E: 'g
+{
+    edges: AdjacentEdges<'g, N, E>,
+}
+
+impl<'g, N: Debug, E: Debug> Iterator for AdjacentTargets<'g, N, E> {
+    type Item = NodeIndex;
+
+    fn next(&mut self) -> Option<NodeIndex> {
+        self.edges.next().map(|(_, edge)| edge.target)
+    }
+}
+
+pub struct AdjacentSources<'g, N: 'g, E: 'g>
+    where N: 'g,
+          E: 'g
+{
+    edges: AdjacentEdges<'g, N, E>,
+}
+
+impl<'g, N: Debug, E: Debug> Iterator for AdjacentSources<'g, N, E> {
+    type Item = NodeIndex;
+
+    fn next(&mut self) -> Option<NodeIndex> {
+        self.edges.next().map(|(_, edge)| edge.source)
+    }
+}
+
+pub struct DepthFirstTraversal<'g, N: 'g, E: 'g> {
+    graph: &'g Graph<N, E>,
+    stack: Vec<NodeIndex>,
+    visited: BitVector,
+}
+
+impl<'g, N: Debug, E: Debug> Iterator for DepthFirstTraversal<'g, N, E> {
+    type Item = NodeIndex;
+
+    fn next(&mut self) -> Option<NodeIndex> {
+        while let Some(idx) = self.stack.pop() {
+            if !self.visited.insert(idx.node_id()) {
+                continue;
+            }
+
+            for (_, edge) in self.graph.outgoing_edges(idx) {
+                if !self.visited.contains(edge.target().node_id()) {
+                    self.stack.push(edge.target());
+                }
+            }
+
+            return Some(idx);
+        }
+
+        return None;
+    }
+}
+
+pub fn each_edge_index<F>(max_edge_index: EdgeIndex, mut f: F)
+    where F: FnMut(EdgeIndex) -> bool
+{
+    let mut i = 0;
+    let n = max_edge_index.0;
+    while i < n {
+        if !f(EdgeIndex(i)) {
+            return;
+        }
+        i += 1;
+    }
+}
+
+impl<E> Edge<E> {
+    pub fn source(&self) -> NodeIndex {
+        self.source
+    }
+
+    pub fn target(&self) -> NodeIndex {
+        self.target
+    }
+
+    pub fn source_or_target(&self, direction: Direction) -> NodeIndex {
+        if direction == OUTGOING {
+            self.target
+        } else {
+            self.source
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/graph/tests.rs
@@ -0,0 +1,141 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use graph::*;
+use std::fmt::Debug;
+
+type TestNode = Node<&'static str>;
+type TestEdge = Edge<&'static str>;
+type TestGraph = Graph<&'static str, &'static str>;
+
+fn create_graph() -> TestGraph {
+    let mut graph = Graph::new();
+
+    // Create a simple graph
+    //
+    //    A -+> B --> C
+    //       |  |     ^
+    //       |  v     |
+    //       F  D --> E
+
+    let a = graph.add_node("A");
+    let b = graph.add_node("B");
+    let c = graph.add_node("C");
+    let d = graph.add_node("D");
+    let e = graph.add_node("E");
+    let f = graph.add_node("F");
+
+    graph.add_edge(a, b, "AB");
+    graph.add_edge(b, c, "BC");
+    graph.add_edge(b, d, "BD");
+    graph.add_edge(d, e, "DE");
+    graph.add_edge(e, c, "EC");
+    graph.add_edge(f, b, "FB");
+
+    return graph;
+}
+
+#[test]
+fn each_node() {
+    let graph = create_graph();
+    let expected = ["A", "B", "C", "D", "E", "F"];
+    graph.each_node(|idx, node| {
+        assert_eq!(&expected[idx.0], graph.node_data(idx));
+        assert_eq!(expected[idx.0], node.data);
+        true
+    });
+}
+
+#[test]
+fn each_edge() {
+    let graph = create_graph();
+    let expected = ["AB", "BC", "BD", "DE", "EC", "FB"];
+    graph.each_edge(|idx, edge| {
+        assert_eq!(&expected[idx.0], graph.edge_data(idx));
+        assert_eq!(expected[idx.0], edge.data);
+        true
+    });
+}
+
+fn test_adjacent_edges<N: PartialEq + Debug, E: PartialEq + Debug>(graph: &Graph<N, E>,
+                                                                   start_index: NodeIndex,
+                                                                   start_data: N,
+                                                                   expected_incoming: &[(E, N)],
+                                                                   expected_outgoing: &[(E, N)]) {
+    assert!(graph.node_data(start_index) == &start_data);
+
+    let mut counter = 0;
+    for (edge_index, edge) in graph.incoming_edges(start_index) {
+        assert!(graph.edge_data(edge_index) == &edge.data);
+        assert!(counter < expected_incoming.len());
+        debug!("counter={:?} expected={:?} edge_index={:?} edge={:?}",
+               counter,
+               expected_incoming[counter],
+               edge_index,
+               edge);
+        match expected_incoming[counter] {
+            (ref e, ref n) => {
+                assert!(e == &edge.data);
+                assert!(n == graph.node_data(edge.source()));
+                assert!(start_index == edge.target);
+            }
+        }
+        counter += 1;
+    }
+    assert_eq!(counter, expected_incoming.len());
+
+    let mut counter = 0;
+    for (edge_index, edge) in graph.outgoing_edges(start_index) {
+        assert!(graph.edge_data(edge_index) == &edge.data);
+        assert!(counter < expected_outgoing.len());
+        debug!("counter={:?} expected={:?} edge_index={:?} edge={:?}",
+               counter,
+               expected_outgoing[counter],
+               edge_index,
+               edge);
+        match expected_outgoing[counter] {
+            (ref e, ref n) => {
+                assert!(e == &edge.data);
+                assert!(start_index == edge.source);
+                assert!(n == graph.node_data(edge.target));
+            }
+        }
+        counter += 1;
+    }
+    assert_eq!(counter, expected_outgoing.len());
+}
+
+#[test]
+fn each_adjacent_from_a() {
+    let graph = create_graph();
+    test_adjacent_edges(&graph, NodeIndex(0), "A", &[], &[("AB", "B")]);
+}
+
+#[test]
+fn each_adjacent_from_b() {
+    let graph = create_graph();
+    test_adjacent_edges(&graph,
+                        NodeIndex(1),
+                        "B",
+                        &[("FB", "F"), ("AB", "A")],
+                        &[("BD", "D"), ("BC", "C")]);
+}
+
+#[test]
+fn each_adjacent_from_c() {
+    let graph = create_graph();
+    test_adjacent_edges(&graph, NodeIndex(2), "C", &[("EC", "E"), ("BC", "B")], &[]);
+}
+
+#[test]
+fn each_adjacent_from_d() {
+    let graph = create_graph();
+    test_adjacent_edges(&graph, NodeIndex(3), "D", &[("BD", "B")], &[("DE", "E")]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/lib.rs
@@ -0,0 +1,23 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![cfg_attr(all(feature = "unstable", test), feature(test))]
+#![allow(dead_code)]
+
+#[macro_use]
+mod debug;
+
+pub mod constraint;
+pub mod graph;
+pub mod snapshot_vec;
+#[cfg(feature = "unstable")]
+pub mod cc;
+pub mod unify;
+pub mod bitvec;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/snapshot_vec.rs
@@ -0,0 +1,251 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A utility class for implementing "snapshottable" things; a snapshottable data structure permits
+//! you to take a snapshot (via `start_snapshot`) and then, after making some changes, elect either
+//! to rollback to the start of the snapshot or commit those changes.
+//!
+//! This vector is intended to be used as part of an abstraction, not serve as a complete
+//! abstraction on its own. As such, while it will roll back most changes on its own, it also
+//! supports a `get_mut` operation that gives you an arbitrary mutable pointer into the vector. To
+//! ensure that any changes you make this with this pointer are rolled back, you must invoke
+//! `record` to record any changes you make and also supplying a delegate capable of reversing
+//! those changes.
+use self::UndoLog::*;
+
+use std::mem;
+use std::ops;
+
+pub enum UndoLog<D: SnapshotVecDelegate> {
+    /// Indicates where a snapshot started.
+    OpenSnapshot,
+
+    /// Indicates a snapshot that has been committed.
+    CommittedSnapshot,
+
+    /// New variable with given index was created.
+    NewElem(usize),
+
+    /// Variable with given index was changed *from* the given value.
+    SetElem(usize, D::Value),
+
+    /// Extensible set of actions
+    Other(D::Undo),
+}
+
+pub struct SnapshotVec<D: SnapshotVecDelegate> {
+    values: Vec<D::Value>,
+    undo_log: Vec<UndoLog<D>>,
+}
+
+// Snapshots are tokens that should be created/consumed linearly.
+pub struct Snapshot {
+    // Length of the undo log at the time the snapshot was taken.
+    length: usize,
+}
+
+pub trait SnapshotVecDelegate {
+    type Value;
+    type Undo;
+
+    fn reverse(values: &mut Vec<Self::Value>, action: Self::Undo);
+}
+
+impl<D: SnapshotVecDelegate> SnapshotVec<D> {
+    pub fn new() -> SnapshotVec<D> {
+        SnapshotVec {
+            values: Vec::new(),
+            undo_log: Vec::new(),
+        }
+    }
+
+    fn in_snapshot(&self) -> bool {
+        !self.undo_log.is_empty()
+    }
+
+    pub fn record(&mut self, action: D::Undo) {
+        if self.in_snapshot() {
+            self.undo_log.push(Other(action));
+        }
+    }
+
+    pub fn len(&self) -> usize {
+        self.values.len()
+    }
+
+    pub fn push(&mut self, elem: D::Value) -> usize {
+        let len = self.values.len();
+        self.values.push(elem);
+
+        if self.in_snapshot() {
+            self.undo_log.push(NewElem(len));
+        }
+
+        len
+    }
+
+    pub fn get(&self, index: usize) -> &D::Value {
+        &self.values[index]
+    }
+
+    /// Returns a mutable pointer into the vec; whatever changes you make here cannot be undone
+    /// automatically, so you should be sure call `record()` with some sort of suitable undo
+    /// action.
+    pub fn get_mut(&mut self, index: usize) -> &mut D::Value {
+        &mut self.values[index]
+    }
+
+    /// Updates the element at the given index. The old value will saved (and perhaps restored) if
+    /// a snapshot is active.
+    pub fn set(&mut self, index: usize, new_elem: D::Value) {
+        let old_elem = mem::replace(&mut self.values[index], new_elem);
+        if self.in_snapshot() {
+            self.undo_log.push(SetElem(index, old_elem));
+        }
+    }
+
+    pub fn update<OP>(&mut self, index: usize, op: OP)
+        where OP: FnOnce(&mut D::Value), D::Value: Clone
+    {
+        if self.in_snapshot() {
+            let old_elem = self.values[index].clone();
+            self.undo_log.push(SetElem(index, old_elem));
+        }
+        op(&mut self.values[index]);
+    }
+
+    pub fn start_snapshot(&mut self) -> Snapshot {
+        let length = self.undo_log.len();
+        self.undo_log.push(OpenSnapshot);
+        Snapshot { length: length }
+    }
+
+    pub fn actions_since_snapshot(&self, snapshot: &Snapshot) -> &[UndoLog<D>] {
+        &self.undo_log[snapshot.length..]
+    }
+
+    fn assert_open_snapshot(&self, snapshot: &Snapshot) {
+        // Or else there was a failure to follow a stack discipline:
+        assert!(self.undo_log.len() > snapshot.length);
+
+        // Invariant established by start_snapshot():
+        assert!(match self.undo_log[snapshot.length] {
+            OpenSnapshot => true,
+            _ => false,
+        });
+    }
+
+    pub fn rollback_to(&mut self, snapshot: Snapshot) {
+        debug!("rollback_to({})", snapshot.length);
+
+        self.assert_open_snapshot(&snapshot);
+
+        while self.undo_log.len() > snapshot.length + 1 {
+            match self.undo_log.pop().unwrap() {
+                OpenSnapshot => {
+                    // This indicates a failure to obey the stack discipline.
+                    panic!("Cannot rollback an uncommitted snapshot");
+                }
+
+                CommittedSnapshot => {
+                    // This occurs when there are nested snapshots and
+                    // the inner is committed but outer is rolled back.
+                }
+
+                NewElem(i) => {
+                    self.values.pop();
+                    assert!(self.values.len() == i);
+                }
+
+                SetElem(i, v) => {
+                    self.values[i] = v;
+                }
+
+                Other(u) => {
+                    D::reverse(&mut self.values, u);
+                }
+            }
+        }
+
+        let v = self.undo_log.pop().unwrap();
+        assert!(match v {
+            OpenSnapshot => true,
+            _ => false,
+        });
+        assert!(self.undo_log.len() == snapshot.length);
+    }
+
+    /// Commits all changes since the last snapshot. Of course, they
+    /// can still be undone if there is a snapshot further out.
+    pub fn commit(&mut self, snapshot: Snapshot) {
+        debug!("commit({})", snapshot.length);
+
+        self.assert_open_snapshot(&snapshot);
+
+        if snapshot.length == 0 {
+            // The root snapshot.
+            self.undo_log.truncate(0);
+        } else {
+            self.undo_log[snapshot.length] = CommittedSnapshot;
+        }
+    }
+}
+
+impl<D: SnapshotVecDelegate> ops::Deref for SnapshotVec<D> {
+    type Target = [D::Value];
+    fn deref(&self) -> &[D::Value] {
+        &*self.values
+    }
+}
+
+impl<D: SnapshotVecDelegate> ops::DerefMut for SnapshotVec<D> {
+    fn deref_mut(&mut self) -> &mut [D::Value] {
+        &mut *self.values
+    }
+}
+
+impl<D: SnapshotVecDelegate> ops::Index<usize> for SnapshotVec<D> {
+    type Output = D::Value;
+    fn index(&self, index: usize) -> &D::Value {
+        self.get(index)
+    }
+}
+
+impl<D: SnapshotVecDelegate> ops::IndexMut<usize> for SnapshotVec<D> {
+    fn index_mut(&mut self, index: usize) -> &mut D::Value {
+        self.get_mut(index)
+    }
+}
+
+impl<D: SnapshotVecDelegate> Clone for SnapshotVec<D>
+    where D::Value: Clone, D::Undo: Clone,
+{
+    fn clone(&self) -> Self {
+        SnapshotVec {
+            values: self.values.clone(),
+            undo_log: self.undo_log.clone(),
+        }
+    }
+}
+
+impl<D: SnapshotVecDelegate> Clone for UndoLog<D>
+    where D::Value: Clone, D::Undo: Clone,
+{
+    fn clone(&self) -> Self {
+        match *self {
+            OpenSnapshot => OpenSnapshot,
+            CommittedSnapshot => CommittedSnapshot,
+            NewElem(i) => NewElem(i),
+            SetElem(i, ref v) => SetElem(i, v.clone()),
+            Other(ref u) => Other(u.clone()),
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/unify/mod.rs
@@ -0,0 +1,459 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::marker;
+use std::fmt::Debug;
+use std::marker::PhantomData;
+use snapshot_vec as sv;
+
+#[cfg(test)]
+mod tests;
+
+/// This trait is implemented by any type that can serve as a type
+/// variable. We call such variables *unification keys*. For example,
+/// this trait is implemented by `IntVid`, which represents integral
+/// variables.
+///
+/// Each key type has an associated value type `V`. For example, for
+/// `IntVid`, this is `Option<IntVarValue>`, representing some
+/// (possibly not yet known) sort of integer.
+///
+/// Clients are expected to provide implementations of this trait; you
+/// can see some examples in the `test` module.
+pub trait UnifyKey : Copy + Clone + Debug + PartialEq {
+    type Value: UnifyValue;
+
+    fn index(&self) -> u32;
+
+    fn from_index(u: u32) -> Self;
+
+    fn tag() -> &'static str;
+
+    /// If true, then `self` should be preferred as root to `other`.
+    /// Note that we assume a consistent partial ordering, so
+    /// returning true implies that `other.prefer_as_root_to(self)`
+    /// would return false.  If there is no ordering between two keys
+    /// (i.e., `a.prefer_as_root_to(b)` and `b.prefer_as_root_to(a)`
+    /// both return false) then the rank will be used to determine the
+    /// root in an optimal way.
+    ///
+    /// NB. The only reason to implement this method is if you want to
+    /// control what value is returned from `find()`. In general, it
+    /// is better to let the unification table determine the root,
+    /// since overriding the rank can cause execution time to increase
+    /// dramatically.
+    #[allow(unused_variables)]
+    fn order_roots(a: Self, a_value: &Self::Value,
+                   b: Self, b_value: &Self::Value)
+                   -> Option<(Self, Self)> {
+        None
+    }
+}
+
+pub trait UnifyValue: Clone + Debug {
+    /// Given two values, produce a new value that combines them.
+    /// If that is not possible, produce an error.
+    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, (Self, Self)>;
+}
+
+/// Marker trait which indicates that `UnifyValues::unify_values` will never return `Err`.
+pub trait InfallibleUnifyValue: UnifyValue {
+}
+
+/// Value of a unification key. We implement Tarjan's union-find
+/// algorithm: when two keys are unified, one of them is converted
+/// into a "redirect" pointing at the other. These redirects form a
+/// DAG: the roots of the DAG (nodes that are not redirected) are each
+/// associated with a value of type `V` and a rank. The rank is used
+/// to keep the DAG relatively balanced, which helps keep the running
+/// time of the algorithm under control. For more information, see
+/// <http://en.wikipedia.org/wiki/Disjoint-set_data_structure>.
+#[derive(PartialEq,Clone,Debug)]
+struct VarValue<K: UnifyKey> {
+    parent: K, // if equal to self, this is a root
+    value: K::Value, // value assigned (only relevant to root)
+    child: K, // if equal to self, no child (relevant to both root/redirect)
+    sibling: K, // if equal to self, no sibling (only relevant to redirect)
+    rank: u32, // max depth (only relevant to root)
+}
+
+/// Table of unification keys and their values.
+#[derive(Clone)]
+pub struct UnificationTable<K: UnifyKey> {
+    /// Indicates the current value of each key.
+    values: sv::SnapshotVec<Delegate<K>>,
+}
+
+/// At any time, users may snapshot a unification table.  The changes
+/// made during the snapshot may either be *committed* or *rolled back*.
+pub struct Snapshot<K: UnifyKey> {
+    // Link snapshot to the key type `K` of the table.
+    marker: marker::PhantomData<K>,
+    snapshot: sv::Snapshot,
+}
+
+#[derive(Copy, Clone)]
+struct Delegate<K>(PhantomData<K>);
+
+impl<K: UnifyKey> VarValue<K> {
+    fn new_var(key: K, value: K::Value) -> VarValue<K> {
+        VarValue::new(key, value, key, key, 0)
+    }
+
+    fn new(parent: K, value: K::Value, child: K, sibling: K, rank: u32) -> VarValue<K> {
+        VarValue {
+            parent: parent, // this is a root
+            value: value,
+            child: child,
+            sibling: sibling,
+            rank: rank,
+        }
+    }
+
+    fn redirect(&mut self, to: K, sibling: K) {
+        assert_eq!(self.parent, self.sibling); // ...since this used to be a root
+        self.parent = to;
+        self.sibling = sibling;
+    }
+
+    fn root(&mut self, rank: u32, child: K, value: K::Value) {
+        self.rank = rank;
+        self.child = child;
+        self.value = value;
+    }
+
+    /// Returns the key of this node. Only valid if this is a root
+    /// node, which you yourself must ensure.
+    fn key(&self) -> K {
+        self.parent
+    }
+
+    fn parent(&self, self_key: K) -> Option<K> {
+        self.if_not_self(self.parent, self_key)
+    }
+
+    fn child(&self, self_key: K) -> Option<K> {
+        self.if_not_self(self.child, self_key)
+    }
+
+    fn sibling(&self, self_key: K) -> Option<K> {
+        self.if_not_self(self.sibling, self_key)
+    }
+
+    fn if_not_self(&self, key: K, self_key: K) -> Option<K> {
+        if key == self_key {
+            None
+        } else {
+            Some(key)
+        }
+    }
+}
+
+// We can't use V:LatticeValue, much as I would like to,
+// because frequently the pattern is that V=Option<U> for some
+// other type parameter U, and we have no way to say
+// Option<U>:LatticeValue.
+
+impl<K: UnifyKey> UnificationTable<K> {
+    pub fn new() -> UnificationTable<K> {
+        UnificationTable { values: sv::SnapshotVec::new() }
+    }
+
+    /// Starts a new snapshot. Each snapshot must be either
+    /// rolled back or committed in a "LIFO" (stack) order.
+    pub fn snapshot(&mut self) -> Snapshot<K> {
+        Snapshot {
+            marker: marker::PhantomData::<K>,
+            snapshot: self.values.start_snapshot(),
+        }
+    }
+
+    /// Reverses all changes since the last snapshot. Also
+    /// removes any keys that have been created since then.
+    pub fn rollback_to(&mut self, snapshot: Snapshot<K>) {
+        debug!("{}: rollback_to()", K::tag());
+        self.values.rollback_to(snapshot.snapshot);
+    }
+
+    /// Commits all changes since the last snapshot. Of course, they
+    /// can still be undone if there is a snapshot further out.
+    pub fn commit(&mut self, snapshot: Snapshot<K>) {
+        debug!("{}: commit()", K::tag());
+        self.values.commit(snapshot.snapshot);
+    }
+
+    pub fn new_key(&mut self, value: K::Value) -> K {
+        let len = self.values.len();
+        let key: K = UnifyKey::from_index(len as u32);
+        self.values.push(VarValue::new_var(key, value));
+        debug!("{}: created new key: {:?}", K::tag(), key);
+        key
+    }
+
+    pub fn unioned_keys(&mut self, key: K) -> UnionedKeys<K> {
+        let root_key = self.get_root_key(key);
+        UnionedKeys {
+            table: self,
+            stack: vec![root_key],
+        }
+    }
+
+    fn value(&self, key: K) -> &VarValue<K> {
+        &self.values[key.index() as usize]
+    }
+
+    /// Find the root node for `vid`. This uses the standard
+    /// union-find algorithm with path compression:
+    /// <http://en.wikipedia.org/wiki/Disjoint-set_data_structure>.
+    ///
+    /// NB. This is a building-block operation and you would probably
+    /// prefer to call `probe` below.
+    fn get_root_key(&mut self, vid: K) -> K {
+        let redirect = {
+            match self.value(vid).parent(vid) {
+                None => return vid,
+                Some(redirect) => redirect,
+            }
+        };
+
+        let root_key: K = self.get_root_key(redirect);
+        if root_key != redirect {
+            // Path compression
+            self.update_value(vid, |value| value.parent = root_key);
+        }
+
+        root_key
+    }
+
+    fn is_root(&self, key: K) -> bool {
+        let index = key.index() as usize;
+        self.values.get(index).parent(key).is_none()
+    }
+
+    fn update_value<OP>(&mut self, key: K, op: OP)
+        where OP: FnOnce(&mut VarValue<K>)
+    {
+        self.values.update(key.index() as usize, op);
+        debug!("Updated variable {:?} to {:?}", key, self.value(key));
+    }
+
+    /// Either redirects `node_a` to `node_b` or vice versa, depending
+    /// on the relative rank. The value associated with the new root
+    /// will be `new_value`.
+    ///
+    /// NB: This is the "union" operation of "union-find". It is
+    /// really more of a building block. If the values associated with
+    /// your key are non-trivial, you would probably prefer to call
+    /// `unify_var_var` below.
+    fn unify_roots(&mut self, key_a: K, key_b: K, new_value: K::Value) {
+        debug!("unify(key_a={:?}, key_b={:?})",
+               key_a,
+               key_b);
+
+        let rank_a = self.value(key_a).rank;
+        let rank_b = self.value(key_b).rank;
+        if let Some((new_root, redirected)) = K::order_roots(key_a, &self.value(key_a).value,
+                                                             key_b, &self.value(key_b).value) {
+            // compute the new rank for the new root that they chose;
+            // this may not be the optimal choice.
+            let new_rank = if new_root == key_a {
+                debug_assert!(redirected == key_b);
+                if rank_a > rank_b { rank_a } else { rank_b + 1 }
+            } else {
+                debug_assert!(new_root == key_b);
+                debug_assert!(redirected == key_a);
+                if rank_b > rank_a { rank_b } else { rank_a + 1 }
+            };
+            self.redirect_root(new_rank, redirected, new_root, new_value);
+        } else if rank_a > rank_b {
+            // a has greater rank, so a should become b's parent,
+            // i.e., b should redirect to a.
+            self.redirect_root(rank_a, key_b, key_a, new_value);
+        } else if rank_a < rank_b {
+            // b has greater rank, so a should redirect to b.
+            self.redirect_root(rank_b, key_a, key_b, new_value);
+        } else {
+            // If equal, redirect one to the other and increment the
+            // other's rank.
+            self.redirect_root(rank_a + 1, key_a, key_b, new_value);
+        }
+    }
+
+    fn redirect_root(&mut self,
+                     new_rank: u32,
+                     old_root_key: K,
+                     new_root_key: K,
+                     new_value: K::Value) {
+        let sibling = self.value(new_root_key).child(new_root_key)
+                                              .unwrap_or(old_root_key);
+        self.update_value(old_root_key, |old_root_value| {
+            old_root_value.redirect(new_root_key, sibling);
+        });
+        self.update_value(new_root_key, |new_root_value| {
+            new_root_value.root(new_rank, old_root_key, new_value);
+        });
+    }
+}
+
+impl<K: UnifyKey> sv::SnapshotVecDelegate for Delegate<K> {
+    type Value = VarValue<K>;
+    type Undo = ();
+
+    fn reverse(_: &mut Vec<VarValue<K>>, _: ()) {}
+}
+
+/// ////////////////////////////////////////////////////////////////////////
+/// Iterator over keys that have been unioned together
+
+pub struct UnionedKeys<'a, K>
+    where K: UnifyKey + 'a,
+          K::Value: 'a
+{
+    table: &'a mut UnificationTable<K>,
+    stack: Vec<K>,
+}
+
+impl<'a, K> UnionedKeys<'a, K>
+    where K: UnifyKey,
+          K::Value: 'a
+{
+    fn var_value(&self, key: K) -> VarValue<K> {
+        self.table.value(key).clone()
+    }
+}
+
+impl<'a, K: 'a> Iterator for UnionedKeys<'a, K>
+    where K: UnifyKey,
+          K::Value: 'a
+{
+    type Item = K;
+
+    fn next(&mut self) -> Option<K> {
+        let key = match self.stack.last() {
+            Some(k) => *k,
+            None => {
+                return None;
+            }
+        };
+
+        let vv = self.var_value(key);
+
+        match vv.child(key) {
+            Some(child_key) => {
+                self.stack.push(child_key);
+            }
+
+            None => {
+                // No child, push a sibling for the current node.  If
+                // current node has no siblings, start popping
+                // ancestors until we find an aunt or uncle or
+                // something to push. Note that we have the invariant
+                // that for every node N that we reach by popping
+                // items off of the stack, we have already visited all
+                // children of N.
+                while let Some(ancestor_key) = self.stack.pop() {
+                    let ancestor_vv = self.var_value(ancestor_key);
+                    match ancestor_vv.sibling(ancestor_key) {
+                        Some(sibling) => {
+                            self.stack.push(sibling);
+                            break;
+                        }
+                        None => {}
+                    }
+                }
+            }
+        }
+
+        Some(key)
+    }
+}
+
+/// ////////////////////////////////////////////////////////////////////////
+/// Public API
+
+impl<'tcx, K, V> UnificationTable<K>
+    where K: UnifyKey<Value = V>,
+          V: UnifyValue,
+{
+    /// Unions two keys without the possibility of failure; only
+    /// applicable to InfallibleUnifyValue.
+    pub fn union(&mut self, a_id: K, b_id: K)
+        where V: InfallibleUnifyValue
+    {
+        self.unify_var_var(a_id, b_id).unwrap();
+    }
+
+    /// Given two keys, indicates whether they have been unioned together.
+    pub fn unioned(&mut self, a_id: K, b_id: K) -> bool {
+        self.find(a_id) == self.find(b_id)
+    }
+
+    /// Given a key, returns the (current) root key.
+    pub fn find(&mut self, id: K) -> K {
+        self.get_root_key(id)
+    }
+
+    pub fn unify_var_var(&mut self, a_id: K, b_id: K) -> Result<(), (V, V)> {
+        let root_a = self.get_root_key(a_id);
+        let root_b = self.get_root_key(b_id);
+
+        if root_a == root_b {
+            return Ok(());
+        }
+
+        let combined = try!(V::unify_values(&self.value(root_a).value, &self.value(root_b).value));
+
+        Ok(self.unify_roots(root_a, root_b, combined))
+    }
+
+    /// Sets the value of the key `a_id` to `b`, attempting to merge
+    /// with the previous value.
+    pub fn unify_var_value(&mut self, a_id: K, b: V) -> Result<(), (V, V)> {
+        let root_a = self.get_root_key(a_id);
+        let value = try!(V::unify_values(&self.value(root_a).value, &b));
+        self.update_value(root_a, |node| node.value = value);
+        Ok(())
+    }
+
+    pub fn probe_value(&mut self, id: K) -> V {
+        let id = self.get_root_key(id);
+        self.value(id).value.clone()
+    }
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+
+impl UnifyValue for () {
+    fn unify_values(_: &(), _: &()) -> Result<(), ((), ())> {
+        Ok(())
+    }
+}
+
+impl InfallibleUnifyValue for () {
+}
+
+impl<V: UnifyValue> UnifyValue for Option<V> {
+    fn unify_values(a: &Option<V>, b: &Option<V>) -> Result<Self, (Self, Self)> {
+        match (a, b) {
+            (&None, &None) => Ok(None),
+            (&Some(ref v), &None) | (&None, &Some(ref v)) => Ok(Some(v.clone())),
+            (&Some(ref a), &Some(ref b)) => {
+                match V::unify_values(a, b) {
+                    Ok(v) => Ok(Some(v)),
+                    Err((a, b)) => Err((Some(a), Some(b))),
+                }
+            }
+        }
+    }
+}
+
+impl<V: InfallibleUnifyValue> InfallibleUnifyValue for Option<V> {
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ena/src/unify/tests.rs
@@ -0,0 +1,333 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#[cfg(feature = "unstable")]
+extern crate test;
+#[cfg(feature = "unstable")]
+use self::test::Bencher;
+use std::collections::HashSet;
+use std::cmp;
+use unify::{UnifyKey, UnifyValue, UnificationTable, InfallibleUnifyValue};
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
+struct UnitKey(u32);
+
+impl UnifyKey for UnitKey {
+    type Value = ();
+    fn index(&self) -> u32 {
+        self.0
+    }
+    fn from_index(u: u32) -> UnitKey {
+        UnitKey(u)
+    }
+    fn tag() -> &'static str {
+        "UnitKey"
+    }
+}
+
+#[test]
+fn basic() {
+    let mut ut: UnificationTable<UnitKey> = UnificationTable::new();
+    let k1 = ut.new_key(());
+    let k2 = ut.new_key(());
+    assert_eq!(ut.unioned(k1, k2), false);
+    ut.union(k1, k2);
+    assert_eq!(ut.unioned(k1, k2), true);
+}
+
+#[test]
+fn big_array() {
+    let mut ut: UnificationTable<UnitKey> = UnificationTable::new();
+    let mut keys = Vec::new();
+    const MAX: usize = 1 << 15;
+
+    for _ in 0..MAX {
+        keys.push(ut.new_key(()));
+    }
+
+    for i in 1..MAX {
+        let l = keys[i - 1];
+        let r = keys[i];
+        ut.union(l, r);
+    }
+
+    for i in 0..MAX {
+        assert!(ut.unioned(keys[0], keys[i]));
+    }
+}
+
+#[cfg(feature = "unstable")]
+#[bench]
+fn big_array_bench(b: &mut Bencher) {
+    let mut ut: UnificationTable<UnitKey> = UnificationTable::new();
+    let mut keys = Vec::new();
+    const MAX: usize = 1 << 15;
+
+    for _ in 0..MAX {
+        keys.push(ut.new_key(()));
+    }
+
+    b.iter(|| {
+        for i in 1..MAX {
+            let l = keys[i - 1];
+            let r = keys[i];
+            ut.union(l, r);
+        }
+
+        for i in 0..MAX {
+            assert!(ut.unioned(keys[0], keys[i]));
+        }
+    })
+}
+
+#[test]
+fn even_odd() {
+    let mut ut: UnificationTable<UnitKey> = UnificationTable::new();
+    let mut keys = Vec::new();
+    const MAX: usize = 1 << 10;
+
+    for i in 0..MAX {
+        let key = ut.new_key(());
+        keys.push(key);
+
+        if i >= 2 {
+            ut.union(key, keys[i - 2]);
+        }
+    }
+
+    for i in 1..MAX {
+        assert!(!ut.unioned(keys[i - 1], keys[i]));
+    }
+
+    for i in 2..MAX {
+        assert!(ut.unioned(keys[i - 2], keys[i]));
+    }
+}
+
+#[test]
+fn even_odd_iter() {
+    let mut ut: UnificationTable<UnitKey> = UnificationTable::new();
+    let mut keys = Vec::new();
+    const MAX: usize = 1 << 10;
+
+    for i in 0..MAX {
+        let key = ut.new_key(());
+        keys.push(key);
+
+        if i >= 2 {
+            ut.union(key, keys[i - 2]);
+        }
+    }
+
+    let even_keys: HashSet<UnitKey> = ut.unioned_keys(keys[22]).collect();
+
+    assert_eq!(even_keys.len(), MAX / 2);
+
+    for key in even_keys {
+        assert!((key.0 & 1) == 0);
+    }
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
+struct IntKey(u32);
+
+impl UnifyKey for IntKey {
+    type Value = Option<i32>;
+    fn index(&self) -> u32 {
+        self.0
+    }
+    fn from_index(u: u32) -> IntKey {
+        IntKey(u)
+    }
+    fn tag() -> &'static str {
+        "IntKey"
+    }
+}
+
+impl UnifyValue for i32 {
+    fn unify_values(&a: &i32, &b: &i32) -> Result<Self, (Self, Self)> {
+        if a == b {
+            Ok(a)
+        } else {
+            Err((a, b))
+        }
+    }
+}
+
+#[test]
+fn unify_same_int_twice() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_value(k2, Some(22)).is_ok());
+    assert!(ut.unify_var_var(k1, k2).is_ok());
+    assert_eq!(ut.probe_value(k1), Some(22));
+}
+
+#[test]
+fn unify_vars_then_int_indirect() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_var(k1, k2).is_ok());
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert_eq!(ut.probe_value(k2), Some(22));
+}
+
+#[test]
+fn unify_vars_different_ints_1() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_var(k1, k2).is_ok());
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_value(k2, Some(23)).is_err());
+}
+
+#[test]
+fn unify_vars_different_ints_2() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_var(k2, k1).is_ok());
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_value(k2, Some(23)).is_err());
+}
+
+#[test]
+fn unify_distinct_ints_then_vars() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_value(k2, Some(23)).is_ok());
+    assert!(ut.unify_var_var(k2, k1).is_err());
+}
+
+#[test]
+fn unify_root_value_1() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    let k3 = ut.new_key(None);
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_var(k1, k2).is_ok());
+    assert!(ut.unify_var_value(k3, Some(23)).is_ok());
+    assert!(ut.unify_var_var(k1, k3).is_err());
+}
+
+#[test]
+fn unify_root_value_2() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    let k3 = ut.new_key(None);
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_var(k2, k1).is_ok());
+    assert!(ut.unify_var_value(k3, Some(23)).is_ok());
+    assert!(ut.unify_var_var(k1, k3).is_err());
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
+struct OrderedKey(u32);
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct OrderedRank(u32);
+
+impl UnifyKey for OrderedKey {
+    type Value = OrderedRank;
+    fn index(&self) -> u32 {
+        self.0
+    }
+    fn from_index(u: u32) -> OrderedKey {
+        OrderedKey(u)
+    }
+    fn tag() -> &'static str {
+        "OrderedKey"
+    }
+    fn order_roots(a: OrderedKey, a_rank: &OrderedRank,
+                   b: OrderedKey, b_rank: &OrderedRank)
+                   -> Option<(OrderedKey, OrderedKey)> {
+        println!("{:?} vs {:?}", a_rank, b_rank);
+        if a_rank > b_rank {
+            Some((a, b))
+        } else if b_rank > a_rank {
+            Some((b, a))
+        } else {
+            None
+        }
+    }
+}
+
+impl UnifyValue for OrderedRank {
+    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, (Self, Self)> {
+        Ok(OrderedRank(cmp::max(value1.0, value2.0)))
+    }
+}
+
+impl InfallibleUnifyValue for OrderedRank { }
+
+#[test]
+fn ordered_key() {
+    let mut ut: UnificationTable<OrderedKey> = UnificationTable::new();
+
+    let k0_1 = ut.new_key(OrderedRank(0));
+    let k0_2 = ut.new_key(OrderedRank(0));
+    let k0_3 = ut.new_key(OrderedRank(0));
+    let k0_4 = ut.new_key(OrderedRank(0));
+
+    ut.union(k0_1, k0_2); // rank of one of those will now be 1
+    ut.union(k0_3, k0_4); // rank of new root also 1
+    ut.union(k0_1, k0_3); // rank of new root now 2
+
+    let k0_5 = ut.new_key(OrderedRank(0));
+    let k0_6 = ut.new_key(OrderedRank(0));
+    ut.union(k0_5, k0_6); // rank of new root now 1
+
+    ut.union(k0_1, k0_5); // new root rank 2, should not be k0_5 or k0_6
+    assert!(vec![k0_1, k0_2, k0_3, k0_4].contains(&ut.find(k0_1)));
+}
+
+#[test]
+fn ordered_key_k1() {
+    let mut ut: UnificationTable<OrderedKey> = UnificationTable::new();
+
+    let k0_1 = ut.new_key(OrderedRank(0));
+    let k0_2 = ut.new_key(OrderedRank(0));
+    let k0_3 = ut.new_key(OrderedRank(0));
+    let k0_4 = ut.new_key(OrderedRank(0));
+
+    ut.union(k0_1, k0_2); // rank of one of those will now be 1
+    ut.union(k0_3, k0_4); // rank of new root also 1
+    ut.union(k0_1, k0_3); // rank of new root now 2
+
+    let k1_5 = ut.new_key(OrderedRank(1));
+    let k1_6 = ut.new_key(OrderedRank(1));
+    ut.union(k1_5, k1_6); // rank of new root now 1
+
+    ut.union(k0_1, k1_5); // even though k1 has lower rank, it wins
+    assert!(vec![k1_5, k1_6].contains(&ut.find(k0_1)),
+            "unexpected choice for root: {:?}", ut.find(k0_1));
+}
+
+/// Test that we *can* clone.
+#[test]
+fn clone_table() {
+    let mut ut: UnificationTable<IntKey> = UnificationTable::new();
+    let k1 = ut.new_key(None);
+    let k2 = ut.new_key(None);
+    assert!(ut.unify_var_value(k1, Some(22)).is_ok());
+    assert!(ut.unify_var_value(k2, Some(22)).is_ok());
+    assert!(ut.unify_var_var(k1, k2).is_ok());
+
+    let mut ut1 = ut.clone();
+    assert_eq!(ut1.probe_value(k1), Some(22));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"e474b25f03e5948a6db5b84383f043de5800a6e02a911e335d2c284480728701","Cargo.toml":"8dfde677381046100ae39607ad71be900b925a46cda77e098edaf06d94bb955f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ce592787ff2321feab698a4c612237f4378cc658ebb1d472913e5802cc47afb4","README.rst":"6d40c0a15609101185e03743f00f86c8c2778b558f184a135a1082fbeee73c0f","benches/benches.rs":"745803c7962409ba8a63635336ca5f6b971ef1dc8f46e2cdee2a8a0c6b86e9a9","src/lib.rs":"26b8c35989c1894545e3772114449e02b774bb3ffc91f421db61333a65299628","src/range.rs":"6c9fd2462e353221dcf63393a78783428995a9460de3e4c799bd00a273dda9d8"},"package":"85cb8fec437468d86dc7c83ca7cfc933341d561873275f22dd5eedefa63a6478"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/.travis.yml
@@ -0,0 +1,16 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: 1.12.0
+    - rust: stable
+    - rust: beta
+    - rust: nightly
+branches:
+  only:
+    - master
+script:
+  - |
+      cargo build --verbose &&
+      cargo test --verbose &&
+      cargo test --verbose --release
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/Cargo.toml
@@ -0,0 +1,24 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "fixedbitset"
+version = "0.1.8"
+authors = ["bluss"]
+description = "FixedBitSet is a simple bitset collection"
+documentation = "https://docs.rs/fixedbitset/"
+keywords = ["container", "data-structure", "bitvec", "bitset"]
+categories = ["data-structures"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/bluss/fixedbitset"
+[package.metadata.release]
+no-dev-version = true
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015-2017
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/README.rst
@@ -0,0 +1,75 @@
+
+fixedbitset
+===========
+
+A simple bitset container for Rust
+
+Please read the `API documentation here`__
+
+__ https://docs.rs/fixedbitset/
+
+|build_status|_ |crates|_
+
+.. |build_status| image:: https://travis-ci.org/bluss/fixedbitset.svg?branch=master
+.. _build_status: https://travis-ci.org/bluss/fixedbitset
+
+.. |crates| image:: http://meritbadge.herokuapp.com/fixedbitset
+.. _crates: https://crates.io/crates/fixedbitset
+
+Recent Changes
+--------------
+
+- 0.1.8
+
+  + Add missing ``#[inline]`` on the ones iterator
+  + Fix docs for ``insert_range, set_range``
+
+- 0.1.7
+
+  + Add fast methods ``.insert_range``, ``.set_range`` by @kennytm
+
+- 0.1.6
+
+  + Add iterator ``.ones()`` by @mneumann
+  + Fix bug with ``.count_ones()`` where it would erronously have an
+    out-of-bounds panic for even block endpoints
+
+- 0.1.5
+
+  + Add method ``.count_ones(range)``.
+
+- 0.1.4
+
+  + Remove an assertion in ``.copy_bit(from, to)`` so that it is in line
+    with the documentation. The ``from`` bit does not need to be in bounds.
+  + Improve ``.grow()`` to use ``Vec::resize`` internally.
+
+- 0.1.3
+
+  + Add method ``.put()`` to enable a bit and return previous value
+
+- 0.1.2
+
+  + Add method ``.copy_bit()`` (by fuine)
+  + impl Default
+
+- 0.1.1
+
+  + Update documentation URL
+
+- 0.1.0
+
+  + Add method ``.grow()``
+
+License
+-------
+
+Dual-licensed to be compatible with the Rust project.
+
+Licensed under the Apache License, Version 2.0
+http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
+http://opensource.org/licenses/MIT, at your
+option. This file may not be copied, modified, or distributed
+except according to those terms.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/benches/benches.rs
@@ -0,0 +1,133 @@
+#![feature(test)]
+
+extern crate test;
+extern crate fixedbitset;
+use test::Bencher;
+use fixedbitset::{FixedBitSet};
+use std::mem::size_of;
+
+#[inline]
+fn iter_ones_using_contains<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) {
+    for bit in 0 .. fb.len() {
+       if fb.contains(bit) {
+           f(bit);
+       }
+    }
+}
+
+#[inline]
+fn iter_ones_using_slice_directly<F: FnMut(usize)>(fb: &FixedBitSet, f: &mut F) {
+    for (block_idx, &block) in fb.as_slice().iter().enumerate() {
+        let mut bit_pos = block_idx * size_of::<u32>() * 8;
+        let mut block: u32 = block;
+
+        while block != 0 {
+            if (block & 1) == 1 {
+                f(bit_pos);
+            }
+            block = block >> 1;
+            bit_pos += 1;
+        }
+    }
+}
+
+#[bench]
+fn bench_iter_ones_using_contains_all_zeros(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let fb = FixedBitSet::with_capacity(N);
+
+    b.iter(|| {
+        let mut count = 0;
+        iter_ones_using_contains(&fb, &mut |_bit| count += 1);
+        count
+    });
+}
+
+#[bench]
+fn bench_iter_ones_using_contains_all_ones(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let mut fb = FixedBitSet::with_capacity(N);
+    fb.insert_range(..);
+
+    b.iter(|| {
+        let mut count = 0;
+        iter_ones_using_contains(&fb, &mut |_bit| count += 1);
+        count
+    });
+}
+
+#[bench]
+fn bench_iter_ones_using_slice_directly_all_zero(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let fb = FixedBitSet::with_capacity(N);
+
+    b.iter(|| {
+       let mut count = 0;
+       iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1);
+       count
+    });
+}
+
+#[bench]
+fn bench_iter_ones_using_slice_directly_all_ones(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let mut fb = FixedBitSet::with_capacity(N);
+    fb.insert_range(..);
+
+    b.iter(|| {
+       let mut count = 0;
+       iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1);
+       count
+    });
+}
+
+#[bench]
+fn bench_iter_ones_all_zeros(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let fb = FixedBitSet::with_capacity(N);
+
+    b.iter(|| {
+        let mut count = 0;
+        for _ in fb.ones() {
+            count += 1;
+        }
+        count
+    });
+}
+
+#[bench]
+fn bench_iter_ones_all_ones(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let mut fb = FixedBitSet::with_capacity(N);
+    fb.insert_range(..);
+
+    b.iter(|| {
+        let mut count = 0;
+        for _ in fb.ones() {
+            count += 1;
+        }
+        count
+    });
+}
+
+#[bench]
+fn bench_insert_range(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let mut fb = FixedBitSet::with_capacity(N);
+
+    b.iter(|| {
+        fb.insert_range(..)
+    });
+}
+
+#[bench]
+fn bench_insert_range_using_loop(b: &mut Bencher) {
+    const N: usize = 1_000_000;
+    let mut fb = FixedBitSet::with_capacity(N);
+
+    b.iter(|| {
+        for i in 0..N {
+            fb.insert(i);
+        }
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/src/lib.rs
@@ -0,0 +1,565 @@
+//! `FixedBitSet` is a simple fixed size set of bits.
+#![doc(html_root_url="https://docs.rs/fixedbitset/0.1/")]
+
+mod range;
+
+use std::ops::Index;
+use std::cmp::{Ord, Ordering};
+pub use range::IndexRange;
+
+static TRUE: bool = true;
+static FALSE: bool = false;
+
+const BITS: usize = 32;
+type Block = u32;
+
+#[inline]
+fn div_rem(x: usize, d: usize) -> (usize, usize)
+{
+    (x / d, x % d)
+}
+
+/// `FixedBitSet` is a simple fixed size set of bits that each can
+/// be enabled (1 / **true**) or disabled (0 / **false**).
+///
+/// The bit set has a fixed capacity in terms of enabling bits (and the
+/// capacity can grow using the `grow` method).
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
+pub struct FixedBitSet {
+    data: Vec<Block>,
+    /// length in bits
+    length: usize,
+}
+
+impl FixedBitSet
+{
+    /// Create a new **FixedBitSet** with a specific number of bits,
+    /// all initially clear.
+    pub fn with_capacity(bits: usize) -> Self
+    {
+        let (mut blocks, rem) = div_rem(bits, BITS);
+        blocks += (rem > 0) as usize;
+        FixedBitSet {
+            data: vec![0; blocks],
+            length: bits,
+        }
+    }
+    
+    /// Grow capacity to **bits**, all new bits initialized to zero
+    pub fn grow(&mut self, bits: usize) {
+        let (mut blocks, rem) = div_rem(bits, BITS);
+        blocks += (rem > 0) as usize;
+        if bits > self.length {
+            self.length = bits;
+            self.data.resize(blocks, 0);
+        }
+    }
+
+    /// Return the length of the `FixedBitSet` in bits.
+    #[inline]
+    pub fn len(&self) -> usize { self.length }
+
+    /// Return **true** if the bit is enabled in the **FixedBitSet**,
+    /// **false** otherwise.
+    ///
+    /// Note: bits outside the capacity are always disabled.
+    ///
+    /// Note: Also available with index syntax: `bitset[bit]`.
+    #[inline]
+    pub fn contains(&self, bit: usize) -> bool
+    {
+        let (block, i) = div_rem(bit, BITS);
+        match self.data.get(block) {
+            None => false,
+            Some(b) => (b & (1 << i)) != 0,
+        }
+    }
+
+    /// Clear all bits.
+    #[inline]
+    pub fn clear(&mut self)
+    {
+        for elt in &mut self.data[..] {
+            *elt = 0
+        }
+    }
+
+    /// Enable `bit`.
+    ///
+    /// **Panics** if **bit** is out of bounds.
+    #[inline]
+    pub fn insert(&mut self, bit: usize)
+    {
+        assert!(bit < self.length);
+        let (block, i) = div_rem(bit, BITS);
+        unsafe {
+            *self.data.get_unchecked_mut(block) |= 1 << i;
+        }
+    }
+
+    /// Enable `bit`, and return its previous value.
+    ///
+    /// **Panics** if **bit** is out of bounds.
+    #[inline]
+    pub fn put(&mut self, bit: usize) -> bool
+    {
+        assert!(bit < self.length);
+        let (block, i) = div_rem(bit, BITS);
+        unsafe {
+            let word = self.data.get_unchecked_mut(block);
+            let prev = *word & (1 << i) != 0;
+            *word |= 1 << i;
+            prev
+        }
+    }
+
+    /// **Panics** if **bit** is out of bounds.
+    #[inline]
+    pub fn set(&mut self, bit: usize, enabled: bool)
+    {
+        assert!(bit < self.length);
+        let (block, i) = div_rem(bit, BITS);
+        unsafe {
+            let elt = self.data.get_unchecked_mut(block);
+            if enabled {
+                *elt |= 1 << i;
+            } else {
+                *elt &= !(1 << i);
+            }
+        }
+    }
+
+    /// Copies boolean value from specified bit to the specified bit.
+    ///
+    /// **Panics** if **to** is out of bounds.
+    #[inline]
+    pub fn copy_bit(&mut self, from: usize, to: usize)
+    {
+        assert!(to < self.length);
+        let (to_block, t) = div_rem(to, BITS);
+        let enabled = self.contains(from);
+        unsafe {
+            let to_elt = self.data.get_unchecked_mut(to_block);
+            if enabled {
+                *to_elt |= 1 << t;
+            } else {
+                *to_elt &= !(1 << t);
+            }
+        }
+    }
+
+    /// Count the number of set bits in the given bit range.
+    ///
+    /// Use `..` to count the whole content of the bitset.
+    ///
+    /// **Panics** if the range extends past the end of the bitset.
+    #[inline]
+    pub fn count_ones<T: IndexRange>(&self, range: T) -> usize
+    {
+        Masks::new(range, self.length)
+            .map(|(block, mask)| unsafe {
+                let value = *self.data.get_unchecked(block);
+                (value & mask).count_ones() as usize
+            })
+            .sum()
+    }
+
+    /// Sets every bit in the given range to the given state (`enabled`)
+    ///
+    /// Use `..` to toggle the whole bitset.
+    ///
+    /// **Panics** if the range extends past the end of the bitset.
+    #[inline]
+    pub fn set_range<T: IndexRange>(&mut self, range: T, enabled: bool)
+    {
+        for (block, mask) in Masks::new(range, self.length) {
+            unsafe {
+                if enabled {
+                    *self.data.get_unchecked_mut(block) |= mask;
+                } else {
+                    *self.data.get_unchecked_mut(block) &= !mask;
+                }
+            }
+        }
+    }
+
+    /// Enables every bit in the given range.
+    ///
+    /// Use `..` to make the whole bitset ones.
+    ///
+    /// **Panics** if the range extends past the end of the bitset.
+    #[inline]
+    pub fn insert_range<T: IndexRange>(&mut self, range: T)
+    {
+        self.set_range(range, true);
+    }
+
+    /// View the bitset as a slice of `u32` blocks
+    #[inline]
+    pub fn as_slice(&self) -> &[u32]
+    {
+        &self.data
+    }
+
+    /// View the bitset as a mutable slice of `u32` blocks. Writing past the bitlength in the last
+    /// will cause `contains` to return potentially incorrect results for bits past the bitlength.
+    #[inline]
+    pub fn as_mut_slice(&mut self) -> &mut [u32]
+    {
+        &mut self.data
+    }
+
+    /// Iterates over all enabled bits.
+    ///
+    /// Iterator element is the index of the `1` bit, type `usize`.
+    #[inline]
+    pub fn ones(&self) -> Ones {
+        match self.as_slice().split_first() {
+            Some((&block, rem)) => {
+                Ones {
+                    current_bit_idx: 0,
+                    current_block_idx: 0,
+                    current_block: block,
+                    remaining_blocks: rem
+                }
+            }
+            None => {
+                Ones {
+                    current_bit_idx: 0,
+                    current_block_idx: 0,
+                    current_block: 0,
+                    remaining_blocks: &[]
+                }
+            }
+        }
+    }
+}
+
+struct Masks {
+    first_block: usize,
+    first_mask: Block,
+    last_block: usize,
+    last_mask: Block,
+}
+
+impl Masks {
+    #[inline]
+    fn new<T: IndexRange>(range: T, length: usize) -> Masks {
+        let start = range.start().unwrap_or(0);
+        let end = range.end().unwrap_or(length);
+        assert!(start <= end && end <= length);
+
+        let (first_block, first_rem) = div_rem(start, BITS);
+        let (last_block, last_rem) = div_rem(end, BITS);
+
+        Masks {
+            first_block: first_block as usize,
+            first_mask: Block::max_value() << first_rem,
+            last_block: last_block as usize,
+            last_mask: (Block::max_value() >> 1) >> (BITS - last_rem - 1),
+            // this is equivalent to `MAX >> (BITS - x)` with correct semantics when x == 0.
+        }
+    }
+}
+
+impl Iterator for Masks {
+    type Item = (usize, Block);
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        match self.first_block.cmp(&self.last_block) {
+            Ordering::Less => {
+                let res = (self.first_block, self.first_mask);
+                self.first_block += 1;
+                self.first_mask = !0;
+                Some(res)
+            }
+            Ordering::Equal => {
+                let mask = self.first_mask & self.last_mask;
+                let res = if mask == 0 {
+                    None
+                } else {
+                    Some((self.first_block, mask))
+                };
+                self.first_block += 1;
+                res
+            }
+            Ordering::Greater => None,
+        }
+    }
+}
+
+
+pub struct Ones<'a> {
+    current_bit_idx: usize,
+    current_block_idx: usize,
+    remaining_blocks: &'a [Block],
+    current_block: Block
+}
+
+impl<'a> Iterator for Ones<'a> {
+    type Item = usize; // the bit position of the '1'
+
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        let mut block = self.current_block;
+        let mut idx = self.current_bit_idx;
+
+        loop {
+            loop {
+                if (block & 1) == 1 {
+                    self.current_block = block >> 1;
+                    self.current_bit_idx = idx + 1;
+                    return Some(idx);
+                }
+                // reordering the two lines below makes a huge (2x) difference in performance!
+                block = block >> 1;
+                idx += 1;
+                if block == 0 {
+                    break;
+                }
+            }
+
+            // go to next block
+            match self.remaining_blocks.split_first() {
+                Some((&next_block, rest)) => {
+                    self.remaining_blocks = rest;
+                    self.current_block_idx += 1;
+                    idx = self.current_block_idx * BITS;
+                    block = next_block;
+                }
+                None => {
+                    // last block => done
+                    return None;
+                }
+            }
+        }
+    }
+}
+
+impl Clone for FixedBitSet
+{
+    #[inline]
+    fn clone(&self) -> Self
+    {
+        FixedBitSet {
+            data: self.data.clone(),
+            length: self.length,
+        }
+    }
+}
+
+/// Return **true** if the bit is enabled in the bitset,
+/// or **false** otherwise.
+///
+/// Note: bits outside the capacity are always disabled, and thus
+/// indexing a FixedBitSet will not panic.
+impl Index<usize> for FixedBitSet
+{
+    type Output = bool;
+
+    #[inline]
+    fn index(&self, bit: usize) -> &bool
+    {
+        if self.contains(bit) {
+            &TRUE
+        } else {
+            &FALSE
+        }
+    }
+}
+
+#[test]
+fn it_works() {
+    const N: usize = 50;
+    let mut fb = FixedBitSet::with_capacity(N);
+    println!("{:?}", fb);
+
+    for i in 0..(N + 10) {
+        assert_eq!(fb.contains(i), false);
+    }
+
+    fb.insert(10);
+    fb.set(11, false);
+    fb.set(12, false);
+    fb.set(12, true);
+    fb.set(N-1, true);
+    println!("{:?}", fb);
+    assert!(fb.contains(10));
+    assert!(!fb.contains(11));
+    assert!(fb.contains(12));
+    assert!(fb.contains(N-1));
+    for i in 0..N {
+        let contain = i == 10 || i == 12 || i == N - 1;
+        assert_eq!(contain, fb[i]);
+    }
+
+    fb.clear();
+}
+
+#[test]
+fn grow() {
+    let mut fb = FixedBitSet::with_capacity(48);
+    for i in 0..fb.len() {
+        fb.set(i, true);
+    }
+
+    let old_len = fb.len();
+    fb.grow(72);
+    for j in 0..fb.len() {
+        assert_eq!(fb.contains(j), j < old_len);
+    }
+    fb.set(64, true);
+    assert!(fb.contains(64));
+}
+
+#[test]
+fn copy_bit() {
+    let mut fb = FixedBitSet::with_capacity(48);
+    for i in 0..fb.len() {
+        fb.set(i, true);
+    }
+    fb.set(42, false);
+    fb.copy_bit(42, 2);
+    assert!(!fb.contains(42));
+    assert!(!fb.contains(2));
+    assert!(fb.contains(1));
+    fb.copy_bit(1, 42);
+    assert!(fb.contains(42));
+    fb.copy_bit(1024, 42);
+    assert!(!fb[42]);
+}
+
+#[test]
+fn count_ones() {
+    let mut fb = FixedBitSet::with_capacity(100);
+    fb.set(11, true);
+    fb.set(12, true);
+    fb.set(7, true);
+    fb.set(35, true);
+    fb.set(40, true);
+    fb.set(77, true);
+    fb.set(95, true);
+    fb.set(50, true);
+    fb.set(99, true);
+    assert_eq!(fb.count_ones(..7), 0);
+    assert_eq!(fb.count_ones(..8), 1);
+    assert_eq!(fb.count_ones(..11), 1);
+    assert_eq!(fb.count_ones(..12), 2);
+    assert_eq!(fb.count_ones(..13), 3);
+    assert_eq!(fb.count_ones(..35), 3);
+    assert_eq!(fb.count_ones(..36), 4);
+    assert_eq!(fb.count_ones(..40), 4);
+    assert_eq!(fb.count_ones(..41), 5);
+    assert_eq!(fb.count_ones(50..), 4);
+    assert_eq!(fb.count_ones(70..95), 1);
+    assert_eq!(fb.count_ones(70..96), 2);
+    assert_eq!(fb.count_ones(70..99), 2);
+    assert_eq!(fb.count_ones(..), 9);
+    assert_eq!(fb.count_ones(0..100), 9);
+    assert_eq!(fb.count_ones(0..0), 0);
+    assert_eq!(fb.count_ones(100..100), 0);
+    assert_eq!(fb.count_ones(7..), 9);
+    assert_eq!(fb.count_ones(8..), 8);
+}
+
+#[test]
+fn ones() {
+    let mut fb = FixedBitSet::with_capacity(100);
+    fb.set(11, true);
+    fb.set(12, true);
+    fb.set(7, true);
+    fb.set(35, true);
+    fb.set(40, true);
+    fb.set(77, true);
+    fb.set(95, true);
+    fb.set(50, true);
+    fb.set(99, true);
+
+    let ones: Vec<_> = fb.ones().collect();
+
+    assert_eq!(vec![7, 11, 12, 35, 40, 50, 77, 95, 99], ones);
+}
+
+#[test]
+fn iter_ones_range() {
+    fn test_range(from: usize, to: usize, capa: usize) {
+        assert!(to <= capa);
+        let mut fb = FixedBitSet::with_capacity(capa);
+        for i in from..to {
+            fb.insert(i);
+        }
+        let ones: Vec<_> = fb.ones().collect();
+        let expected: Vec<_> = (from..to).collect();
+        assert_eq!(expected, ones);
+    }
+
+    for i in 0..100 {
+      test_range(i, 100, 100);
+      test_range(0, i, 100);
+    }
+}
+
+#[should_panic]
+#[test]
+fn count_ones_oob() {
+    let fb = FixedBitSet::with_capacity(100);
+    fb.count_ones(90..101);
+}
+
+#[should_panic]
+#[test]
+fn count_ones_negative_range() {
+    let fb = FixedBitSet::with_capacity(100);
+    fb.count_ones(90..80);
+}
+
+#[test]
+fn count_ones_panic() {
+    for i in 1..128 {
+        let fb = FixedBitSet::with_capacity(i);
+        for j in 0..fb.len() + 1 {
+            for k in j..fb.len() + 1 {
+                assert_eq!(fb.count_ones(j..k), 0);
+            }
+        }
+    }
+}
+
+
+#[test]
+fn default() {
+    let fb = FixedBitSet::default();
+    assert_eq!(fb.len(), 0);
+}
+
+#[test]
+fn insert_range() {
+    let mut fb = FixedBitSet::with_capacity(97);
+    fb.insert_range(..3);
+    fb.insert_range(9..32);
+    fb.insert_range(37..81);
+    fb.insert_range(90..);
+    for i in 0..97 {
+        assert_eq!(fb.contains(i), i<3 || 9<=i&&i<32 || 37<=i&&i<81 || 90<=i);
+    }
+    assert!(!fb.contains(97));
+    assert!(!fb.contains(127));
+    assert!(!fb.contains(128));
+}
+
+#[test]
+fn set_range() {
+    let mut fb = FixedBitSet::with_capacity(48);
+    fb.insert_range(..);
+
+    fb.set_range(..32, false);
+    fb.set_range(37.., false);
+    fb.set_range(5..9, true);
+    fb.set_range(40..40, true);
+
+    for i in 0..48 {
+        assert_eq!(fb.contains(i), 5<=i&&i<9 || 32<=i&&i<37);
+    }
+    assert!(!fb.contains(48));
+    assert!(!fb.contains(64));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/fixedbitset/src/range.rs
@@ -0,0 +1,39 @@
+use std::ops::{
+    RangeFull,
+    RangeFrom,
+    RangeTo,
+    Range,
+};
+
+// Taken from https://github.com/bluss/odds/blob/master/src/range.rs.
+
+/// **IndexRange** is implemented by Rust's built-in range types, produced
+/// by range syntax like `..`, `a..`, `..b` or `c..d`.
+pub trait IndexRange<T=usize> {
+    #[inline]
+    /// Start index (inclusive)
+    fn start(&self) -> Option<T> { None }
+    #[inline]
+    /// End index (exclusive)
+    fn end(&self) -> Option<T> { None }
+}
+
+
+impl<T> IndexRange<T> for RangeFull {}
+
+impl<T: Copy> IndexRange<T> for RangeFrom<T> {
+    #[inline]
+    fn start(&self) -> Option<T> { Some(self.start) }
+}
+
+impl<T: Copy> IndexRange<T> for RangeTo<T> {
+    #[inline]
+    fn end(&self) -> Option<T> { Some(self.end) }
+}
+
+impl<T: Copy> IndexRange<T> for Range<T> {
+    #[inline]
+    fn start(&self) -> Option<T> { Some(self.start) }
+    #[inline]
+    fn end(&self) -> Option<T> { Some(self.end) }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"bf38c750b27b6e5a61894b904951f581db1e38b8ab13f9b658d0cbf93fe5274a","Cargo.toml":"a9110e72ddc1ad03c0d7f1045039b08a6d12136db46936a8d09eab6d4b6153b8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","Makefile":"13f1c5b88a7b946b5813f7231df2933b6b19b223e9e2d3fa63ad681192f984b5","README.rst":"b333982845acfe7eacdbf5d3d6da866ffc0cd9d60e857c8b1d4d2f59532b2b3e","benches/bench1.rs":"c8fa84d18c891cbccb9df0b40fe1c69b0aa6b303e84d5a3093c94699e0532ae3","benches/extra/mod.rs":"4c5b03e74fc5b02383500c9da9fd6550262706ee569d70d085700f6d0b5749ba","benches/extra/zipslices.rs":"108dd488de366b2d83fb6bcc603ecbf9a017e165ac19d03440074fa244af3fb2","benches/tuple_combinations.rs":"8c14e9341d92e5cfd5f9a067d11088b37b003e82635d1ab3a8e5290e3ef83eed","benches/tuples.rs":"412a952f08bb03695952d5cfd57949dcf28be8b99e3c6653994bdb8af9654653","custom.css":"03d2316d325a09f03f0fae54d24b64f784518a8249432edbd60e01436be900d5","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"3996ca0a62762aec2b102f0f4244fe90d4b4354286d68d80cdc40e35f4352ba3","src/adaptors/mod.rs":"5918eb5e3bfff6d93361001004ce628092c19818e2b645d8ab44e06fea34f8b5","src/adaptors/multipeek.rs":"2b2f3b796b5664e3561a9ffabd16ea2971020cea13e1fb2ce5fd6e995934b4ab","src/concat_impl.rs":"276339b00588f54c25f8ffbe0ae3c0031f7e52fb53c6578554a0bde1681b58a5","src/cons_tuples_impl.rs":"1ccd5c024e9b5a9b2caa477671e18d6cbae530fcca114742f02b8b05b0ac353e","src/diff.rs":"921e2b867d7b32ffedc72a5eb780811322d14d1e0883a608b9028a2afcad0df2","src/format.rs":"412fbe02f12311c6fbcec1044f57ad6991783f5a3f323b9c391accfe4915106f","src/free.rs":"2c3e853dda297f4227cd7ecd37402a99c36169884ffbdfe823d296b0c8d16d33","src/groupbylazy.rs":"36a0f72232dbe54dfede33ea6d5740a648edc15ac4044b4f6492cac9946030ed","src/impl_macros.rs":"eb0bb3f70ec1bcaffa6110ae4134c777951ed1e5f48d8c811dbf0a597dc48faa","src/intersperse.rs":"8338a5b61ff5d2eb306ef7142578406f3ae4e4c7b2a8adcaa293a07c2299735b","src/kmerge_impl.rs":"e7902ccf6b811417e4dd9314964944beb08c2908e76396ff977227a7a350a16f","src/lib.rs":"385b2f3b8308f7a7c2b0de2eb29202c1b7f510edf450869b69e96903ac11e2ad","src/minmax.rs":"4668a7f824fbc133599f43ffb6f7283e5bd603e07df2d8176abc6f25d6af9db0","src/pad_tail.rs":"3a2b2f7fd38cac690eab3e1fa00e4f87df9fbf0bf87c7b3d68359d0c9b9f7f61","src/peeking_take_while.rs":"5d06552aa630217ab86fd4d191e2aaaf523e5320fc796e2f9d7f89f6230ade79","src/process_results_impl.rs":"bab4884ca7e472302484be9f2ffea1b3b79f08a84b40a41c280f1e5bbf1048b4","src/rciter_impl.rs":"449262cb5c2d1e9affe0b4020f1c28aa316a3718afe094667b79bbff1557d5e6","src/repeatn.rs":"ddcfdf0e0f6a4bc59f1f0fdba65d9ca09e1dfe10edb05ed7f6da486e904ffd3d","src/size_hint.rs":"c1d35b422a696cf3d63e7c90d8f9fdf01a304cf8156e914287c4ef48fea62dd3","src/sources.rs":"e1b644fc5ab2d09decbf0a547cff3953b4f195df28c2febb3f3fed2ec8401d46","src/tee.rs":"86b1da0697360091ae5de53a64cd8efb927b88c41c7fff5dec5814702c5bac31","src/tuple_impl.rs":"eb312789ea532cbfd31acabbcf7b4745b9935ff0b08e75f8e8c29445e558ea4d","src/with_position.rs":"8af04f26d9b89a2597fc10ad52c0feb61cb852dbf988b93d397f3300a6e70965","src/zip_eq_impl.rs":"95e493deeadd640751f5c49f55008bd31218978f38396967bc4a356f6f11d209","src/zip_longest.rs":"e463c58d5feebe5a0ed7964705ffedc6ec9a89ca2567a374cc8ceaf206249d5a","src/ziptuple.rs":"463f102add23ffa0702ec5ef110aae6c132267151fad66566b724fff7ebfa458","tests/peeking_take_while.rs":"a2ae6474e09620a47bb8a6e3c62929261e72c52881370adb2d22e89aa9e9aec8","tests/quick.rs":"e5f35e0d6b35b2b5df71e1e64299018a234c1ffbf0e38a6a541249810cef6402","tests/tests.rs":"adc905de07ec04dbbbd774891fde269407184a6b2c986d8ec5b0b466a2b36f79","tests/tuples.rs":"f8c8892c3c44dde0910eaf26f1756ddc62e264498245e5b0070a6912dc8c101c","tests/zip.rs":"fe213d70c4fa114cb4d1930a6b971f4af617a239041ddb87e6b5a9bbe62261b8"},"package":"d3f2be4da1690a039e9ae5fd575f706a63ad5a2120f161b1d653c9da3930dd21"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/.travis.yml
@@ -0,0 +1,18 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: 1.12.0
+    - rust: stable
+    - rust: beta
+    - rust: nightly
+      env:
+       - BENCH=1
+branches:
+  only:
+    - master
+script:
+  - |
+      cargo build --verbose --features "$FEATURES" &&
+      cargo test --verbose --features "$FEATURES" &&
+      ([ "$BENCH" != 1 ] || cargo bench --verbose --features "$FEATURES")
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/Cargo.toml
@@ -0,0 +1,41 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "itertools"
+version = "0.6.5"
+authors = ["bluss"]
+description = "Extra iterator adaptors, iterator methods, free functions, and macros."
+documentation = "https://docs.rs/itertools/"
+keywords = ["iterator", "data-structure", "zip", "product", "group-by"]
+categories = ["algorithms", "rust-patterns"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/bluss/rust-itertools"
+[package.metadata.release]
+no-dev-version = true
+[profile.bench]
+debug = true
+
+[lib]
+test = false
+bench = false
+[dependencies.either]
+version = "1.0"
+default-features = false
+[dev-dependencies.permutohedron]
+version = "0.2"
+
+[dev-dependencies.quickcheck]
+version = "0.4"
+default-features = false
+
+[features]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/Makefile
@@ -0,0 +1,34 @@
+DOCCRATES = itertools
+
+# deps to delete the generated docs
+RMDOCS =
+
+FEATURES =
+
+VERSIONS = $(patsubst %,target/VERS/%,$(DOCCRATES))
+
+docs: mkdocs subst $(RMDOCS)
+
+# https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
+$(VERSIONS): Cargo.toml
+	mkdir -p $(@D)
+	cargo pkgid $(@F) | sed -e "s/.*#\(\|.*:\)//" > "$@"
+
+$(DOCCRATES): %: target/VERS/%
+	# Put in the crate version into the docs
+	find ./doc/$@ -name "*.html" -exec sed -i -e "s/<title>\(.*\) - Rust/<title>$@ $(shell cat $<) - \1 - Rust/g" {} \;
+
+subst: $(DOCCRATES)
+
+mkdocs: Cargo.toml
+	cargo doc --features=$(FEATURES) --no-deps
+	rm -rf ./doc
+	cp -r ./target/doc ./doc
+	- cat ./custom.css >> doc/main.css
+
+$(RMDOCS): mkdocs
+	rm -r ./doc/$@
+	sed -i "/searchIndex\['$@'\]/d" doc/search-index.js
+
+
+.PHONY: docs mkdocs subst $(DOCCRATES) $(RMDOCS)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/README.rst
@@ -0,0 +1,415 @@
+
+Itertools
+=========
+
+Extra iterator adaptors, functions and macros.
+
+Please read the `API documentation here`__
+
+__ https://docs.rs/itertools/
+
+|build_status|_ |crates|_
+
+.. |build_status| image:: https://travis-ci.org/bluss/rust-itertools.svg?branch=master
+.. _build_status: https://travis-ci.org/bluss/rust-itertools
+
+.. |crates| image:: http://meritbadge.herokuapp.com/itertools
+.. _crates: https://crates.io/crates/itertools
+
+How to use with cargo:
+
+.. code:: toml
+
+    [dependencies]
+    itertools = "0.6.3"
+
+How to use in your crate:
+
+.. code:: rust
+
+    #[macro_use] extern crate itertools;
+
+    use itertools::Itertools;
+
+How to contribute:
+
+- Fix a bug or implement a new thing
+- Include tests for your new feature, preferably a quickcheck test
+- Make a Pull Request
+
+
+Recent Changes
+--------------
+
+- 0.6.5
+
+  - Fix bug in ``.cartesian_product()``'s fold (which only was visible for
+    unfused iterators).
+
+- 0.6.4
+
+  - Add specific ``fold`` implementations for ``.cartesian_product()`` and
+    ``cons_tuples()``, which improves their performance in fold, foreach, and
+    iterator consumers derived from them.
+
+- 0.6.3
+
+  - Add iterator adaptor ``.positions(predicate)`` by @tmccombs
+
+- 0.6.2
+
+  - Add function ``process_results`` which can “lift” a function of the regular
+    values of an iterator so that it can process the ``Ok`` values from an
+    iterator of ``Results`` instead, by @shepmaster
+  - Add iterator method ``.concat()`` which combines all iterator elements
+    into a single collection using the ``Extend`` trait, by @srijs
+
+- 0.6.1
+
+  - Better size hint testing and subsequent size hint bugfixes by @rkarp.
+    Fixes bugs in product, interleave_shortest size hints.
+  - New iterator method ``.all_equal()`` by @phimuemue
+
+- 0.6.0
+
+  - Deprecated names were removed in favour of their replacements
+  - ``.flatten()`` does not implement double ended iteration anymore
+  - ``.fold_while()`` uses ``&mut self`` and returns ``FoldWhile<T>``, for
+    composability (#168)
+  - ``.foreach()`` and ``.fold1()`` use ``self``, like ``.fold()`` does.
+  - ``.combinations(0)`` now produces a single empty vector. (#174)
+
+- 0.5.10
+
+  - Add itertools method ``.kmerge_by()`` (and corresponding free function)
+  - Relaxed trait requirement of ``.kmerge()`` and ``.minmax()`` to PartialOrd.
+
+- 0.5.9
+
+  - Add multipeek method ``.reset_peek()``
+  - Add categories
+
+- 0.5.8
+
+  - Add iterator adaptor ``.peeking_take_while()`` and its trait ``PeekingNext``.
+
+- 0.5.7
+
+  - Add iterator adaptor ``.with_position()``
+  - Fix multipeek's performance for long peeks by using ``VecDeque``.
+
+- 0.5.6
+
+  - Add ``.map_results()``
+
+- 0.5.5
+
+  - Many more adaptors now implement ``Debug``
+  - Add free function constructor ``repeat_n``. ``RepeatN::new`` is now
+    deprecated.
+
+- 0.5.4
+
+  - Add infinite generator function ``iterate``, that takes a seed and a
+    closure.
+
+- 0.5.3
+
+  - Special-cased ``.fold()`` for flatten and put back. ``.foreach()``
+    now uses fold on the iterator, to pick up any iterator specific loop
+    implementation.
+  - ``.combinations(n)`` asserts up front that ``n != 0``, instead of
+    running into an error on the second iterator element.
+
+- 0.5.2
+
+  - Add ``.tuples::<T>()`` that iterates by two, three or four elements at
+    a time (where ``T`` is a tuple type).
+  - Add ``.tuple_windows::<T>()`` that iterates using a window of the
+    two, three or four most recent elements.
+  - Add ``.next_tuple::<T>()`` method, that picks the next two, three or four
+    elements in one go.
+  - ``.interleave()`` now has an accurate size hint.
+
+- 0.5.1
+
+  - Workaround module/function name clash that made racer crash on completing
+    itertools. Only internal changes needed.
+
+- 0.5.0
+
+  - `Release announcement <http://bluss.github.io/rust/2016/09/26/itertools-0.5.0/>`_
+  - Renamed:
+
+    - combinations is now tuple_combinations
+    - combinations_n to combinations
+    - group_by_lazy, chunks_lazy to group_by, chunks
+    - Unfold::new to unfold()
+    - RepeatCall::new to repeat_call()
+    - Zip::new to multizip
+    - PutBack::new, PutBackN::new to put_back, put_back_n
+    - PutBack::with_value is now a builder setter, not a constructor
+    - MultiPeek::new, .multipeek() to multipeek()
+    - format to format_with and format_default to format
+    - .into_rc() to rciter
+    - ``Partition`` enum is now ``Either``
+
+  - Module reorganization:
+
+    - All iterator structs are under ``itertools::structs`` but also
+      reexported to the top level, for backwards compatibility
+    - All free functions are reexported at the root, ``itertools::free`` will
+      be removed in the next version
+
+  - Removed:
+
+    - ZipSlices, use .zip() instead
+    - .enumerate_from(), ZipTrusted, due to being unstable
+    - .mend_slices(), moved to crate odds
+    - Stride, StrideMut, moved to crate odds
+    - linspace(), moved to crate itertools-num
+    - .sort_by(), use .sorted_by()
+    - .is_empty_hint(), use .size_hint()
+    - .dropn(), use .dropping()
+    - .map_fn(), use .map()
+    - .slice(), use .take() / .skip()
+    - helper traits in misc
+    - ``new`` constructors on iterator structs, use Itertools trait or free
+      functions instead
+    - ``itertools::size_hint`` is now private
+
+  - Behaviour changes:
+
+    - format and format_with helpers now panic if you try to format them more
+      than once.
+    - ``repeat_call`` is not double ended anymore
+
+  - New features:
+
+    - tuple flattening iterator is constructible with ``cons_tuples``
+    - itertools reexports ``Either`` from the ``either`` crate. ``Either<L, R>``
+      is an iterator when ``L, R`` are.
+    - ``MinMaxResult`` now implements Copy and Clone
+    - tuple_combinations supports 1-4 tuples of combinations (previously just 2)
+
+- 0.4.19
+
+  - Add ``.minmax_by()``
+  - Add ``itertools::free::cloned``
+  - Add ``itertools::free::rciter``
+  - Improve ``.step(n)`` slightly to take advantage of specialized Fuse better.
+
+- 0.4.18
+
+  - Only changes related to the "unstable" crate feature. This feature is more
+    or less deprecated.
+
+    - Use deprecated warnings when unstable is enabled. .enumerate_from() will
+      be removed imminently since it's using a deprecated libstd trait.
+
+- 0.4.17
+
+  - Fix bug in .kmerge() that caused it to often produce the wrong order (#134)
+
+- 0.4.16
+
+  - Improve precision of the interleave_shortest adaptor's size hint (it is
+    now computed exactly when possible).
+
+- 0.4.15
+
+  - Fixup on top of the workaround in 0.4.14. A function in itertools::free was
+    removed by mistake and now it is added back again.
+
+- 0.4.14
+
+  - Workaround an upstream regression in a rust nightly build that broke
+    compilation of of itertools::free::{interleave, merge}
+
+- 0.4.13
+
+  - Add .minmax() and .minmax_by_key(), iterator methods for finding both minimum
+    and maximum in one scan.
+  - Add .format_default(), a simpler version of .format() (lazy formatting
+    for iterators).
+
+- 0.4.12
+
+  - Add .zip_eq(), an adaptor like .zip() except it ensures iterators
+    of inequal length don't pass silently (instead it panics).
+  - Add .fold_while(), an iterator method that is a fold that
+    can short-circuit.
+  - Add .partition_map(), an iterator method that can separate elements
+    into two collections.
+
+- 0.4.11
+
+  - Add .get() for Stride{,Mut} and .get_mut() for StrideMut
+
+- 0.4.10
+
+  - Improve performance of .kmerge()
+
+- 0.4.9
+
+  - Add k-ary merge adaptor .kmerge()
+  - Fix a bug in .islice() with ranges a..b where a > b.
+
+- 0.4.8
+
+  - Implement Clone, Debug for Linspace
+
+- 0.4.7
+
+  - Add function diff_with() that compares two iterators
+  - Add .combinations_n(), an n-ary combinations iterator
+  - Add methods PutBack::with_value and PutBack::into_parts.
+
+- 0.4.6
+
+  - Add method .sorted()
+  - Add module ``itertools::free`` with free function variants of common
+    iterator adaptors and methods.
+    For example ``enumerate(iterable)``, ``rev(iterable)``, and so on.
+
+- 0.4.5
+
+  - Add .flatten()
+
+- 0.4.4
+
+  - Allow composing ZipSlices with itself
+
+- 0.4.3
+
+  - Write iproduct!() as a single expression; this allows temporary values
+    in its arguments.
+
+- 0.4.2
+
+  - Add .fold_options()
+  - Require Rust 1.1 or later
+
+- 0.4.1
+
+  - Update .dropping() to take advantage of .nth()
+
+- 0.4.0
+
+  - .merge(), .unique() and .dedup() now perform better due to not using
+    function pointers
+  - Add free functions enumerate() and rev()
+  - Breaking changes:
+
+    - Return types of .merge() and .merge_by() renamed and changed
+    - Method Merge::new removed
+    - .merge_by() now takes a closure that returns bool.
+    - Return type of .dedup() changed
+    - Return type of .mend_slices() changed
+    - Return type of .unique() changed
+    - Removed function times(), struct Times: use a range instead
+    - Removed deprecated macro icompr!()
+    - Removed deprecated FnMap and method .fn_map(): use .map_fn()
+    - .interleave_shortest() is no longer guaranteed to act like fused
+
+- 0.3.25
+
+  - Rename .sort_by() to .sorted_by(). Old name is deprecated.
+  - Fix well-formedness warnings from RFC 1214, no user visible impact
+
+- 0.3.24
+
+  - Improve performance of .merge()'s ordering function slightly
+
+- 0.3.23
+
+  - Added .chunks(), similar to (and based on) .group_by_lazy().
+  - Tweak linspace to match numpy.linspace and make it double ended.
+
+- 0.3.22
+
+  - Added ZipSlices, a fast zip for slices
+
+- 0.3.21
+
+  - Remove `Debug` impl for `Format`, it will have different use later
+
+- 0.3.20
+
+  - Optimize .group_by_lazy()
+
+- 0.3.19
+
+  - Added .group_by_lazy(), a possibly nonallocating group by
+  - Added .format(), a nonallocating formatting helper for iterators
+  - Remove uses of RandomAccessIterator since it has been deprecated in rust.
+
+- 0.3.17
+
+  - Added (adopted) Unfold from rust
+
+- 0.3.16
+
+  - Added adaptors .unique(), .unique_by()
+
+- 0.3.15
+
+  - Added method .sort_by()
+
+- 0.3.14
+
+  - Added adaptor .while_some()
+
+- 0.3.13
+
+  - Added adaptor .interleave_shortest()
+  - Added adaptor .pad_using()
+
+- 0.3.11
+
+  - Added assert_equal function
+
+- 0.3.10
+
+  - Bugfix .combinations() size_hint.
+
+- 0.3.8
+
+  - Added source RepeatCall
+
+- 0.3.7
+
+  - Added adaptor PutBackN
+  - Added adaptor .combinations()
+
+- 0.3.6
+
+  - Added itertools::partition, partition a sequence in place based on a predicate.
+  - Deprecate icompr!() with no replacement.
+
+- 0.3.5
+
+  - .map_fn() replaces deprecated .fn_map().
+
+- 0.3.4
+
+  - .take_while_ref() *by-ref adaptor*
+  - .coalesce() *adaptor*
+  - .mend_slices() *adaptor*
+
+- 0.3.3
+
+  - .dropping_back() *method*
+  - .fold1() *method*
+  - .is_empty_hint() *method*
+
+License
+-------
+
+Dual-licensed to be compatible with the Rust project.
+
+Licensed under the Apache License, Version 2.0
+http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
+http://opensource.org/licenses/MIT, at your
+option. This file may not be copied, modified, or distributed
+except according to those terms.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/benches/bench1.rs
@@ -0,0 +1,703 @@
+#![feature(test)]
+
+extern crate test;
+#[macro_use] extern crate itertools;
+
+use test::{black_box};
+use itertools::Itertools;
+
+use itertools::free::cloned;
+
+use std::iter::repeat;
+use std::cmp;
+use std::ops::Add;
+
+mod extra;
+
+use extra::ZipSlices;
+
+#[bench]
+fn slice_iter(b: &mut test::Bencher)
+{
+    let xs: Vec<_> = repeat(1i32).take(20).collect();
+    b.iter(|| for elt in xs.iter() {
+        test::black_box(elt);
+    })
+}
+
+#[bench]
+fn slice_iter_rev(b: &mut test::Bencher)
+{
+    let xs: Vec<_> = repeat(1i32).take(20).collect();
+    b.iter(|| for elt in xs.iter().rev() {
+        test::black_box(elt);
+    })
+}
+
+#[bench]
+fn zip_default_zip(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        for (&x, &y) in xs.iter().zip(&ys) {
+            test::black_box(x);
+            test::black_box(y);
+        }
+    })
+}
+
+#[bench]
+fn zipdot_i32_default_zip(b: &mut test::Bencher)
+{
+    let xs = vec![2; 1024];
+    let ys = vec![2; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let mut s = 0;
+        for (&x, &y) in xs.iter().zip(&ys) {
+            s += x * y;
+        }
+        s
+    })
+}
+
+#[bench]
+fn zipdot_f32_default_zip(b: &mut test::Bencher)
+{
+    let xs = vec![2f32; 1024];
+    let ys = vec![2f32; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let mut s = 0.;
+        for (&x, &y) in xs.iter().zip(&ys) {
+            s += x * y;
+        }
+        s
+    })
+}
+
+#[bench]
+fn zip_default_zip3(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let zs = vec![0; 766];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+    let zs = black_box(zs);
+
+    b.iter(|| {
+        for ((&x, &y), &z) in xs.iter().zip(&ys).zip(&zs) {
+            test::black_box(x);
+            test::black_box(y);
+            test::black_box(z);
+        }
+    })
+}
+
+/*
+#[bench]
+fn zip_slices_ziptuple(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+
+    b.iter(|| {
+        let xs = black_box(&xs);
+        let ys = black_box(&ys);
+        for (&x, &y) in Zip::new((xs, ys)) {
+            test::black_box(x);
+            test::black_box(y);
+        }
+    })
+}
+*/
+
+#[bench]
+fn zipslices(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        for (&x, &y) in ZipSlices::new(&xs, &ys) {
+            test::black_box(x);
+            test::black_box(y);
+        }
+    })
+}
+
+#[bench]
+fn zipslices_mut(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let xs = black_box(xs);
+    let mut ys = black_box(ys);
+
+    b.iter(|| {
+        for (&x, &mut y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) {
+            test::black_box(x);
+            test::black_box(y);
+        }
+    })
+}
+
+#[bench]
+fn zipdot_i32_zipslices(b: &mut test::Bencher)
+{
+    let xs = vec![2; 1024];
+    let ys = vec![2; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let mut s = 0i32;
+        for (&x, &y) in ZipSlices::new(&xs, &ys) {
+            s += x * y;
+        }
+        s
+    })
+}
+
+#[bench]
+fn zipdot_f32_zipslices(b: &mut test::Bencher)
+{
+    let xs = vec![2f32; 1024];
+    let ys = vec![2f32; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let mut s = 0.;
+        for (&x, &y) in ZipSlices::new(&xs, &ys) {
+            s += x * y;
+        }
+        s
+    })
+}
+
+
+#[bench]
+fn zip_checked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        // Must slice to equal lengths, and then bounds checks are eliminated!
+        let len = cmp::min(xs.len(), ys.len());
+        let xs = &xs[..len];
+        let ys = &ys[..len];
+
+        for i in 0..len {
+            let x = xs[i];
+            let y = ys[i];
+            test::black_box(x);
+            test::black_box(y);
+        }
+    })
+}
+
+#[bench]
+fn zipdot_i32_checked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![2; 1024];
+    let ys = vec![2; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        // Must slice to equal lengths, and then bounds checks are eliminated!
+        let len = cmp::min(xs.len(), ys.len());
+        let xs = &xs[..len];
+        let ys = &ys[..len];
+
+        let mut s = 0i32;
+
+        for i in 0..len {
+            s += xs[i] * ys[i];
+        }
+        s
+    })
+}
+
+#[bench]
+fn zipdot_f32_checked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![2f32; 1024];
+    let ys = vec![2f32; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        // Must slice to equal lengths, and then bounds checks are eliminated!
+        let len = cmp::min(xs.len(), ys.len());
+        let xs = &xs[..len];
+        let ys = &ys[..len];
+
+        let mut s = 0.;
+
+        for i in 0..len {
+            s += xs[i] * ys[i];
+        }
+        s
+    })
+}
+
+#[bench]
+fn zipdot_f32_checked_counted_unrolled_loop(b: &mut test::Bencher)
+{
+    let xs = vec![2f32; 1024];
+    let ys = vec![2f32; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        // Must slice to equal lengths, and then bounds checks are eliminated!
+        let len = cmp::min(xs.len(), ys.len());
+        let mut xs = &xs[..len];
+        let mut ys = &ys[..len];
+
+        let mut s = 0.;
+        let (mut p0, mut p1, mut p2, mut p3, mut p4, mut p5, mut p6, mut p7) =
+            (0., 0., 0., 0., 0., 0., 0., 0.);
+
+        // how to unroll and have bounds checks eliminated (by cristicbz)
+        // split sum into eight parts to enable vectorization (by bluss)
+        while xs.len() >= 8 {
+            p0 += xs[0] * ys[0];
+            p1 += xs[1] * ys[1];
+            p2 += xs[2] * ys[2];
+            p3 += xs[3] * ys[3];
+            p4 += xs[4] * ys[4];
+            p5 += xs[5] * ys[5];
+            p6 += xs[6] * ys[6];
+            p7 += xs[7] * ys[7];
+
+            xs = &xs[8..];
+            ys = &ys[8..];
+        }
+        s += p0 + p4;
+        s += p1 + p5;
+        s += p2 + p6;
+        s += p3 + p7;
+
+        for i in 0..xs.len() {
+            s += xs[i] * ys[i];
+        }
+        s
+    })
+}
+
+#[bench]
+fn zip_unchecked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let len = cmp::min(xs.len(), ys.len());
+        for i in 0..len {
+            unsafe {
+            let x = *xs.get_unchecked(i);
+            let y = *ys.get_unchecked(i);
+            test::black_box(x);
+            test::black_box(y);
+            }
+        }
+    })
+}
+
+#[bench]
+fn zipdot_i32_unchecked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![2; 1024];
+    let ys = vec![2; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let len = cmp::min(xs.len(), ys.len());
+        let mut s = 0i32;
+        for i in 0..len {
+            unsafe {
+            let x = *xs.get_unchecked(i);
+            let y = *ys.get_unchecked(i);
+            s += x * y;
+            }
+        }
+        s
+    })
+}
+
+#[bench]
+fn zipdot_f32_unchecked_counted_loop(b: &mut test::Bencher)
+{
+    let xs = vec![2.; 1024];
+    let ys = vec![2.; 768];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+
+    b.iter(|| {
+        let len = cmp::min(xs.len(), ys.len());
+        let mut s = 0f32;
+        for i in 0..len {
+            unsafe {
+            let x = *xs.get_unchecked(i);
+            let y = *ys.get_unchecked(i);
+            s += x * y;
+            }
+        }
+        s
+    })
+}
+
+#[bench]
+fn zip_unchecked_counted_loop3(b: &mut test::Bencher)
+{
+    let xs = vec![0; 1024];
+    let ys = vec![0; 768];
+    let zs = vec![0; 766];
+    let xs = black_box(xs);
+    let ys = black_box(ys);
+    let zs = black_box(zs);
+
+    b.iter(|| {
+        let len = cmp::min(xs.len(), cmp::min(ys.len(), zs.len()));
+        for i in 0..len {
+            unsafe {
+            let x = *xs.get_unchecked(i);
+            let y = *ys.get_unchecked(i);
+            let z = *zs.get_unchecked(i);
+            test::black_box(x);
+            test::black_box(y);
+            test::black_box(z);
+            }
+        }
+    })
+}
+
+#[bench]
+fn group_by_lazy_1(b: &mut test::Bencher) {
+    let mut data = vec![0; 1024];
+    for (index, elt) in data.iter_mut().enumerate() {
+        *elt = index / 10;
+    }
+
+    let data = test::black_box(data);
+
+    b.iter(|| {
+        for (_key, group) in &data.iter().group_by(|elt| **elt) {
+            for elt in group {
+                test::black_box(elt);
+            }
+        }
+    })
+}
+
+#[bench]
+fn group_by_lazy_2(b: &mut test::Bencher) {
+    let mut data = vec![0; 1024];
+    for (index, elt) in data.iter_mut().enumerate() {
+        *elt = index / 2;
+    }
+
+    let data = test::black_box(data);
+
+    b.iter(|| {
+        for (_key, group) in &data.iter().group_by(|elt| **elt) {
+            for elt in group {
+                test::black_box(elt);
+            }
+        }
+    })
+}
+
+#[bench]
+fn slice_chunks(b: &mut test::Bencher) {
+    let data = vec![0; 1024];
+
+    let data = test::black_box(data);
+    let sz = test::black_box(10);
+
+    b.iter(|| {
+        for group in data.chunks(sz) {
+            for elt in group {
+                test::black_box(elt);
+            }
+        }
+    })
+}
+
+#[bench]
+fn chunks_lazy_1(b: &mut test::Bencher) {
+    let data = vec![0; 1024];
+
+    let data = test::black_box(data);
+    let sz = test::black_box(10);
+
+    b.iter(|| {
+        for group in &data.iter().chunks(sz) {
+            for elt in group {
+                test::black_box(elt);
+            }
+        }
+    })
+}
+
+#[bench]
+fn equal(b: &mut test::Bencher) {
+    let data = vec![7; 1024];
+    let l = data.len();
+    let alpha = test::black_box(&data[1..]);
+    let beta = test::black_box(&data[..l - 1]);
+    b.iter(|| {
+        itertools::equal(alpha, beta)
+    })
+}
+
+#[bench]
+fn merge_default(b: &mut test::Bencher) {
+    let mut data1 = vec![0; 1024];
+    let mut data2 = vec![0; 800];
+    let mut x = 0;
+    for (_, elt) in data1.iter_mut().enumerate() {
+        *elt = x;
+        x += 1;
+    }
+
+    let mut y = 0;
+    for (i, elt) in data2.iter_mut().enumerate() {
+        *elt += y;
+        if i % 3 == 0 {
+            y += 3;
+        } else {
+            y += 0;
+        }
+    }
+    let data1 = test::black_box(data1);
+    let data2 = test::black_box(data2);
+    b.iter(|| {
+        data1.iter().merge(&data2).count()
+    })
+}
+
+#[bench]
+fn merge_by_cmp(b: &mut test::Bencher) {
+    let mut data1 = vec![0; 1024];
+    let mut data2 = vec![0; 800];
+    let mut x = 0;
+    for (_, elt) in data1.iter_mut().enumerate() {
+        *elt = x;
+        x += 1;
+    }
+
+    let mut y = 0;
+    for (i, elt) in data2.iter_mut().enumerate() {
+        *elt += y;
+        if i % 3 == 0 {
+            y += 3;
+        } else {
+            y += 0;
+        }
+    }
+    let data1 = test::black_box(data1);
+    let data2 = test::black_box(data2);
+    b.iter(|| {
+        data1.iter().merge_by(&data2, PartialOrd::le).count()
+    })
+}
+
+#[bench]
+fn merge_by_lt(b: &mut test::Bencher) {
+    let mut data1 = vec![0; 1024];
+    let mut data2 = vec![0; 800];
+    let mut x = 0;
+    for (_, elt) in data1.iter_mut().enumerate() {
+        *elt = x;
+        x += 1;
+    }
+
+    let mut y = 0;
+    for (i, elt) in data2.iter_mut().enumerate() {
+        *elt += y;
+        if i % 3 == 0 {
+            y += 3;
+        } else {
+            y += 0;
+        }
+    }
+    let data1 = test::black_box(data1);
+    let data2 = test::black_box(data2);
+    b.iter(|| {
+        data1.iter().merge_by(&data2, |a, b| a <= b).count()
+    })
+}
+
+#[bench]
+fn kmerge_default(b: &mut test::Bencher) {
+    let mut data1 = vec![0; 1024];
+    let mut data2 = vec![0; 800];
+    let mut x = 0;
+    for (_, elt) in data1.iter_mut().enumerate() {
+        *elt = x;
+        x += 1;
+    }
+
+    let mut y = 0;
+    for (i, elt) in data2.iter_mut().enumerate() {
+        *elt += y;
+        if i % 3 == 0 {
+            y += 3;
+        } else {
+            y += 0;
+        }
+    }
+    let data1 = test::black_box(data1);
+    let data2 = test::black_box(data2);
+    let its = &[data1.iter(), data2.iter()];
+    b.iter(|| {
+        its.iter().cloned().kmerge().count()
+    })
+}
+
+#[bench]
+fn kmerge_tenway(b: &mut test::Bencher) {
+    let mut data = vec![0; 10240];
+
+    let mut state = 1729u16;
+    fn rng(state: &mut u16) -> u16 {
+        let new = state.wrapping_mul(31421) + 6927;
+        *state = new;
+        new
+    }
+
+    for elt in &mut data {
+        *elt = rng(&mut state);
+    }
+
+    let mut chunks = Vec::new();
+    let mut rest = &mut data[..];
+    while rest.len() > 0 {
+        let chunk_len = 1 + rng(&mut state) % 512;
+        let chunk_len = cmp::min(rest.len(), chunk_len as usize);
+        let (fst, tail) = {rest}.split_at_mut(chunk_len);
+        fst.sort();
+        chunks.push(fst.iter().cloned());
+        rest = tail;
+    }
+
+    // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len())));
+
+    b.iter(|| {
+        chunks.iter().cloned().kmerge().count()
+    })
+}
+
+
+fn fast_integer_sum<I>(iter: I) -> I::Item
+    where I: IntoIterator,
+          I::Item: Default + Add<Output=I::Item>
+{
+    iter.into_iter().fold(<_>::default(), |x, y| x + y)
+}
+
+
+#[bench]
+fn step_vec_2(b: &mut test::Bencher) {
+    let v = vec![0; 1024];
+    b.iter(|| {
+        fast_integer_sum(cloned(v.iter().step(2)))
+    });
+}
+
+#[bench]
+fn step_vec_10(b: &mut test::Bencher) {
+    let v = vec![0; 1024];
+    b.iter(|| {
+        fast_integer_sum(cloned(v.iter().step(10)))
+    });
+}
+
+#[bench]
+fn step_range_2(b: &mut test::Bencher) {
+    let v = black_box(0..1024);
+    b.iter(|| {
+        fast_integer_sum(v.clone().step(2))
+    });
+}
+
+#[bench]
+fn step_range_10(b: &mut test::Bencher) {
+    let v = black_box(0..1024);
+    b.iter(|| {
+        fast_integer_sum(v.clone().step(10))
+    });
+}
+
+#[bench]
+fn cartesian_product_iterator(b: &mut test::Bencher)
+{
+    let xs = vec![0; 16];
+
+    b.iter(|| {
+        let mut sum = 0;
+        for (&x, &y, &z) in iproduct!(&xs, &xs, &xs) {
+            sum += x;
+            sum += y;
+            sum += z;
+        }
+        sum
+    })
+}
+
+#[bench]
+fn cartesian_product_fold(b: &mut test::Bencher)
+{
+    let xs = vec![0; 16];
+
+    b.iter(|| {
+        let mut sum = 0;
+        iproduct!(&xs, &xs, &xs).fold((), |(), (&x, &y, &z)| {
+            sum += x;
+            sum += y;
+            sum += z;
+        });
+        sum
+    })
+}
+
+#[bench]
+fn cartesian_product_nested_for(b: &mut test::Bencher)
+{
+    let xs = vec![0; 16];
+
+    b.iter(|| {
+        let mut sum = 0;
+        for &x in &xs {
+            for &y in &xs {
+                for &z in &xs {
+                    sum += x;
+                    sum += y;
+                    sum += z;
+                }
+            }
+        }
+        sum
+    })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/benches/extra/mod.rs
@@ -0,0 +1,4 @@
+
+
+pub use self::zipslices::ZipSlices;
+mod zipslices;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/benches/extra/zipslices.rs
@@ -0,0 +1,189 @@
+use std::cmp;
+
+// Note: There are different ways to implement ZipSlices.
+// This version performed the best in benchmarks.
+//
+// I also implemented a version with three pointes (tptr, tend, uptr),
+// that mimiced slice::Iter and only checked bounds by using tptr == tend,
+// but that was inferior to this solution.
+
+/// An iterator which iterates two slices simultaneously.
+///
+/// `ZipSlices` acts like a double-ended `.zip()` iterator.
+///
+/// It was intended to be more efficient than `.zip()`, and it was, then
+/// rustc changed how it optimizes so it can not promise improved performance
+/// at this time.
+///
+/// Note that elements past the end of the shortest of the two slices are ignored.
+///
+/// Iterator element type for `ZipSlices<T, U>` is `(T::Item, U::Item)`. For example,
+/// for a `ZipSlices<&'a [A], &'b mut [B]>`, the element type is `(&'a A, &'b mut B)`.
+#[derive(Clone)]
+pub struct ZipSlices<T, U> {
+    t: T,
+    u: U,
+    len: usize,
+    index: usize,
+}
+
+impl<'a, 'b, A, B> ZipSlices<&'a [A], &'b [B]> {
+    /// Create a new `ZipSlices` from slices `a` and `b`.
+    ///
+    /// Act like a double-ended `.zip()` iterator, but more efficiently.
+    ///
+    /// Note that elements past the end of the shortest of the two slices are ignored.
+    #[inline(always)]
+    pub fn new(a: &'a [A], b: &'b [B]) -> Self {
+        let minl = cmp::min(a.len(), b.len());
+        ZipSlices {
+            t: a,
+            u: b,
+            len: minl,
+            index: 0,
+        }
+    }
+}
+
+impl<T, U> ZipSlices<T, U>
+    where T: Slice,
+          U: Slice
+{
+    /// Create a new `ZipSlices` from slices `a` and `b`.
+    ///
+    /// Act like a double-ended `.zip()` iterator, but more efficiently.
+    ///
+    /// Note that elements past the end of the shortest of the two slices are ignored.
+    #[inline(always)]
+    pub fn from_slices(a: T, b: U) -> Self {
+        let minl = cmp::min(a.len(), b.len());
+        ZipSlices {
+            t: a,
+            u: b,
+            len: minl,
+            index: 0,
+        }
+    }
+}
+
+impl<T, U> Iterator for ZipSlices<T, U>
+    where T: Slice,
+          U: Slice
+{
+    type Item = (T::Item, U::Item);
+
+    #[inline(always)]
+    fn next(&mut self) -> Option<Self::Item> {
+        unsafe {
+            if self.index >= self.len {
+                None
+            } else {
+                let i = self.index;
+                self.index += 1;
+                Some((
+                    self.t.get_unchecked(i),
+                    self.u.get_unchecked(i)))
+            }
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let len = self.len - self.index;
+        (len, Some(len))
+    }
+}
+
+impl<T, U> DoubleEndedIterator for ZipSlices<T, U>
+    where T: Slice,
+          U: Slice
+{
+    #[inline(always)]
+    fn next_back(&mut self) -> Option<Self::Item> {
+        unsafe {
+            if self.index >= self.len {
+                None
+            } else {
+                self.len -= 1;
+                let i = self.len;
+                Some((
+                    self.t.get_unchecked(i),
+                    self.u.get_unchecked(i)))
+            }
+        }
+    }
+}
+
+impl<T, U> ExactSizeIterator for ZipSlices<T, U>
+    where T: Slice,
+          U: Slice
+{}
+
+unsafe impl<T, U> Slice for ZipSlices<T, U>
+    where T: Slice,
+          U: Slice
+{
+    type Item = (T::Item, U::Item);
+
+    fn len(&self) -> usize {
+        self.len - self.index
+    }
+
+    unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
+        (self.t.get_unchecked(i),
+         self.u.get_unchecked(i))
+    }
+}
+
+/// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`.
+///
+/// Unsafe trait because:
+///
+/// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`.
+pub unsafe trait Slice {
+    /// The type of a reference to the slice's elements
+    type Item;
+    #[doc(hidden)]
+    fn len(&self) -> usize;
+    #[doc(hidden)]
+    unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item;
+}
+
+unsafe impl<'a, T> Slice for &'a [T] {
+    type Item = &'a T;
+    #[inline(always)]
+    fn len(&self) -> usize { (**self).len() }
+    #[inline(always)]
+    unsafe fn get_unchecked(&mut self, i: usize) -> &'a T {
+        debug_assert!(i < self.len());
+        (**self).get_unchecked(i)
+    }
+}
+
+unsafe impl<'a, T> Slice for &'a mut [T] {
+    type Item = &'a mut T;
+    #[inline(always)]
+    fn len(&self) -> usize { (**self).len() }
+    #[inline(always)]
+    unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T {
+        debug_assert!(i < self.len());
+        // override the lifetime constraints of &mut &'a mut [T]
+        (*(*self as *mut [T])).get_unchecked_mut(i)
+    }
+}
+
+#[test]
+fn zipslices() {
+
+    let xs = [1, 2, 3, 4, 5, 6];
+    let ys = [1, 2, 3, 7];
+    ::itertools::assert_equal(ZipSlices::new(&xs, &ys), xs.iter().zip(&ys));
+
+    let xs = [1, 2, 3, 4, 5, 6];
+    let mut ys = [0; 6];
+    for (x, y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) {
+        *y = *x;
+    }
+    ::itertools::assert_equal(&xs, &ys);
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/benches/tuple_combinations.rs
@@ -0,0 +1,97 @@
+#![feature(test)]
+
+extern crate test;
+extern crate itertools;
+
+use test::{black_box, Bencher};
+use itertools::Itertools;
+
+// aproximate 100_000 iterations for each combination
+const N1: usize = 100_000;
+const N2: usize = 448;
+const N3: usize = 86;
+const N4: usize = 41;
+
+#[bench]
+fn comb_for1(b: &mut Bencher) {
+    b.iter(|| {
+        for i in 0..N1 {
+            black_box(i);
+        }
+    });
+}
+
+#[bench]
+fn comb_for2(b: &mut Bencher) {
+    b.iter(|| {
+        for i in 0..N2 {
+            for j in (i + 1)..N2 {
+                black_box(i + j);
+            }
+        }
+    });
+}
+
+#[bench]
+fn comb_for3(b: &mut Bencher) {
+    b.iter(|| {
+        for i in 0..N3 {
+            for j in (i + 1)..N3 {
+                for k in (j + 1)..N3 {
+                    black_box(i + j + k);
+                }
+            }
+        }
+    });
+}
+
+#[bench]
+fn comb_for4(b: &mut Bencher) {
+    b.iter(|| {
+        for i in 0..N4 {
+            for j in (i + 1)..N4 {
+                for k in (j + 1)..N4 {
+                    for l in (k + 1)..N4 {
+                        black_box(i + j + k + l);
+                    }
+                }
+            }
+        }
+    });
+}
+
+#[bench]
+fn comb_c1(b: &mut Bencher) {
+    b.iter(|| {
+        for (i,) in (0..N1).tuple_combinations() {
+            black_box(i);
+        }
+    });
+}
+
+#[bench]
+fn comb_c2(b: &mut Bencher) {
+    b.iter(|| {
+        for (i, j) in (0..N2).tuple_combinations() {
+            black_box(i + j);
+        }
+    });
+}
+
+#[bench]
+fn comb_c3(b: &mut Bencher) {
+    b.iter(|| {
+        for (i, j, k) in (0..N3).tuple_combinations() {
+            black_box(i + j + k);
+        }
+    });
+}
+
+#[bench]
+fn comb_c4(b: &mut Bencher) {
+    b.iter(|| {
+        for (i, j, k, l) in (0..N4).tuple_combinations() {
+            black_box(i + j + k + l);
+        }
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/benches/tuples.rs
@@ -0,0 +1,190 @@
+#![feature(test)]
+
+extern crate test;
+extern crate itertools;
+
+use test::Bencher;
+use itertools::Itertools;
+
+fn s1(a: u32) -> u32 {
+    a
+}
+
+fn s2(a: u32, b: u32) -> u32 {
+    a + b
+}
+
+fn s3(a: u32, b: u32, c: u32) -> u32 {
+    a + b + c
+}
+
+fn s4(a: u32, b: u32, c: u32, d: u32) -> u32 {
+    a + b + c + d
+}
+
+fn sum_s1(s: &[u32]) -> u32 {
+    s1(s[0])
+}
+
+fn sum_s2(s: &[u32]) -> u32 {
+    s2(s[0], s[1])
+}
+
+fn sum_s3(s: &[u32]) -> u32 {
+    s3(s[0], s[1], s[2])
+}
+
+fn sum_s4(s: &[u32]) -> u32 {
+    s4(s[0], s[1], s[2], s[3])
+}
+
+fn sum_t1(s: &(&u32, )) -> u32 {
+    s1(*s.0)
+}
+
+fn sum_t2(s: &(&u32, &u32)) -> u32 {
+    s2(*s.0, *s.1)
+}
+
+fn sum_t3(s: &(&u32, &u32, &u32)) -> u32 {
+    s3(*s.0, *s.1, *s.2)
+}
+
+fn sum_t4(s: &(&u32, &u32, &u32, &u32)) -> u32 {
+    s4(*s.0, *s.1, *s.2, *s.3)
+}
+
+macro_rules! def_benchs {
+    ($N:expr;
+     $TUPLE_FUN:ident,
+     $TUPLES:ident,
+     $TUPLE_WINDOWS:ident;
+     $SLICE_FUN:ident,
+     $CHUNKS:ident,
+     $WINDOWS:ident;
+     $FOR_CHUNKS:ident,
+     $FOR_WINDOWS:ident
+     ) => (
+        #[bench]
+        fn $FOR_CHUNKS(b: &mut Bencher) {
+            let v: Vec<u32> = (0.. $N * 1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                let mut j = 0;
+                for _ in 0..1_000 {
+                    s += $SLICE_FUN(&v[j..(j + $N)]);
+                    j += $N;
+                }
+                s
+            });
+        }
+
+        #[bench]
+        fn $FOR_WINDOWS(b: &mut Bencher) {
+            let v: Vec<u32> = (0..1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                for i in 0..(1_000 - $N) {
+                    s += $SLICE_FUN(&v[i..(i + $N)]);
+                }
+                s
+            });
+        }
+
+        #[bench]
+        fn $TUPLES(b: &mut Bencher) {
+            let v: Vec<u32> = (0.. $N * 1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                for x in v.iter().tuples() {
+                    s += $TUPLE_FUN(&x);
+                }
+                s
+            });
+        }
+
+        #[bench]
+        fn $CHUNKS(b: &mut Bencher) {
+            let v: Vec<u32> = (0.. $N * 1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                for x in v.chunks($N) {
+                    s += $SLICE_FUN(x);
+                }
+                s
+            });
+        }
+
+        #[bench]
+        fn $TUPLE_WINDOWS(b: &mut Bencher) {
+            let v: Vec<u32> = (0..1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                for x in v.iter().tuple_windows() {
+                    s += $TUPLE_FUN(&x);
+                }
+                s
+            });
+        }
+
+        #[bench]
+        fn $WINDOWS(b: &mut Bencher) {
+            let v: Vec<u32> = (0..1_000).collect();
+            let mut s = 0;
+            b.iter(|| {
+                for x in v.windows($N) {
+                    s += $SLICE_FUN(x);
+                }
+                s
+            });
+        }
+    )
+}
+
+def_benchs!{
+    1;
+    sum_t1,
+    tuple_chunks_1,
+    tuple_windows_1;
+    sum_s1,
+    slice_chunks_1,
+    slice_windows_1;
+    for_chunks_1,
+    for_windows_1
+}
+
+def_benchs!{
+    2;
+    sum_t2,
+    tuple_chunks_2,
+    tuple_windows_2;
+    sum_s2,
+    slice_chunks_2,
+    slice_windows_2;
+    for_chunks_2,
+    for_windows_2
+}
+
+def_benchs!{
+    3;
+    sum_t3,
+    tuple_chunks_3,
+    tuple_windows_3;
+    sum_s3,
+    slice_chunks_3,
+    slice_windows_3;
+    for_chunks_3,
+    for_windows_3
+}
+
+def_benchs!{
+    4;
+    sum_t4,
+    tuple_chunks_4,
+    tuple_windows_4;
+    sum_s4,
+    slice_chunks_4,
+    slice_windows_4;
+    for_chunks_4,
+    for_windows_4
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/custom.css
@@ -0,0 +1,29 @@
+
+.docblock pre.rust { background: #eeeeff; }
+pre.trait, pre.fn, pre.struct, pre.enum, pre.typedef { background: #fcfefc; }
+
+/* Small “example” label for doc examples */
+.docblock pre.rust::before {
+    content: "example";
+    float: right;
+    font-style: italic;
+    font-size: 0.8em;
+    margin-top: -10px;
+    margin-right: -5px;
+}
+
+
+/* Fixup where display in trait listing */
+pre.trait .where::before {
+content: '\a         ';
+}
+
+.docblock code {
+    background-color: inherit;
+    font-weight: bold;
+    padding: 0 0.1em;
+}
+
+a.test-arrow {
+    display: none;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/examples/iris.data
@@ -0,0 +1,150 @@
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.4,3.7,1.5,0.2,Iris-setosa
+4.8,3.4,1.6,0.2,Iris-setosa
+4.8,3.0,1.4,0.1,Iris-setosa
+4.3,3.0,1.1,0.1,Iris-setosa
+5.8,4.0,1.2,0.2,Iris-setosa
+5.7,4.4,1.5,0.4,Iris-setosa
+5.4,3.9,1.3,0.4,Iris-setosa
+5.1,3.5,1.4,0.3,Iris-setosa
+5.7,3.8,1.7,0.3,Iris-setosa
+5.1,3.8,1.5,0.3,Iris-setosa
+5.4,3.4,1.7,0.2,Iris-setosa
+5.1,3.7,1.5,0.4,Iris-setosa
+4.6,3.6,1.0,0.2,Iris-setosa
+5.1,3.3,1.7,0.5,Iris-setosa
+4.8,3.4,1.9,0.2,Iris-setosa
+5.0,3.0,1.6,0.2,Iris-setosa
+5.0,3.4,1.6,0.4,Iris-setosa
+5.2,3.5,1.5,0.2,Iris-setosa
+5.2,3.4,1.4,0.2,Iris-setosa
+4.7,3.2,1.6,0.2,Iris-setosa
+4.8,3.1,1.6,0.2,Iris-setosa
+5.4,3.4,1.5,0.4,Iris-setosa
+5.2,4.1,1.5,0.1,Iris-setosa
+5.5,4.2,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.0,3.2,1.2,0.2,Iris-setosa
+5.5,3.5,1.3,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+4.4,3.0,1.3,0.2,Iris-setosa
+5.1,3.4,1.5,0.2,Iris-setosa
+5.0,3.5,1.3,0.3,Iris-setosa
+4.5,2.3,1.3,0.3,Iris-setosa
+4.4,3.2,1.3,0.2,Iris-setosa
+5.0,3.5,1.6,0.6,Iris-setosa
+5.1,3.8,1.9,0.4,Iris-setosa
+4.8,3.0,1.4,0.3,Iris-setosa
+5.1,3.8,1.6,0.2,Iris-setosa
+4.6,3.2,1.4,0.2,Iris-setosa
+5.3,3.7,1.5,0.2,Iris-setosa
+5.0,3.3,1.4,0.2,Iris-setosa
+7.0,3.2,4.7,1.4,Iris-versicolor
+6.4,3.2,4.5,1.5,Iris-versicolor
+6.9,3.1,4.9,1.5,Iris-versicolor
+5.5,2.3,4.0,1.3,Iris-versicolor
+6.5,2.8,4.6,1.5,Iris-versicolor
+5.7,2.8,4.5,1.3,Iris-versicolor
+6.3,3.3,4.7,1.6,Iris-versicolor
+4.9,2.4,3.3,1.0,Iris-versicolor
+6.6,2.9,4.6,1.3,Iris-versicolor
+5.2,2.7,3.9,1.4,Iris-versicolor
+5.0,2.0,3.5,1.0,Iris-versicolor
+5.9,3.0,4.2,1.5,Iris-versicolor
+6.0,2.2,4.0,1.0,Iris-versicolor
+6.1,2.9,4.7,1.4,Iris-versicolor
+5.6,2.9,3.6,1.3,Iris-versicolor
+6.7,3.1,4.4,1.4,Iris-versicolor
+5.6,3.0,4.5,1.5,Iris-versicolor
+5.8,2.7,4.1,1.0,Iris-versicolor
+6.2,2.2,4.5,1.5,Iris-versicolor
+5.6,2.5,3.9,1.1,Iris-versicolor
+5.9,3.2,4.8,1.8,Iris-versicolor
+6.1,2.8,4.0,1.3,Iris-versicolor
+6.3,2.5,4.9,1.5,Iris-versicolor
+6.1,2.8,4.7,1.2,Iris-versicolor
+6.4,2.9,4.3,1.3,Iris-versicolor
+6.6,3.0,4.4,1.4,Iris-versicolor
+6.8,2.8,4.8,1.4,Iris-versicolor
+6.7,3.0,5.0,1.7,Iris-versicolor
+6.0,2.9,4.5,1.5,Iris-versicolor
+5.7,2.6,3.5,1.0,Iris-versicolor
+5.5,2.4,3.8,1.1,Iris-versicolor
+5.5,2.4,3.7,1.0,Iris-versicolor
+5.8,2.7,3.9,1.2,Iris-versicolor
+6.0,2.7,5.1,1.6,Iris-versicolor
+5.4,3.0,4.5,1.5,Iris-versicolor
+6.0,3.4,4.5,1.6,Iris-versicolor
+6.7,3.1,4.7,1.5,Iris-versicolor
+6.3,2.3,4.4,1.3,Iris-versicolor
+5.6,3.0,4.1,1.3,Iris-versicolor
+5.5,2.5,4.0,1.3,Iris-versicolor
+5.5,2.6,4.4,1.2,Iris-versicolor
+6.1,3.0,4.6,1.4,Iris-versicolor
+5.8,2.6,4.0,1.2,Iris-versicolor
+5.0,2.3,3.3,1.0,Iris-versicolor
+5.6,2.7,4.2,1.3,Iris-versicolor
+5.7,3.0,4.2,1.2,Iris-versicolor
+5.7,2.9,4.2,1.3,Iris-versicolor
+6.2,2.9,4.3,1.3,Iris-versicolor
+5.1,2.5,3.0,1.1,Iris-versicolor
+5.7,2.8,4.1,1.3,Iris-versicolor
+6.3,3.3,6.0,2.5,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+7.1,3.0,5.9,2.1,Iris-virginica
+6.3,2.9,5.6,1.8,Iris-virginica
+6.5,3.0,5.8,2.2,Iris-virginica
+7.6,3.0,6.6,2.1,Iris-virginica
+4.9,2.5,4.5,1.7,Iris-virginica
+7.3,2.9,6.3,1.8,Iris-virginica
+6.7,2.5,5.8,1.8,Iris-virginica
+7.2,3.6,6.1,2.5,Iris-virginica
+6.5,3.2,5.1,2.0,Iris-virginica
+6.4,2.7,5.3,1.9,Iris-virginica
+6.8,3.0,5.5,2.1,Iris-virginica
+5.7,2.5,5.0,2.0,Iris-virginica
+5.8,2.8,5.1,2.4,Iris-virginica
+6.4,3.2,5.3,2.3,Iris-virginica
+6.5,3.0,5.5,1.8,Iris-virginica
+7.7,3.8,6.7,2.2,Iris-virginica
+7.7,2.6,6.9,2.3,Iris-virginica
+6.0,2.2,5.0,1.5,Iris-virginica
+6.9,3.2,5.7,2.3,Iris-virginica
+5.6,2.8,4.9,2.0,Iris-virginica
+7.7,2.8,6.7,2.0,Iris-virginica
+6.3,2.7,4.9,1.8,Iris-virginica
+6.7,3.3,5.7,2.1,Iris-virginica
+7.2,3.2,6.0,1.8,Iris-virginica
+6.2,2.8,4.8,1.8,Iris-virginica
+6.1,3.0,4.9,1.8,Iris-virginica
+6.4,2.8,5.6,2.1,Iris-virginica
+7.2,3.0,5.8,1.6,Iris-virginica
+7.4,2.8,6.1,1.9,Iris-virginica
+7.9,3.8,6.4,2.0,Iris-virginica
+6.4,2.8,5.6,2.2,Iris-virginica
+6.3,2.8,5.1,1.5,Iris-virginica
+6.1,2.6,5.6,1.4,Iris-virginica
+7.7,3.0,6.1,2.3,Iris-virginica
+6.3,3.4,5.6,2.4,Iris-virginica
+6.4,3.1,5.5,1.8,Iris-virginica
+6.0,3.0,4.8,1.8,Iris-virginica
+6.9,3.1,5.4,2.1,Iris-virginica
+6.7,3.1,5.6,2.4,Iris-virginica
+6.9,3.1,5.1,2.3,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+6.8,3.2,5.9,2.3,Iris-virginica
+6.7,3.3,5.7,2.5,Iris-virginica
+6.7,3.0,5.2,2.3,Iris-virginica
+6.3,2.5,5.0,1.9,Iris-virginica
+6.5,3.0,5.2,2.0,Iris-virginica
+6.2,3.4,5.4,2.3,Iris-virginica
+5.9,3.0,5.1,1.8,Iris-virginica
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/examples/iris.rs
@@ -0,0 +1,141 @@
+///
+/// This example parses, sorts and groups the iris dataset
+/// and does some simple manipulations.
+///
+/// Iterators and itertools functionality are used throughout.
+///
+///
+
+extern crate itertools;
+
+use itertools::Itertools;
+use std::collections::HashMap;
+use std::iter::repeat;
+use std::num::ParseFloatError;
+use std::str::FromStr;
+
+static DATA: &'static str = include_str!("iris.data");
+
+#[derive(Clone, Debug)]
+struct Iris {
+    name: String,
+    data: [f32; 4],
+}
+
+#[derive(Clone, Debug)]
+enum ParseError {
+    Numeric(ParseFloatError),
+    Other(&'static str),
+}
+
+impl From<ParseFloatError> for ParseError {
+    fn from(err: ParseFloatError) -> Self {
+        ParseError::Numeric(err)
+    }
+}
+
+/// Parse an Iris from a comma-separated line
+impl FromStr for Iris {
+    type Err = ParseError;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        let mut iris = Iris { name: "".into(), data: [0.; 4] };
+        let mut parts = s.split(",").map(str::trim);
+
+        // using Iterator::by_ref()
+        for (index, part) in parts.by_ref().take(4).enumerate() {
+            iris.data[index] = try!(part.parse::<f32>());
+        }
+        if let Some(name) = parts.next() {
+            iris.name = name.into();
+        } else {
+            return Err(ParseError::Other("Missing name"))
+        }
+        Ok(iris)
+    }
+}
+
+fn main() {
+    // using Itertools::fold_results to create the result of parsing
+    let irises = DATA.lines()
+                     .map(str::parse)
+                     .fold_results(Vec::new(), |mut v, iris: Iris| {
+                         v.push(iris);
+                         v
+                     });
+    let mut irises = match irises {
+        Err(e) => {
+            println!("Error parsing: {:?}", e);
+            std::process::exit(1);
+        }
+        Ok(data) => data,
+    };
+
+    // Sort them and group them
+    irises.sort_by(|a, b| Ord::cmp(&a.name, &b.name));
+
+    // using Iterator::cycle()
+    let mut plot_symbols = "+ox".chars().cycle();
+    let mut symbolmap = HashMap::new();
+
+    // using Itertools::group_by
+    for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) {
+        // assign a plot symbol
+        symbolmap.entry(species).or_insert_with(|| {
+            plot_symbols.next().unwrap()
+        });
+        println!("{} (symbol={})", species, symbolmap[species]);
+
+        for iris in species_group {
+            // using Itertools::format for lazy formatting
+            println!("{:>3.1}", iris.data.iter().format(", "));
+        }
+
+    }
+
+    // Look at all combinations of the four columns
+    //
+    // See https://en.wikipedia.org/wiki/Iris_flower_data_set
+    //
+    let n = 30; // plot size
+    let mut plot = vec![' '; n * n];
+
+    // using Itertools::tuple_combinations
+    for (a, b) in (0..4).tuple_combinations() {
+        println!("Column {} vs {}:", a, b);
+
+        // Clear plot
+        //
+        // using std::iter::repeat;
+        // using Itertools::set_from
+        plot.iter_mut().set_from(repeat(' '));
+
+        // using Itertools::minmax
+        let min_max = |data: &[Iris], col| {
+            data.iter()
+                .map(|iris| iris.data[col])
+                .minmax()
+                .into_option()
+                .expect("Can't find min/max of empty iterator")
+        };
+        let (min_x, max_x) = min_max(&irises, a);
+        let (min_y, max_y) = min_max(&irises, b);
+
+        // Plot the data points
+        let round_to_grid = |x, min, max| ((x - min) / (max - min) * ((n - 1) as f32)) as usize;
+        let flip = |ix| n - 1 - ix; // reverse axis direction
+
+        for iris in &irises {
+            let ix = round_to_grid(iris.data[a], min_x, max_x);
+            let iy = flip(round_to_grid(iris.data[b], min_y, max_y));
+            plot[n * iy + ix] = symbolmap[&iris.name];
+        }
+
+        // render plot
+        //
+        // using Itertools::join
+        for line in plot.chunks(n) {
+            println!("{}", line.iter().join(" "))
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/adaptors/mod.rs
@@ -0,0 +1,1505 @@
+//! Licensed under the Apache License, Version 2.0
+//! http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
+//! http://opensource.org/licenses/MIT, at your
+//! option. This file may not be copied, modified, or distributed
+//! except according to those terms.
+
+use std::fmt;
+use std::mem::replace;
+use std::ops::Index;
+use std::iter::{Fuse, Peekable};
+use std::collections::HashSet;
+use std::hash::Hash;
+use std::marker::PhantomData;
+use size_hint;
+use fold;
+
+pub mod multipeek;
+pub use self::multipeek::MultiPeek;
+
+macro_rules! clone_fields {
+    ($name:ident, $base:expr, $($field:ident),+) => (
+        $name {
+            $(
+                $field : $base . $field .clone()
+            ),*
+        }
+    );
+}
+
+
+/// An iterator adaptor that alternates elements from two iterators until both
+/// run out.
+///
+/// This iterator is *fused*.
+///
+/// See [`.interleave()`](../trait.Itertools.html#method.interleave) for more information.
+#[derive(Clone, Debug)]
+pub struct Interleave<I, J> {
+    a: Fuse<I>,
+    b: Fuse<J>,
+    flag: bool,
+}
+
+/// Create an iterator that interleaves elements in `i` and `j`.
+///
+/// `IntoIterator` enabled version of `i.interleave(j)`.
+///
+/// ```
+/// use itertools::interleave;
+///
+/// for elt in interleave(&[1, 2, 3], &[2, 3, 4]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn interleave<I, J>(i: I, j: J) -> Interleave<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator<Item = I::Item>
+{
+    Interleave {
+        a: i.into_iter().fuse(),
+        b: j.into_iter().fuse(),
+        flag: false,
+    }
+}
+
+impl<I, J> Iterator for Interleave<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        self.flag = !self.flag;
+        if self.flag {
+            match self.a.next() {
+                None => self.b.next(),
+                r => r,
+            }
+        } else {
+            match self.b.next() {
+                None => self.a.next(),
+                r => r,
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::add(self.a.size_hint(), self.b.size_hint())
+    }
+}
+
+/// An iterator adaptor that alternates elements from the two iterators until
+/// one of them runs out.
+///
+/// This iterator is *fused*.
+///
+/// See [`.interleave_shortest()`](../trait.Itertools.html#method.interleave_shortest)
+/// for more information.
+#[derive(Clone, Debug)]
+pub struct InterleaveShortest<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    it0: I,
+    it1: J,
+    phase: bool, // false ==> it0, true ==> it1
+}
+
+/// Create a new `InterleaveShortest` iterator.
+pub fn interleave_shortest<I, J>(a: I, b: J) -> InterleaveShortest<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    InterleaveShortest {
+        it0: a,
+        it1: b,
+        phase: false,
+    }
+}
+
+impl<I, J> Iterator for InterleaveShortest<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    type Item = I::Item;
+
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        match self.phase {
+            false => match self.it0.next() {
+                None => None,
+                e => {
+                    self.phase = true;
+                    e
+                }
+            },
+            true => match self.it1.next() {
+                None => None,
+                e => {
+                    self.phase = false;
+                    e
+                }
+            },
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (curr_hint, next_hint) = {
+            let it0_hint = self.it0.size_hint();
+            let it1_hint = self.it1.size_hint();
+            if self.phase {
+                (it1_hint, it0_hint)
+            } else {
+                (it0_hint, it1_hint)
+            }
+        };
+        let (curr_lower, curr_upper) = curr_hint;
+        let (next_lower, next_upper) = next_hint;
+        let (combined_lower, combined_upper) =
+            size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2);
+        let lower =
+            if curr_lower > next_lower {
+                combined_lower + 1
+            } else {
+                combined_lower
+            };
+        let upper = {
+            let extra_elem = match (curr_upper, next_upper) {
+                (_, None) => false,
+                (None, Some(_)) => true,
+                (Some(curr_max), Some(next_max)) => curr_max > next_max,
+            };
+            if extra_elem {
+                combined_upper.and_then(|x| x.checked_add(1))
+            } else {
+                combined_upper
+            }
+        };
+        (lower, upper)
+    }
+}
+
+#[derive(Clone, Debug)]
+/// An iterator adaptor that allows putting back a single
+/// item to the front of the iterator.
+///
+/// Iterator element type is `I::Item`.
+pub struct PutBack<I>
+    where I: Iterator
+{
+    top: Option<I::Item>,
+    iter: I,
+}
+
+/// Create an iterator where you can put back a single item
+pub fn put_back<I>(iterable: I) -> PutBack<I::IntoIter>
+    where I: IntoIterator
+{
+    PutBack {
+        top: None,
+        iter: iterable.into_iter(),
+    }
+}
+
+impl<I> PutBack<I>
+    where I: Iterator
+{
+    /// put back value `value` (builder method)
+    pub fn with_value(mut self, value: I::Item) -> Self {
+        self.put_back(value);
+        self
+    }
+
+    /// Split the `PutBack` into its parts.
+    #[inline]
+    pub fn into_parts(self) -> (Option<I::Item>, I) {
+        let PutBack{top, iter} = self;
+        (top, iter)
+    }
+
+    /// Put back a single value to the front of the iterator.
+    ///
+    /// If a value is already in the put back slot, it is overwritten.
+    #[inline]
+    pub fn put_back(&mut self, x: I::Item) {
+        self.top = Some(x)
+    }
+}
+
+impl<I> Iterator for PutBack<I>
+    where I: Iterator
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        match self.top {
+            None => self.iter.next(),
+            ref mut some => some.take(),
+        }
+    }
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // Not ExactSizeIterator because size may be larger than usize
+        size_hint::add_scalar(self.iter.size_hint(), self.top.is_some() as usize)
+    }
+
+    fn all<G>(&mut self, mut f: G) -> bool
+        where G: FnMut(Self::Item) -> bool
+    {
+        if let Some(elt) = self.top.take() {
+            if !f(elt) {
+                return false;
+            }
+        }
+        self.iter.all(f)
+    }
+
+    fn fold<Acc, G>(mut self, init: Acc, mut f: G) -> Acc
+        where G: FnMut(Acc, Self::Item) -> Acc,
+    {
+        let mut accum = init;
+        if let Some(elt) = self.top.take() {
+            accum = f(accum, elt);
+        }
+        self.iter.fold(accum, f)
+    }
+}
+
+/// An iterator adaptor that allows putting multiple
+/// items in front of the iterator.
+///
+/// Iterator element type is `I::Item`.
+#[derive(Debug, Clone)]
+pub struct PutBackN<I: Iterator> {
+    top: Vec<I::Item>,
+    iter: I,
+}
+
+/// Create an iterator where you can put back multiple values to the front
+/// of the iteration.
+///
+/// Iterator element type is `I::Item`.
+pub fn put_back_n<I>(iterable: I) -> PutBackN<I::IntoIter>
+    where I: IntoIterator
+{
+    PutBackN {
+        top: Vec::new(),
+        iter: iterable.into_iter(),
+    }
+}
+
+impl<I: Iterator> PutBackN<I> {
+    /// Puts x in front of the iterator.
+    /// The values are yielded in order of the most recently put back
+    /// values first.
+    ///
+    /// ```rust
+    /// use itertools::put_back_n;
+    ///
+    /// let mut it = put_back_n(1..5);
+    /// it.next();
+    /// it.put_back(1);
+    /// it.put_back(0);
+    ///
+    /// assert!(itertools::equal(it, 0..5));
+    /// ```
+    #[inline]
+    pub fn put_back(&mut self, x: I::Item) {
+        self.top.push(x);
+    }
+}
+
+impl<I: Iterator> Iterator for PutBackN<I> {
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        if self.top.is_empty() {
+            self.iter.next()
+        } else {
+            self.top.pop()
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::add_scalar(self.iter.size_hint(), self.top.len())
+    }
+}
+
+#[derive(Debug, Clone)]
+/// An iterator adaptor that iterates over the cartesian product of
+/// the element sets of two iterators `I` and `J`.
+///
+/// Iterator element type is `(I::Item, J::Item)`.
+///
+/// See [`.cartesian_product()`](../trait.Itertools.html#method.cartesian_product) for more information.
+pub struct Product<I, J>
+    where I: Iterator
+{
+    a: I,
+    a_cur: Option<I::Item>,
+    b: J,
+    b_orig: J,
+}
+
+/// Create a new cartesian product iterator
+///
+/// Iterator element type is `(I::Item, J::Item)`.
+pub fn cartesian_product<I, J>(mut i: I, j: J) -> Product<I, J>
+    where I: Iterator,
+          J: Clone + Iterator,
+          I::Item: Clone
+{
+    Product {
+        a_cur: i.next(),
+        a: i,
+        b: j.clone(),
+        b_orig: j,
+    }
+}
+
+
+impl<I, J> Iterator for Product<I, J>
+    where I: Iterator,
+          J: Clone + Iterator,
+          I::Item: Clone
+{
+    type Item = (I::Item, J::Item);
+    fn next(&mut self) -> Option<(I::Item, J::Item)> {
+        let elt_b = match self.b.next() {
+            None => {
+                self.b = self.b_orig.clone();
+                match self.b.next() {
+                    None => return None,
+                    Some(x) => {
+                        self.a_cur = self.a.next();
+                        x
+                    }
+                }
+            }
+            Some(x) => x
+        };
+        match self.a_cur {
+            None => None,
+            Some(ref a) => {
+                Some((a.clone(), elt_b))
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let has_cur = self.a_cur.is_some() as usize;
+        // Not ExactSizeIterator because size may be larger than usize
+        let (b_min, b_max) = self.b.size_hint();
+
+        // Compute a * b_orig + b for both lower and upper bound
+        size_hint::add(
+            size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()),
+            (b_min * has_cur, b_max.map(move |x| x * has_cur)))
+    }
+
+    fn fold<Acc, G>(mut self, mut accum: Acc, mut f: G) -> Acc
+        where G: FnMut(Acc, Self::Item) -> Acc,
+    {
+        // use a split loop to handle the loose a_cur as well as avoiding to
+        // clone b_orig at the end.
+        if let Some(mut a) = self.a_cur.take() {
+            let mut b = self.b;
+            loop {
+                accum = b.fold(accum, |acc, elt| f(acc, (a.clone(), elt)));
+
+                // we can only continue iterating a if we had a first element;
+                if let Some(next_a) = self.a.next() {
+                    b = self.b_orig.clone();
+                    a = next_a;
+                } else {
+                    break;
+                }
+            }
+        }
+        accum
+    }
+}
+
+/// A “meta iterator adaptor”. Its closure recives a reference to the iterator
+/// and may pick off as many elements as it likes, to produce the next iterator element.
+///
+/// Iterator element type is *X*, if the return type of `F` is *Option\<X\>*.
+///
+/// See [`.batching()`](../trait.Itertools.html#method.batching) for more information.
+#[derive(Clone)]
+pub struct Batching<I, F> {
+    f: F,
+    iter: I,
+}
+
+impl<I, F> fmt::Debug for Batching<I, F> where I: fmt::Debug {
+    debug_fmt_fields!(Batching, iter);
+}
+
+/// Create a new Batching iterator.
+pub fn batching<I, F>(iter: I, f: F) -> Batching<I, F> {
+    Batching { f: f, iter: iter }
+}
+
+impl<B, F, I> Iterator for Batching<I, F>
+    where I: Iterator,
+          F: FnMut(&mut I) -> Option<B>
+{
+    type Item = B;
+    #[inline]
+    fn next(&mut self) -> Option<B> {
+        (self.f)(&mut self.iter)
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // No information about closue behavior
+        (0, None)
+    }
+}
+
+/// An iterator adaptor that steps a number elements in the base iterator
+/// for each iteration.
+///
+/// The iterator steps by yielding the next element from the base iterator,
+/// then skipping forward *n-1* elements.
+///
+/// See [`.step()`](../trait.Itertools.html#method.step) for more information.
+#[derive(Clone, Debug)]
+pub struct Step<I> {
+    iter: Fuse<I>,
+    skip: usize,
+}
+
+/// Create a `Step` iterator.
+///
+/// **Panics** if the step is 0.
+pub fn step<I>(iter: I, step: usize) -> Step<I>
+    where I: Iterator
+{
+    assert!(step != 0);
+    Step {
+        iter: iter.fuse(),
+        skip: step - 1,
+    }
+}
+
+impl<I> Iterator for Step<I>
+    where I: Iterator
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        let elt = self.iter.next();
+        if self.skip > 0 {
+            self.iter.nth(self.skip - 1);
+        }
+        elt
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (low, high) = self.iter.size_hint();
+        let div = |x: usize| {
+            if x == 0 {
+                0
+            } else {
+                1 + (x - 1) / (self.skip + 1)
+            }
+        };
+        (div(low), high.map(div))
+    }
+}
+
+// known size
+impl<I> ExactSizeIterator for Step<I>
+    where I: ExactSizeIterator
+{}
+
+
+struct MergeCore<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    a: Peekable<I>,
+    b: Peekable<J>,
+    fused: Option<bool>,
+}
+
+
+impl<I, J> Clone for MergeCore<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>,
+          Peekable<I>: Clone,
+          Peekable<J>: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(MergeCore, self, a, b, fused)
+    }
+}
+
+impl<I, J> MergeCore<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    fn next_with<F>(&mut self, mut less_than: F) -> Option<I::Item>
+        where F: FnMut(&I::Item, &I::Item) -> bool
+    {
+        let less_than = match self.fused {
+            Some(lt) => lt,
+            None => match (self.a.peek(), self.b.peek()) {
+                (Some(a), Some(b)) => less_than(a, b),
+                (Some(_), None) => {
+                    self.fused = Some(true);
+                    true
+                }
+                (None, Some(_)) => {
+                    self.fused = Some(false);
+                    false
+                }
+                (None, None) => return None,
+            }
+        };
+
+        if less_than {
+            self.a.next()
+        } else {
+            self.b.next()
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // Not ExactSizeIterator because size may be larger than usize
+        size_hint::add(self.a.size_hint(), self.b.size_hint())
+    }
+}
+
+/// An iterator adaptor that merges the two base iterators in ascending order.
+/// If both base iterators are sorted (ascending), the result is sorted.
+///
+/// Iterator element type is `I::Item`.
+///
+/// See [`.merge()`](../trait.Itertools.html#method.merge_by) for more information.
+pub struct Merge<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    merge: MergeCore<I, J>,
+}
+
+impl<I, J> Clone for Merge<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>,
+          Peekable<I>: Clone,
+          Peekable<J>: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(Merge, self, merge)
+    }
+}
+
+impl<I, J> fmt::Debug for Merge<I, J>
+    where I: Iterator + fmt::Debug, J: Iterator<Item = I::Item> + fmt::Debug,
+          I::Item: fmt::Debug,
+{
+    debug_fmt_fields!(Merge, merge.a, merge.b);
+}
+
+/// Create an iterator that merges elements in `i` and `j`.
+///
+/// `IntoIterator` enabled version of `i.merge(j)`.
+///
+/// ```
+/// use itertools::merge;
+///
+/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn merge<I, J>(i: I, j: J) -> Merge<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator<Item = I::Item>,
+          I::Item: PartialOrd
+{
+    Merge {
+        merge: MergeCore {
+            a: i.into_iter().peekable(),
+            b: j.into_iter().peekable(),
+            fused: None,
+        },
+    }
+}
+
+impl<I, J> Iterator for Merge<I, J>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>,
+          I::Item: PartialOrd
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        self.merge.next_with(|a, b| a <= b)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.merge.size_hint()
+    }
+}
+
+/// An iterator adaptor that merges the two base iterators in ascending order.
+/// If both base iterators are sorted (ascending), the result is sorted.
+///
+/// Iterator element type is `I::Item`.
+///
+/// See [`.merge_by()`](../trait.Itertools.html#method.merge_by) for more information.
+pub struct MergeBy<I, J, F>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    merge: MergeCore<I, J>,
+    cmp: F,
+}
+
+impl<I, J, F> fmt::Debug for MergeBy<I, J, F>
+    where I: Iterator + fmt::Debug, J: Iterator<Item = I::Item> + fmt::Debug,
+          I::Item: fmt::Debug,
+{
+    debug_fmt_fields!(MergeBy, merge.a, merge.b);
+}
+
+/// Create a `MergeBy` iterator.
+pub fn merge_by_new<I, J, F>(a: I, b: J, cmp: F) -> MergeBy<I, J, F>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>
+{
+    MergeBy {
+        merge: MergeCore {
+            a: a.peekable(),
+            b: b.peekable(),
+            fused: None,
+        },
+        cmp: cmp,
+    }
+}
+
+impl<I, J, F> Clone for MergeBy<I, J, F>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>,
+          Peekable<I>: Clone,
+          Peekable<J>: Clone,
+          F: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(MergeBy, self, merge, cmp)
+    }
+}
+
+impl<I, J, F> Iterator for MergeBy<I, J, F>
+    where I: Iterator,
+          J: Iterator<Item = I::Item>,
+          F: FnMut(&I::Item, &I::Item) -> bool
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        self.merge.next_with(&mut self.cmp)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.merge.size_hint()
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct CoalesceCore<I>
+    where I: Iterator
+{
+    iter: I,
+    last: Option<I::Item>,
+}
+
+impl<I> CoalesceCore<I>
+    where I: Iterator
+{
+    fn next_with<F>(&mut self, mut f: F) -> Option<I::Item>
+        where F: FnMut(I::Item, I::Item) -> Result<I::Item, (I::Item, I::Item)>
+    {
+        // this fuses the iterator
+        let mut last = match self.last.take() {
+            None => return None,
+            Some(x) => x,
+        };
+        for next in &mut self.iter {
+            match f(last, next) {
+                Ok(joined) => last = joined,
+                Err((last_, next_)) => {
+                    self.last = Some(next_);
+                    return Some(last_);
+                }
+            }
+        }
+
+        Some(last)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (low, hi) = size_hint::add_scalar(self.iter.size_hint(),
+                                              self.last.is_some() as usize);
+        ((low > 0) as usize, hi)
+    }
+}
+
+/// An iterator adaptor that may join together adjacent elements.
+///
+/// See [`.coalesce()`](../trait.Itertools.html#method.coalesce) for more information.
+pub struct Coalesce<I, F>
+    where I: Iterator
+{
+    iter: CoalesceCore<I>,
+    f: F,
+}
+
+impl<I: Clone, F: Clone> Clone for Coalesce<I, F>
+    where I: Iterator,
+          I::Item: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(Coalesce, self, iter, f)
+    }
+}
+
+impl<I, F> fmt::Debug for Coalesce<I, F>
+    where I: Iterator + fmt::Debug,
+          I::Item: fmt::Debug,
+{
+    debug_fmt_fields!(Coalesce, iter);
+}
+
+/// Create a new `Coalesce`.
+pub fn coalesce<I, F>(mut iter: I, f: F) -> Coalesce<I, F>
+    where I: Iterator
+{
+    Coalesce {
+        iter: CoalesceCore {
+            last: iter.next(),
+            iter: iter,
+        },
+        f: f,
+    }
+}
+
+impl<I, F> Iterator for Coalesce<I, F>
+    where I: Iterator,
+          F: FnMut(I::Item, I::Item) -> Result<I::Item, (I::Item, I::Item)>
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        self.iter.next_with(&mut self.f)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+/// An iterator adaptor that removes repeated duplicates.
+///
+/// See [`.dedup()`](../trait.Itertools.html#method.dedup) for more information.
+pub struct Dedup<I>
+    where I: Iterator
+{
+    iter: CoalesceCore<I>,
+}
+
+impl<I: Clone> Clone for Dedup<I>
+    where I: Iterator,
+          I::Item: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(Dedup, self, iter)
+    }
+}
+
+/// Create a new `Dedup`.
+pub fn dedup<I>(mut iter: I) -> Dedup<I>
+    where I: Iterator
+{
+    Dedup {
+        iter: CoalesceCore {
+            last: iter.next(),
+            iter: iter,
+        },
+    }
+}
+
+impl<I> fmt::Debug for Dedup<I>
+    where I: Iterator + fmt::Debug,
+          I::Item: fmt::Debug,
+{
+    debug_fmt_fields!(Dedup, iter);
+}
+
+impl<I> Iterator for Dedup<I>
+    where I: Iterator,
+          I::Item: PartialEq
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        self.iter.next_with(|x, y| {
+            if x == y { Ok(x) } else { Err((x, y)) }
+        })
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+
+    fn fold<Acc, G>(self, mut accum: Acc, mut f: G) -> Acc
+        where G: FnMut(Acc, Self::Item) -> Acc,
+    {
+        if let Some(mut last) = self.iter.last {
+            accum = self.iter.iter.fold(accum, |acc, elt| {
+                if elt == last {
+                    acc
+                } else {
+                    f(acc, replace(&mut last, elt))
+                }
+            });
+            f(accum, last)
+        } else {
+            accum
+        }
+    }
+}
+
+/// An iterator adaptor that borrows from a `Clone`-able iterator
+/// to only pick off elements while the predicate returns `true`.
+///
+/// See [`.take_while_ref()`](../trait.Itertools.html#method.take_while_ref) for more information.
+pub struct TakeWhileRef<'a, I: 'a, F> {
+    iter: &'a mut I,
+    f: F,
+}
+
+impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F>
+    where I: Iterator + fmt::Debug,
+{
+    debug_fmt_fields!(TakeWhileRef, iter);
+}
+
+/// Create a new `TakeWhileRef` from a reference to clonable iterator.
+pub fn take_while_ref<I, F>(iter: &mut I, f: F) -> TakeWhileRef<I, F>
+    where I: Iterator + Clone
+{
+    TakeWhileRef { iter: iter, f: f }
+}
+
+impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F>
+    where I: Iterator + Clone,
+          F: FnMut(&I::Item) -> bool
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        let old = self.iter.clone();
+        match self.iter.next() {
+            None => None,
+            Some(elt) => {
+                if (self.f)(&elt) {
+                    Some(elt)
+                } else {
+                    *self.iter = old;
+                    None
+                }
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+/// An iterator adaptor that filters `Option<A>` iterator elements
+/// and produces `A`. Stops on the first `None` encountered.
+///
+/// See [`.while_some()`](../trait.Itertools.html#method.while_some) for more information.
+#[derive(Clone, Debug)]
+pub struct WhileSome<I> {
+    iter: I,
+}
+
+/// Create a new `WhileSome<I>`.
+pub fn while_some<I>(iter: I) -> WhileSome<I> {
+    WhileSome { iter: iter }
+}
+
+impl<I, A> Iterator for WhileSome<I>
+    where I: Iterator<Item = Option<A>>
+{
+    type Item = A;
+
+    fn next(&mut self) -> Option<A> {
+        match self.iter.next() {
+            None | Some(None) => None,
+            Some(elt) => elt,
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let sh = self.iter.size_hint();
+        (0, sh.1)
+    }
+}
+
+/// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples
+/// of a specific size.
+///
+/// See [`.tuple_combinations()`](../trait.Itertools.html#method.tuple_combinations) for more
+/// information.
+#[derive(Debug)]
+pub struct TupleCombinations<I, T>
+    where I: Iterator,
+          T: HasCombination<I>
+{
+    iter: T::Combination,
+    _mi: PhantomData<I>,
+    _mt: PhantomData<T>
+}
+
+pub trait HasCombination<I>: Sized {
+    type Combination: From<I> + Iterator<Item = Self>;
+}
+
+/// Create a new `TupleCombinations` from a clonable iterator.
+pub fn tuple_combinations<T, I>(iter: I) -> TupleCombinations<I, T>
+    where I: Iterator + Clone,
+          I::Item: Clone,
+          T: HasCombination<I>,
+{
+    TupleCombinations {
+        iter: T::Combination::from(iter),
+        _mi: PhantomData,
+        _mt: PhantomData,
+    }
+}
+
+impl<I, T> Iterator for TupleCombinations<I, T>
+    where I: Iterator,
+          T: HasCombination<I>,
+{
+    type Item = T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next()
+    }
+}
+
+#[derive(Debug)]
+pub struct Tuple1Combination<I> {
+    iter: I,
+}
+
+impl<I> From<I> for Tuple1Combination<I> {
+    fn from(iter: I) -> Self {
+        Tuple1Combination { iter: iter }
+    }
+}
+
+impl<I: Iterator> Iterator for Tuple1Combination<I> {
+    type Item = (I::Item,);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(|x| (x,))
+    }
+}
+
+impl<I: Iterator> HasCombination<I> for (I::Item,) {
+    type Combination = Tuple1Combination<I>;
+}
+
+macro_rules! impl_tuple_combination {
+    ($C:ident $P:ident ; $A:ident, $($I:ident),* ; $($X:ident)*) => (
+        #[derive(Debug)]
+        pub struct $C<I: Iterator> {
+            item: Option<I::Item>,
+            iter: I,
+            c: $P<I>,
+        }
+
+        impl<I: Iterator + Clone> From<I> for $C<I> {
+            fn from(mut iter: I) -> Self {
+                $C {
+                    item: iter.next(),
+                    iter: iter.clone(),
+                    c: $P::from(iter),
+                }
+            }
+        }
+
+        impl<I: Iterator + Clone> From<I> for $C<Fuse<I>> {
+            fn from(iter: I) -> Self {
+                let mut iter = iter.fuse();
+                $C {
+                    item: iter.next(),
+                    iter: iter.clone(),
+                    c: $P::from(iter),
+                }
+            }
+        }
+
+        impl<I, $A> Iterator for $C<I>
+            where I: Iterator<Item = $A> + Clone,
+                  I::Item: Clone
+        {
+            type Item = ($($I),*);
+
+            fn next(&mut self) -> Option<Self::Item> {
+                if let Some(($($X),*,)) = self.c.next() {
+                    let z = self.item.clone().unwrap();
+                    Some((z, $($X),*))
+                } else {
+                    self.item = self.iter.next();
+                    self.item.clone().and_then(|z| {
+                        self.c = $P::from(self.iter.clone());
+                        self.c.next().map(|($($X),*,)| (z, $($X),*))
+                    })
+                }
+            }
+        }
+
+        impl<I, $A> HasCombination<I> for ($($I),*)
+            where I: Iterator<Item = $A> + Clone,
+                  I::Item: Clone
+        {
+            type Combination = $C<Fuse<I>>;
+        }
+    )
+}
+
+impl_tuple_combination!(Tuple2Combination Tuple1Combination ; A, A, A ; a);
+impl_tuple_combination!(Tuple3Combination Tuple2Combination ; A, A, A, A ; a b);
+impl_tuple_combination!(Tuple4Combination Tuple3Combination ; A, A, A, A, A; a b c);
+
+#[derive(Debug)]
+struct LazyBuffer<I: Iterator> {
+    it: I,
+    done: bool,
+    buffer: Vec<I::Item>,
+}
+
+impl<I> LazyBuffer<I>
+    where I: Iterator
+{
+    pub fn new(it: I) -> LazyBuffer<I> {
+        let mut it = it;
+        let mut buffer = Vec::new();
+        let done;
+        if let Some(first) = it.next() {
+            buffer.push(first);
+            done = false;
+        } else {
+            done = true;
+        }
+        LazyBuffer {
+            it: it,
+            done: done,
+            buffer: buffer,
+        }
+    }
+
+    pub fn len(&self) -> usize {
+        self.buffer.len()
+    }
+
+    pub fn is_done(&self) -> bool {
+        self.done
+    }
+
+    pub fn get_next(&mut self) -> bool {
+        if self.done {
+            return false;
+        }
+        let next_item = self.it.next();
+        match next_item {
+            Some(x) => {
+                self.buffer.push(x);
+                true
+            }
+            None => {
+                self.done = true;
+                false
+            }
+        }
+    }
+}
+
+impl<I> Index<usize> for LazyBuffer<I>
+    where I: Iterator,
+          I::Item: Sized
+{
+    type Output = I::Item;
+
+    fn index<'b>(&'b self, _index: usize) -> &'b I::Item {
+        self.buffer.index(_index)
+    }
+}
+
+/// An iterator to iterate through all the `n`-length combinations in an iterator.
+///
+/// See [`.combinations()`](../trait.Itertools.html#method.combinations) for more information.
+pub struct Combinations<I: Iterator> {
+    n: usize,
+    indices: Vec<usize>,
+    pool: LazyBuffer<I>,
+    first: bool,
+}
+
+impl<I> fmt::Debug for Combinations<I>
+    where I: Iterator + fmt::Debug,
+          I::Item: fmt::Debug,
+{
+    debug_fmt_fields!(Combinations, n, indices, pool, first);
+}
+
+/// Create a new `Combinations` from a clonable iterator.
+pub fn combinations<I>(iter: I, n: usize) -> Combinations<I>
+    where I: Iterator
+{
+    let mut indices: Vec<usize> = Vec::with_capacity(n);
+    for i in 0..n {
+        indices.push(i);
+    }
+    let mut pool: LazyBuffer<I> = LazyBuffer::new(iter);
+
+    for _ in 0..n {
+        if !pool.get_next() {
+            break;
+        }
+    }
+
+    Combinations {
+        n: n,
+        indices: indices,
+        pool: pool,
+        first: true,
+    }
+}
+
+impl<I> Iterator for Combinations<I>
+    where I: Iterator,
+          I::Item: Clone
+{
+    type Item = Vec<I::Item>;
+    fn next(&mut self) -> Option<Self::Item> {
+        let mut pool_len = self.pool.len();
+        if self.pool.is_done() {
+            if pool_len == 0 || self.n > pool_len {
+                return None;
+            }
+        }
+
+        if self.first {
+            self.first = false;
+        } else if self.n == 0 {
+            return None;
+        } else {
+            // Scan from the end, looking for an index to increment
+            let mut i: usize = self.n - 1;
+
+            // Check if we need to consume more from the iterator
+            if self.indices[i] == pool_len - 1 && !self.pool.is_done() {
+                if self.pool.get_next() {
+                    pool_len += 1;
+                }
+            }
+
+            while self.indices[i] == i + pool_len - self.n {
+                if i > 0 {
+                    i -= 1;
+                } else {
+                    // Reached the last combination
+                    return None;
+                }
+            }
+
+            // Increment index, and reset the ones to its right
+            self.indices[i] += 1;
+            let mut j = i + 1;
+            while j < self.n {
+                self.indices[j] = self.indices[j - 1] + 1;
+                j += 1;
+            }
+        }
+
+        // Create result vector based on the indices
+        let mut result = Vec::with_capacity(self.n);
+        for i in self.indices.iter() {
+            result.push(self.pool[*i].clone());
+        }
+        Some(result)
+    }
+}
+
+/// An iterator adapter to filter out duplicate elements.
+///
+/// See [`.unique_by()`](../trait.Itertools.html#method.unique) for more information.
+#[derive(Clone)]
+pub struct UniqueBy<I: Iterator, V, F> {
+    iter: I,
+    used: HashSet<V>,
+    f: F,
+}
+
+impl<I, V, F> fmt::Debug for UniqueBy<I, V, F>
+    where I: Iterator + fmt::Debug,
+          V: fmt::Debug + Hash + Eq,
+{
+    debug_fmt_fields!(UniqueBy, iter, used);
+}
+
+/// Create a new `UniqueBy` iterator.
+pub fn unique_by<I, V, F>(iter: I, f: F) -> UniqueBy<I, V, F>
+    where V: Eq + Hash,
+          F: FnMut(&I::Item) -> V,
+          I: Iterator,
+{
+    UniqueBy {
+        iter: iter,
+        used: HashSet::new(),
+        f: f,
+    }
+}
+
+impl<I, V, F> Iterator for UniqueBy<I, V, F>
+    where I: Iterator,
+          V: Eq + Hash,
+          F: FnMut(&I::Item) -> V
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        loop {
+            match self.iter.next() {
+                None => return None,
+                Some(v) => {
+                    let key = (self.f)(&v);
+                    if self.used.insert(key) {
+                        return Some(v);
+                    }
+                }
+            }
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (low, hi) = self.iter.size_hint();
+        ((low > 0 && self.used.is_empty()) as usize, hi)
+    }
+}
+
+impl<I> Iterator for Unique<I>
+    where I: Iterator,
+          I::Item: Eq + Hash + Clone
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        loop {
+            match self.iter.iter.next() {
+                None => return None,
+                Some(v) => {
+                    if !self.iter.used.contains(&v) {
+                        // FIXME: Avoid this double lookup when the entry api allows
+                        self.iter.used.insert(v.clone());
+                        return Some(v);
+                    }
+                }
+            }
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (low, hi) = self.iter.iter.size_hint();
+        ((low > 0 && self.iter.used.is_empty()) as usize, hi)
+    }
+}
+
+/// An iterator adapter to filter out duplicate elements.
+///
+/// See [`.unique()`](../trait.Itertools.html#method.unique) for more information.
+#[derive(Clone)]
+pub struct Unique<I: Iterator> {
+    iter: UniqueBy<I, I::Item, ()>,
+}
+
+impl<I> fmt::Debug for Unique<I>
+    where I: Iterator + fmt::Debug,
+          I::Item: Hash + Eq + fmt::Debug,
+{
+    debug_fmt_fields!(Unique, iter);
+}
+
+pub fn unique<I>(iter: I) -> Unique<I>
+    where I: Iterator,
+          I::Item: Eq + Hash,
+{
+    Unique {
+        iter: UniqueBy {
+            iter: iter,
+            used: HashSet::new(),
+            f: (),
+        }
+    }
+}
+
+/// An iterator adapter to simply flatten a structure.
+///
+/// See [`.flatten()`](../trait.Itertools.html#method.flatten) for more information.
+#[derive(Clone, Debug)]
+pub struct Flatten<I, J> {
+    iter: I,
+    front: Option<J>,
+}
+
+/// Create a new `Flatten` iterator.
+pub fn flatten<I, J>(iter: I) -> Flatten<I, J> {
+    Flatten {
+        iter: iter,
+        front: None,
+    }
+}
+
+impl<I, J> Iterator for Flatten<I, J>
+    where I: Iterator,
+          I::Item: IntoIterator<IntoIter=J, Item=J::Item>,
+          J: Iterator,
+{
+    type Item = J::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        loop {
+            if let Some(ref mut f) = self.front {
+                match f.next() {
+                    elt @ Some(_) => return elt,
+                    None => { }
+                }
+            }
+            if let Some(next_front) = self.iter.next() {
+                self.front = Some(next_front.into_iter());
+            } else {
+                break;
+            }
+        }
+        None
+    }
+
+    // special case to convert segmented iterator into consecutive loops
+    fn fold<Acc, G>(self, init: Acc, mut f: G) -> Acc
+        where G: FnMut(Acc, Self::Item) -> Acc,
+    {
+        let mut accum = init;
+        if let Some(iter) = self.front {
+            accum = fold(iter, accum, &mut f);
+        }
+        self.iter.fold(accum, move |accum, iter| fold(iter, accum, &mut f))
+    }
+}
+
+/// An iterator adapter to apply a transformation within a nested `Result`.
+///
+/// See [`.map_results()`](../trait.Itertools.html#method.map_results) for more information.
+pub struct MapResults<I, F> {
+    iter: I,
+    f: F
+}
+
+/// Create a new `MapResults` iterator.
+pub fn map_results<I, F, T, U, E>(iter: I, f: F) -> MapResults<I, F>
+    where I: Iterator<Item = Result<T, E>>,
+          F: FnMut(T) -> U,
+{
+    MapResults {
+        iter: iter,
+        f: f,
+    }
+}
+
+impl<I, F, T, U, E> Iterator for MapResults<I, F>
+    where I: Iterator<Item = Result<T, E>>,
+          F: FnMut(T) -> U,
+{
+    type Item = Result<U, E>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(|v| v.map(&mut self.f))
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+/// An iterator adapter to get the positions of each element that matches a predicate.
+///
+/// See [`.positions()`](../trait.Itertools.html#method.positions) for more information.
+pub struct Positions<I, F> {
+    iter: I,
+    f: F,
+    count: usize,
+}
+
+/// Create a new `Positions` iterator.
+pub fn positions<I, F>(iter: I, f: F) -> Positions<I, F>
+    where I: Iterator,
+          F: FnMut(I::Item) -> bool,
+{
+    Positions {
+        iter: iter,
+        f: f,
+        count: 0
+    }
+}
+
+impl<I, F> Iterator for Positions<I, F>
+    where I: Iterator,
+          F: FnMut(I::Item) -> bool,
+{
+    type Item = usize;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        while let Some(v) = self.iter.next() {
+            let i = self.count;
+            self.count = i + 1;
+            if (self.f)(v) {
+                return Some(i);
+            }
+        }
+        None
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (0, self.iter.size_hint().1)
+    }
+}
+
+impl<I, F> DoubleEndedIterator for Positions<I, F>
+    where I: DoubleEndedIterator + ExactSizeIterator,
+          F: FnMut(I::Item) -> bool,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        while let Some(v) = self.iter.next_back() {
+            if (self.f)(v) {
+                return Some(self.count + self.iter.len())
+            }
+        }
+        None
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/adaptors/multipeek.rs
@@ -0,0 +1,84 @@
+
+
+use std::iter::Fuse;
+use std::collections::VecDeque;
+use size_hint;
+
+/// See [`multipeek()`](../fn.multipeek.html) for more information.
+#[derive(Clone, Debug)]
+pub struct MultiPeek<I>
+    where I: Iterator
+{
+    iter: Fuse<I>,
+    buf: VecDeque<I::Item>,
+    index: usize,
+}
+
+/// An iterator adaptor that allows the user to peek at multiple `.next()`
+/// values without advancing the base iterator.
+pub fn multipeek<I>(iterable: I) -> MultiPeek<I::IntoIter>
+    where I: IntoIterator
+{
+    MultiPeek {
+        iter: iterable.into_iter().fuse(),
+        buf: VecDeque::new(),
+        index: 0,
+    }
+}
+
+impl<I> MultiPeek<I>
+    where I: Iterator
+{
+    /// Reset the peeking “cursor”
+    pub fn reset_peek(&mut self) {
+        self.index = 0;
+    }
+}
+
+impl<I: Iterator> MultiPeek<I> {
+    /// Works exactly like `.next()` with the only difference that it doesn't
+    /// advance itself. `.peek()` can be called multiple times, to peek
+    /// further ahead.
+    pub fn peek(&mut self) -> Option<&I::Item> {
+        let ret = if self.index < self.buf.len() {
+            Some(&self.buf[self.index])
+        } else {
+            match self.iter.next() {
+                Some(x) => {
+                    self.buf.push_back(x);
+                    Some(&self.buf[self.index])
+                }
+                None => return None,
+            }
+        };
+
+        self.index += 1;
+        ret
+    }
+}
+
+impl<I> Iterator for MultiPeek<I>
+    where I: Iterator
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<I::Item> {
+        self.index = 0;
+        if self.buf.is_empty() {
+            self.iter.next()
+        } else {
+            self.buf.pop_front()
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::add_scalar(self.iter.size_hint(), self.buf.len())
+    }
+}
+
+// Same size
+impl<I> ExactSizeIterator for MultiPeek<I>
+    where I: ExactSizeIterator
+{}
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/concat_impl.rs
@@ -0,0 +1,22 @@
+use Itertools;
+
+/// Combine all an iterator's elements into one element by using `Extend`.
+///
+/// `IntoIterator`-enabled version of `.concat()`
+///
+/// This combinator will extend the first item with each of the rest of the
+/// items of the iterator. If the iterator is empty, the default value of
+/// `I::Item` is returned.
+///
+/// ```rust
+/// use itertools::concat;
+/// 
+/// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]];
+/// assert_eq!(concat(input), vec![1, 2, 3, 4, 5, 6]);
+/// ```
+pub fn concat<I>(iterable: I) -> I::Item
+    where I: IntoIterator,
+          I::Item: Extend<<<I as IntoIterator>::Item as IntoIterator>::Item> + IntoIterator + Default
+{
+    iterable.into_iter().fold1(|mut a, b| { a.extend(b); a }).unwrap_or_else(|| <_>::default())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/cons_tuples_impl.rs
@@ -0,0 +1,66 @@
+
+macro_rules! impl_cons_iter(
+    ($_A:ident, $_B:ident, ) => (); // stop
+
+    ($A:ident, $($B:ident,)*) => (
+        impl_cons_iter!($($B,)*);
+        #[allow(non_snake_case)]
+        impl<X, Iter, $($B),*> Iterator for ConsTuples<Iter, (($($B,)*), X)>
+            where Iter: Iterator<Item = (($($B,)*), X)>,
+        {
+            type Item = ($($B,)* X, );
+            fn next(&mut self) -> Option<Self::Item> {
+                self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, ))
+            }
+
+            fn size_hint(&self) -> (usize, Option<usize>) {
+                self.iter.size_hint()
+            }
+            fn fold<Acc, Fold>(self, accum: Acc, mut f: Fold) -> Acc
+                where Fold: FnMut(Acc, Self::Item) -> Acc,
+            {
+                self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, )))
+            }
+        }
+
+        #[allow(non_snake_case)]
+        impl<X, Iter, $($B),*> DoubleEndedIterator for ConsTuples<Iter, (($($B,)*), X)>
+            where Iter: DoubleEndedIterator<Item = (($($B,)*), X)>,
+        {
+            fn next_back(&mut self) -> Option<Self::Item> {
+                self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, ))
+            }
+        }
+
+    );
+);
+
+impl_cons_iter!(A, B, C, D, E, F, G, H,);
+
+/// An iterator that maps an iterator of tuples like
+/// `((A, B), C)` to an iterator of `(A, B, C)`.
+///
+/// Used by the `iproduct!()` macro.
+pub struct ConsTuples<I, J>
+    where I: Iterator<Item=J>,
+{
+    iter: I,
+}
+
+impl<I, J> Clone for ConsTuples<I, J>
+    where I: Clone + Iterator<Item=J>,
+{
+    fn clone(&self) -> Self {
+        ConsTuples {
+            iter: self.iter.clone(),
+        }
+    }
+}
+
+/// Create an iterator that maps for example iterators of
+/// `((A, B), C)` to `(A, B, C)`.
+pub fn cons_tuples<I, J>(iterable: I) -> ConsTuples<I, J>
+    where I: Iterator<Item=J>
+{
+    ConsTuples { iter: iterable.into_iter() }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/diff.rs
@@ -0,0 +1,61 @@
+//! "Diff"ing iterators for caching elements to sequential collections without requiring the new
+//! elements' iterator to be `Clone`.
+//!
+//! - [**Diff**](./enum.Diff.html) (produced by the [**diff_with**](./fn.diff_with.html) function)
+//! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from
+//! a lock-step comparison.
+
+use free::put_back;
+use structs::PutBack;
+
+/// A type returned by the [`diff_with`](./fn.diff_with.html) function.
+///
+/// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some
+/// iterator `J`.
+pub enum Diff<I, J>
+    where I: Iterator,
+          J: Iterator
+{
+    /// The index of the first non-matching element along with both iterator's remaining elements
+    /// starting with the first mis-match.
+    FirstMismatch(usize, PutBack<I>, PutBack<J>),
+    /// The total number of elements that were in `J` along with the remaining elements of `I`.
+    Shorter(usize, PutBack<I>),
+    /// The total number of elements that were in `I` along with the remaining elements of `J`.
+    Longer(usize, PutBack<J>),
+}
+
+/// Compares every element yielded by both `i` and `j` with the given function in lock-step and
+/// returns a `Diff` which describes how `j` differs from `i`.
+///
+/// If the number of elements yielded by `j` is less than the number of elements yielded by `i`,
+/// the number of `j` elements yielded will be returned along with `i`'s remaining elements as
+/// `Diff::Shorter`.
+///
+/// If the two elements of a step differ, the index of those elements along with the remaining
+/// elements of both `i` and `j` are returned as `Diff::FirstMismatch`.
+///
+/// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with
+/// the remaining `j` elements will be returned as `Diff::Longer`.
+pub fn diff_with<I, J, F>(i: I, j: J, is_equal: F)
+    -> Option<Diff<I::IntoIter, J::IntoIter>>
+    where I: IntoIterator,
+          J: IntoIterator,
+          F: Fn(&I::Item, &J::Item) -> bool
+{
+    let mut i = i.into_iter();
+    let mut j = j.into_iter();
+    let mut idx = 0;
+    while let Some(i_elem) = i.next() {
+        match j.next() {
+            None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))),
+            Some(j_elem) => if !is_equal(&i_elem, &j_elem) {
+                let remaining_i = put_back(i).with_value(i_elem);
+                let remaining_j = put_back(j).with_value(j_elem);
+                return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j));
+            },
+        }
+        idx += 1;
+    }
+    j.next().map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem)))
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/format.rs
@@ -0,0 +1,113 @@
+use std::fmt;
+use std::cell::RefCell;
+
+/// Format all iterator elements lazily, separated by `sep`.
+///
+/// The format value can only be formatted once, after that the iterator is
+/// exhausted.
+///
+/// See [`.format_with()`](../trait.Itertools.html#method.format_with) for more information.
+pub struct FormatWith<'a, I, F> {
+    sep: &'a str,
+    /// FormatWith uses interior mutability because Display::fmt takes &self.
+    inner: RefCell<Option<(I, F)>>,
+}
+
+/// Format all iterator elements lazily, separated by `sep`.
+///
+/// The format value can only be formatted once, after that the iterator is
+/// exhausted.
+///
+/// See [`.format()`](../trait.Itertools.html#method.format)
+/// for more information.
+#[derive(Clone)]
+pub struct Format<'a, I> {
+    sep: &'a str,
+    /// Format uses interior mutability because Display::fmt takes &self.
+    inner: RefCell<Option<I>>,
+}
+
+pub fn new_format<'a, I, F>(iter: I, separator: &'a str, f: F) -> FormatWith<'a, I, F>
+    where I: Iterator,
+          F: FnMut(I::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result
+{
+    FormatWith {
+        sep: separator,
+        inner: RefCell::new(Some((iter, f))),
+    }
+}
+
+pub fn new_format_default<'a, I>(iter: I, separator: &'a str) -> Format<'a, I>
+    where I: Iterator,
+{
+    Format {
+        sep: separator,
+        inner: RefCell::new(Some(iter)),
+    }
+}
+
+impl<'a, I, F> fmt::Display for FormatWith<'a, I, F>
+    where I: Iterator,
+          F: FnMut(I::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let (mut iter, mut format) = match self.inner.borrow_mut().take() {
+            Some(t) => t,
+            None => panic!("FormatWith: was already formatted once"),
+        };
+
+        if let Some(fst) = iter.next() {
+            try!(format(fst, &mut |disp: &fmt::Display| disp.fmt(f)));
+            for elt in iter {
+                if self.sep.len() > 0 {
+
+                    try!(f.write_str(self.sep));
+                }
+                try!(format(elt, &mut |disp: &fmt::Display| disp.fmt(f)));
+            }
+        }
+        Ok(())
+    }
+}
+
+impl<'a, I> Format<'a, I>
+    where I: Iterator,
+{
+    fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result
+        where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result,
+    {
+        let mut iter = match self.inner.borrow_mut().take() {
+            Some(t) => t,
+            None => panic!("Format: was already formatted once"),
+        };
+
+        if let Some(fst) = iter.next() {
+            try!(cb(&fst, f));
+            for elt in iter {
+                if self.sep.len() > 0 {
+                    try!(f.write_str(self.sep));
+                }
+                try!(cb(&elt, f));
+            }
+        }
+        Ok(())
+    }
+}
+
+macro_rules! impl_format {
+    ($($fmt_trait:ident)*) => {
+        $(
+            impl<'a, I> fmt::$fmt_trait for Format<'a, I>
+                where I: Iterator,
+                      I::Item: fmt::$fmt_trait,
+            {
+                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                    self.format(f, fmt::$fmt_trait::fmt)
+                }
+            }
+        )*
+    }
+}
+
+impl_format!{Display Debug
+             UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/free.rs
@@ -0,0 +1,222 @@
+//! Free functions that create iterator adaptors or call iterator methods.
+//!
+//! The benefit of free functions is that they accept any `IntoIterator` as
+//! argument, so the resulting code may be easier to read.
+
+use std::fmt::Display;
+use std::iter::{self, Zip};
+use Itertools;
+
+pub use adaptors::{
+    interleave,
+    merge,
+    put_back,
+    put_back_n,
+};
+pub use adaptors::multipeek::multipeek;
+pub use kmerge_impl::kmerge;
+pub use zip_eq_impl::zip_eq;
+pub use rciter_impl::rciter;
+
+/// Iterate `iterable` with a running index.
+///
+/// `IntoIterator` enabled version of `.enumerate()`.
+///
+/// ```
+/// use itertools::enumerate;
+///
+/// for (i, elt) in enumerate(&[1, 2, 3]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter>
+    where I: IntoIterator
+{
+    iterable.into_iter().enumerate()
+}
+
+/// Iterate `iterable` in reverse.
+///
+/// `IntoIterator` enabled version of `.rev()`.
+///
+/// ```
+/// use itertools::rev;
+///
+/// for elt in rev(&[1, 2, 3]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter>
+    where I: IntoIterator,
+          I::IntoIter: DoubleEndedIterator
+{
+    iterable.into_iter().rev()
+}
+
+/// Iterate `i` and `j` in lock step.
+///
+/// `IntoIterator` enabled version of `i.zip(j)`.
+///
+/// ```
+/// use itertools::zip;
+///
+/// let data = [1, 2, 3, 4, 5];
+/// for (a, b) in zip(&data, &data[1..]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn zip<I, J>(i: I, j: J) -> Zip<I::IntoIter, J::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator
+{
+    i.into_iter().zip(j)
+}
+
+/// Create an iterator that first iterates `i` and then `j`.
+///
+/// `IntoIterator` enabled version of `i.chain(j)`.
+///
+/// ```
+/// use itertools::chain;
+///
+/// for elt in chain(&[1, 2, 3], &[4]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn chain<I, J>(i: I, j: J) -> iter::Chain<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator<Item = I::Item>
+{
+    i.into_iter().chain(j)
+}
+
+/// Create an iterator that clones each element from &T to T
+///
+/// `IntoIterator` enabled version of `i.cloned()`.
+///
+/// ```
+/// use itertools::cloned;
+///
+/// assert_eq!(cloned(b"abc").next(), Some(b'a'));
+/// ```
+pub fn cloned<'a, I, T: 'a>(iterable: I) -> iter::Cloned<I::IntoIter>
+    where I: IntoIterator<Item=&'a T>,
+          T: Clone,
+{
+    iterable.into_iter().cloned()
+}
+
+/// Perform a fold operation over the iterable.
+///
+/// `IntoIterator` enabled version of `i.fold(init, f)`
+///
+/// ```
+/// use itertools::fold;
+///
+/// assert_eq!(fold(&[1., 2., 3.], 0., |a, &b| f32::max(a, b)), 3.);
+/// ```
+pub fn fold<I, B, F>(iterable: I, init: B, f: F) -> B
+    where I: IntoIterator,
+          F: FnMut(B, I::Item) -> B
+{
+    iterable.into_iter().fold(init, f)
+}
+
+/// Test whether the predicate holds for all elements in the iterable.
+///
+/// `IntoIterator` enabled version of `i.all(f)`
+///
+/// ```
+/// use itertools::all;
+///
+/// assert!(all(&[1, 2, 3], |elt| *elt > 0));
+/// ```
+pub fn all<I, F>(iterable: I, f: F) -> bool
+    where I: IntoIterator,
+          F: FnMut(I::Item) -> bool
+{
+    iterable.into_iter().all(f)
+}
+
+/// Test whether the predicate holds for any elements in the iterable.
+///
+/// `IntoIterator` enabled version of `i.any(f)`
+///
+/// ```
+/// use itertools::any;
+///
+/// assert!(any(&[0, -1, 2], |elt| *elt > 0));
+/// ```
+pub fn any<I, F>(iterable: I, f: F) -> bool
+    where I: IntoIterator,
+          F: FnMut(I::Item) -> bool
+{
+    iterable.into_iter().any(f)
+}
+
+/// Return the maximum value of the iterable.
+///
+/// `IntoIterator` enabled version of `i.max()`.
+///
+/// ```
+/// use itertools::max;
+///
+/// assert_eq!(max(0..10), Some(9));
+/// ```
+pub fn max<I>(iterable: I) -> Option<I::Item>
+    where I: IntoIterator,
+          I::Item: Ord
+{
+    iterable.into_iter().max()
+}
+
+/// Return the minimum value of the iterable.
+///
+/// `IntoIterator` enabled version of `i.min()`.
+///
+/// ```
+/// use itertools::min;
+///
+/// assert_eq!(min(0..10), Some(0));
+/// ```
+pub fn min<I>(iterable: I) -> Option<I::Item>
+    where I: IntoIterator,
+          I::Item: Ord
+{
+    iterable.into_iter().min()
+}
+
+
+/// Combine all iterator elements into one String, seperated by `sep`.
+///
+/// `IntoIterator` enabled version of `iterable.join(sep)`.
+///
+/// ```
+/// use itertools::join;
+///
+/// assert_eq!(join(&[1, 2, 3], ", "), "1, 2, 3");
+/// ```
+pub fn join<I>(iterable: I, sep: &str) -> String
+    where I: IntoIterator,
+          I::Item: Display
+{
+    iterable.into_iter().join(sep)
+}
+
+/// Collect all the iterable's elements into a sorted vector in ascending order.
+///
+/// `IntoIterator` enabled version of `iterable.sorted()`.
+///
+/// ```
+/// use itertools::sorted;
+/// use itertools::assert_equal;
+///
+/// assert_equal(sorted("rust".chars()), "rstu".chars());
+/// ```
+pub fn sorted<I>(iterable: I) -> Vec<I::Item>
+    where I: IntoIterator,
+          I::Item: Ord
+{
+    iterable.into_iter().sorted()
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/groupbylazy.rs
@@ -0,0 +1,566 @@
+use std::cell::{Cell, RefCell};
+use std::vec;
+
+/// A trait to unify FnMut for GroupBy with the chunk key in IntoChunks
+trait KeyFunction<A> {
+    type Key;
+    fn call_mut(&mut self, arg: A) -> Self::Key;
+}
+
+impl<'a, A, K, F: ?Sized> KeyFunction<A> for F
+    where F: FnMut(A) -> K
+{
+    type Key = K;
+    #[inline]
+    fn call_mut(&mut self, arg: A) -> Self::Key {
+        (*self)(arg)
+    }
+}
+
+
+/// ChunkIndex acts like the grouping key function for IntoChunks
+struct ChunkIndex {
+    size: usize,
+    index: usize,
+    key: usize,
+}
+
+impl ChunkIndex {
+    #[inline(always)]
+    fn new(size: usize) -> Self {
+        ChunkIndex {
+            size: size,
+            index: 0,
+            key: 0,
+        }
+    }
+}
+
+impl<'a, A> KeyFunction<A> for ChunkIndex {
+    type Key = usize;
+    #[inline(always)]
+    fn call_mut(&mut self, _arg: A) -> Self::Key {
+        if self.index == self.size {
+            self.key += 1;
+            self.index = 0;
+        }
+        self.index += 1;
+        self.key
+    }
+}
+
+
+struct GroupInner<K, I, F>
+    where I: Iterator
+{
+    key: F,
+    iter: I,
+    current_key: Option<K>,
+    current_elt: Option<I::Item>,
+    /// flag set if iterator is exhausted
+    done: bool,
+    /// Index of group we are currently buffering or visiting
+    top_group: usize,
+    /// Least index for which we still have elements buffered
+    oldest_buffered_group: usize,
+    /// Group index for `buffer[0]` -- the slots
+    /// bottom_group..oldest_buffered_group are unused and will be erased when
+    /// that range is large enough.
+    bottom_group: usize,
+    /// Buffered groups, from `bottom_group` (index 0) to `top_group`.
+    buffer: Vec<vec::IntoIter<I::Item>>,
+    /// index of last group iter that was dropped, usize::MAX == none
+    dropped_group: usize,
+}
+
+impl<K, I, F> GroupInner<K, I, F>
+    where I: Iterator,
+          F: for<'a> KeyFunction<&'a I::Item, Key=K>,
+          K: PartialEq,
+{
+    /// `client`: Index of group that requests next element
+    #[inline(always)]
+    fn step(&mut self, client: usize) -> Option<I::Item> {
+        /*
+        println!("client={}, bottom_group={}, oldest_buffered_group={}, top_group={}, buffers=[{}]",
+                 client, self.bottom_group, self.oldest_buffered_group,
+                 self.top_group,
+                 self.buffer.iter().map(|elt| elt.len()).format(", "));
+        */
+        if client < self.oldest_buffered_group {
+            None
+        } else if client < self.top_group ||
+            (client == self.top_group &&
+             self.buffer.len() > self.top_group - self.bottom_group)
+        {
+            self.lookup_buffer(client)
+        } else if self.done {
+            None
+        } else if self.top_group == client {
+            self.step_current()
+        } else {
+            self.step_buffering(client)
+        }
+    }
+
+    #[inline(never)]
+    fn lookup_buffer(&mut self, client: usize) -> Option<I::Item> {
+        // if `bufidx` doesn't exist in self.buffer, it might be empty
+        let bufidx = client - self.bottom_group;
+        if client < self.oldest_buffered_group {
+            return None;
+        }
+        let elt = self.buffer.get_mut(bufidx).and_then(|queue| queue.next());
+        if elt.is_none() && client == self.oldest_buffered_group {
+            // FIXME: VecDeque is unfortunately not zero allocation when empty,
+            // so we do this job manually.
+            // `bottom_group..oldest_buffered_group` is unused, and if it's large enough, erase it.
+            self.oldest_buffered_group += 1;
+            // skip forward further empty queues too
+            while self.buffer.get(self.oldest_buffered_group - self.bottom_group)
+                             .map_or(false, |buf| buf.len() == 0)
+            {
+                self.oldest_buffered_group += 1;
+            }
+
+            let nclear = self.oldest_buffered_group - self.bottom_group;
+            if nclear > 0 && nclear >= self.buffer.len() / 2 {
+                let mut i = 0;
+                self.buffer.retain(|buf| {
+                    i += 1;
+                    debug_assert!(buf.len() == 0 || i > nclear);
+                    i > nclear
+                });
+                self.bottom_group = self.oldest_buffered_group;
+            }
+        }
+        elt
+    }
+
+    /// Take the next element from the iterator, and set the done
+    /// flag if exhausted. Must not be called after done.
+    #[inline(always)]
+    fn next_element(&mut self) -> Option<I::Item> {
+        debug_assert!(!self.done);
+        match self.iter.next() {
+            None => { self.done = true; None }
+            otherwise => otherwise,
+        }
+    }
+
+
+    #[inline(never)]
+    fn step_buffering(&mut self, client: usize) -> Option<I::Item> {
+        // requested a later group -- walk through the current group up to
+        // the requested group index, and buffer the elements (unless
+        // the group is marked as dropped).
+        // Because the `Groups` iterator is always the first to request
+        // each group index, client is the next index efter top_group.
+        debug_assert!(self.top_group + 1 == client);
+        let mut group = Vec::new();
+
+        if let Some(elt) = self.current_elt.take() {
+            if self.top_group != self.dropped_group {
+                group.push(elt);
+            }
+        }
+        let mut first_elt = None; // first element of the next group
+
+        while let Some(elt) = self.next_element() {
+            let key = self.key.call_mut(&elt);
+            match self.current_key.take() {
+                None => {}
+                Some(old_key) => if old_key != key {
+                    self.current_key = Some(key);
+                    first_elt = Some(elt);
+                    break;
+                },
+            }
+            self.current_key = Some(key);
+            if self.top_group != self.dropped_group {
+                group.push(elt);
+            }
+        }
+
+        if self.top_group != self.dropped_group {
+            self.push_next_group(group);
+        }
+        if first_elt.is_some() {
+            self.top_group += 1;
+            debug_assert!(self.top_group == client);
+        }
+        first_elt
+    }
+
+    fn push_next_group(&mut self, group: Vec<I::Item>) {
+        // When we add a new buffered group, fill up slots between oldest_buffered_group and top_group
+        while self.top_group - self.bottom_group > self.buffer.len() {
+            if self.buffer.is_empty() {
+                self.bottom_group += 1;
+                self.oldest_buffered_group += 1;
+            } else {
+                self.buffer.push(Vec::new().into_iter());
+            }
+        }
+        self.buffer.push(group.into_iter());
+        debug_assert!(self.top_group + 1 - self.bottom_group == self.buffer.len());
+    }
+
+    /// This is the immediate case, where we use no buffering
+    #[inline]
+    fn step_current(&mut self) -> Option<I::Item> {
+        debug_assert!(!self.done);
+        if let elt @ Some(..) = self.current_elt.take() {
+            return elt;
+        }
+        match self.next_element() {
+            None => None,
+            Some(elt) => {
+                let key = self.key.call_mut(&elt);
+                match self.current_key.take() {
+                    None => {}
+                    Some(old_key) => if old_key != key {
+                        self.current_key = Some(key);
+                        self.current_elt = Some(elt);
+                        self.top_group += 1;
+                        return None;
+                    },
+                }
+                self.current_key = Some(key);
+                Some(elt)
+            }
+        }
+    }
+
+    /// Request the just started groups' key.
+    ///
+    /// `client`: Index of group
+    ///
+    /// **Panics** if no group key is available.
+    fn group_key(&mut self, client: usize) -> K {
+        // This can only be called after we have just returned the first
+        // element of a group.
+        // Perform this by simply buffering one more element, grabbing the
+        // next key.
+        debug_assert!(!self.done);
+        debug_assert!(client == self.top_group);
+        debug_assert!(self.current_key.is_some());
+        debug_assert!(self.current_elt.is_none());
+        let old_key = self.current_key.take().unwrap();
+        if let Some(elt) = self.next_element() {
+            let key = self.key.call_mut(&elt);
+            if old_key != key {
+                self.top_group += 1;
+            }
+            self.current_key = Some(key);
+            self.current_elt = Some(elt);
+        }
+        old_key
+    }
+}
+
+impl<K, I, F> GroupInner<K, I, F>
+    where I: Iterator,
+{
+    /// Called when a group is dropped
+    fn drop_group(&mut self, client: usize) {
+        // It's only useful to track the maximal index
+        if self.dropped_group == !0 || client > self.dropped_group {
+            self.dropped_group = client;
+        }
+    }
+}
+
+/// `GroupBy` is the storage for the lazy grouping operation.
+///
+/// If the groups are consumed in their original order, or if each
+/// group is dropped without keeping it around, then `GroupBy` uses
+/// no allocations. It needs allocations only if several group iterators
+/// are alive at the same time.
+///
+/// This type implements `IntoIterator` (it is **not** an iterator
+/// itself), because the group iterators need to borrow from this
+/// value. It should be stored in a local variable or temporary and
+/// iterated.
+///
+/// See [`.group_by()`](../trait.Itertools.html#method.group_by) for more information.
+pub struct GroupBy<K, I, F>
+    where I: Iterator,
+{
+    inner: RefCell<GroupInner<K, I, F>>,
+    // the group iterator's current index. Keep this in the main value
+    // so that simultaneous iterators all use the same state.
+    index: Cell<usize>,
+}
+
+/// Create a new
+pub fn new<K, J, F>(iter: J, f: F) -> GroupBy<K, J::IntoIter, F>
+    where J: IntoIterator,
+          F: FnMut(&J::Item) -> K,
+{
+    GroupBy {
+        inner: RefCell::new(GroupInner {
+            key: f,
+            iter: iter.into_iter(),
+            current_key: None,
+            current_elt: None,
+            done: false,
+            top_group: 0,
+            oldest_buffered_group: 0,
+            bottom_group: 0,
+            buffer: Vec::new(),
+            dropped_group: !0,
+        }),
+        index: Cell::new(0),
+    }
+}
+
+impl<K, I, F> GroupBy<K, I, F>
+    where I: Iterator,
+{
+    /// `client`: Index of group that requests next element
+    fn step(&self, client: usize) -> Option<I::Item>
+        where F: FnMut(&I::Item) -> K,
+              K: PartialEq,
+    {
+        self.inner.borrow_mut().step(client)
+    }
+
+    /// `client`: Index of group
+    fn drop_group(&self, client: usize) {
+        self.inner.borrow_mut().drop_group(client)
+    }
+}
+
+impl<'a, K, I, F> IntoIterator for &'a GroupBy<K, I, F>
+    where I: Iterator,
+          I::Item: 'a,
+          F: FnMut(&I::Item) -> K,
+          K: PartialEq
+{
+    type Item = (K, Group<'a, K, I, F>);
+    type IntoIter = Groups<'a, K, I, F>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        Groups { parent: self }
+    }
+}
+
+
+/// An iterator that yields the Group iterators.
+///
+/// Iterator element type is `(K, Group)`:
+/// the group's key `K` and the group's iterator.
+///
+/// See [`.group_by()`](../trait.Itertools.html#method.group_by) for more information.
+pub struct Groups<'a, K: 'a, I: 'a, F: 'a>
+    where I: Iterator,
+          I::Item: 'a
+{
+    parent: &'a GroupBy<K, I, F>,
+}
+
+impl<'a, K, I, F> Iterator for Groups<'a, K, I, F>
+    where I: Iterator,
+          I::Item: 'a,
+          F: FnMut(&I::Item) -> K,
+          K: PartialEq
+{
+    type Item = (K, Group<'a, K, I, F>);
+
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        let index = self.parent.index.get();
+        self.parent.index.set(index + 1);
+        let inner = &mut *self.parent.inner.borrow_mut();
+        inner.step(index).map(|elt| {
+            let key = inner.group_key(index);
+            (key, Group {
+                parent: self.parent,
+                index: index,
+                first: Some(elt),
+            })
+        })
+    }
+}
+
+/// An iterator for the elements in a single group.
+///
+/// Iterator element type is `I::Item`.
+pub struct Group<'a, K: 'a, I: 'a, F: 'a>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    parent: &'a GroupBy<K, I, F>,
+    index: usize,
+    first: Option<I::Item>,
+}
+
+impl<'a, K, I, F> Drop for Group<'a, K, I, F>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    fn drop(&mut self) {
+        self.parent.drop_group(self.index);
+    }
+}
+
+impl<'a, K, I, F> Iterator for Group<'a, K, I, F>
+    where I: Iterator,
+          I::Item: 'a,
+          F: FnMut(&I::Item) -> K,
+          K: PartialEq,
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        if let elt @ Some(..) = self.first.take() {
+            return elt;
+        }
+        self.parent.step(self.index)
+    }
+}
+
+///// IntoChunks /////
+
+/// Create a new
+pub fn new_chunks<J>(iter: J, size: usize) -> IntoChunks<J::IntoIter>
+    where J: IntoIterator,
+{
+    IntoChunks {
+        inner: RefCell::new(GroupInner {
+            key: ChunkIndex::new(size),
+            iter: iter.into_iter(),
+            current_key: None,
+            current_elt: None,
+            done: false,
+            top_group: 0,
+            oldest_buffered_group: 0,
+            bottom_group: 0,
+            buffer: Vec::new(),
+            dropped_group: !0,
+        }),
+        index: Cell::new(0),
+    }
+}
+
+
+/// `ChunkLazy` is the storage for a lazy chunking operation.
+///
+/// `IntoChunks` behaves just like `GroupBy`: it is iterable, and
+/// it only buffers if several chunk iterators are alive at the same time.
+///
+/// This type implements `IntoIterator` (it is **not** an iterator
+/// itself), because the chunk iterators need to borrow from this
+/// value. It should be stored in a local variable or temporary and
+/// iterated.
+///
+/// Iterator element type is `Chunk`, each chunk's iterator.
+///
+/// See [`.chunks()`](../trait.Itertools.html#method.chunks) for more information.
+pub struct IntoChunks<I>
+    where I: Iterator,
+{
+    inner: RefCell<GroupInner<usize, I, ChunkIndex>>,
+    // the chunk iterator's current index. Keep this in the main value
+    // so that simultaneous iterators all use the same state.
+    index: Cell<usize>,
+}
+
+
+impl<I> IntoChunks<I>
+    where I: Iterator,
+{
+    /// `client`: Index of chunk that requests next element
+    fn step(&self, client: usize) -> Option<I::Item> {
+        self.inner.borrow_mut().step(client)
+    }
+
+    /// `client`: Index of chunk
+    fn drop_group(&self, client: usize) {
+        self.inner.borrow_mut().drop_group(client)
+    }
+}
+
+impl<'a, I> IntoIterator for &'a IntoChunks<I>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    type Item = Chunk<'a, I>;
+    type IntoIter = Chunks<'a, I>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        Chunks {
+            parent: self,
+        }
+    }
+}
+
+
+/// An iterator that yields the Chunk iterators.
+///
+/// Iterator element type is `Chunk`.
+///
+/// See [`.chunks()`](../trait.Itertools.html#method.chunks) for more information.
+pub struct Chunks<'a, I: 'a>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    parent: &'a IntoChunks<I>,
+}
+
+impl<'a, I> Iterator for Chunks<'a, I>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    type Item = Chunk<'a, I>;
+
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        let index = self.parent.index.get();
+        self.parent.index.set(index + 1);
+        let inner = &mut *self.parent.inner.borrow_mut();
+        inner.step(index).map(|elt| {
+            Chunk {
+                parent: self.parent,
+                index: index,
+                first: Some(elt),
+            }
+        })
+    }
+}
+
+/// An iterator for the elements in a single chunk.
+///
+/// Iterator element type is `I::Item`.
+pub struct Chunk<'a, I: 'a>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    parent: &'a IntoChunks<I>,
+    index: usize,
+    first: Option<I::Item>,
+}
+
+impl<'a, I> Drop for Chunk<'a, I>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    fn drop(&mut self) {
+        self.parent.drop_group(self.index);
+    }
+}
+
+impl<'a, I> Iterator for Chunk<'a, I>
+    where I: Iterator,
+          I::Item: 'a,
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        if let elt @ Some(..) = self.first.take() {
+            return elt;
+        }
+        self.parent.step(self.index)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/impl_macros.rs
@@ -0,0 +1,14 @@
+//! 
+//! Implementation's internal macros
+
+macro_rules! debug_fmt_fields {
+    ($tyname:ident, $($($field:ident).+),*) => {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+            f.debug_struct(stringify!($tyname))
+                $(
+              .field(stringify!($($field).+), &self.$($field).+)
+              )*
+              .finish()
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/intersperse.rs
@@ -0,0 +1,58 @@
+use std::iter::Fuse;
+use super::size_hint;
+
+#[derive(Clone)]
+/// An iterator adaptor to insert a particular value
+/// between each element of the adapted iterator.
+///
+/// Iterator element type is `I::Item`
+///
+/// This iterator is *fused*.
+///
+/// See [`.intersperse()`](../trait.Itertools.html#method.intersperse) for more information.
+pub struct Intersperse<I>
+    where I: Iterator
+{
+    element: I::Item,
+    iter: Fuse<I>,
+    peek: Option<I::Item>,
+}
+
+/// Create a new Intersperse iterator
+pub fn intersperse<I>(iter: I, elt: I::Item) -> Intersperse<I>
+    where I: Iterator
+{
+    let mut iter = iter.fuse();
+    Intersperse {
+        peek: iter.next(),
+        iter: iter,
+        element: elt,
+    }
+}
+
+impl<I> Iterator for Intersperse<I>
+    where I: Iterator,
+          I::Item: Clone
+{
+    type Item = I::Item;
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        if self.peek.is_some() {
+            self.peek.take()
+        } else {
+            self.peek = self.iter.next();
+            if self.peek.is_some() {
+                Some(self.element.clone())
+            } else {
+                None
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // 2 * SH + { 1 or 0 }
+        let has_peek = self.peek.is_some() as usize;
+        let sh = self.iter.size_hint();
+        size_hint::add_scalar(size_hint::add(sh, sh), has_peek)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/kmerge_impl.rs
@@ -0,0 +1,238 @@
+
+use size_hint;
+use Itertools;
+
+use std::mem::replace;
+
+macro_rules! clone_fields {
+    ($name:ident, $base:expr, $($field:ident),+) => (
+        $name {
+            $(
+                $field : $base . $field .clone()
+            ),*
+        }
+    );
+}
+
+/// Head element and Tail iterator pair
+///
+/// `PartialEq`, `Eq`, `PartialOrd` and `Ord` are implemented by comparing sequences based on
+/// first items (which are guaranteed to exist).
+///
+/// The meanings of `PartialOrd` and `Ord` are reversed so as to turn the heap used in
+/// `KMerge` into a min-heap.
+struct HeadTail<I>
+    where I: Iterator
+{
+    head: I::Item,
+    tail: I,
+}
+
+impl<I> HeadTail<I>
+    where I: Iterator
+{
+    /// Constructs a `HeadTail` from an `Iterator`. Returns `None` if the `Iterator` is empty.
+    fn new(mut it: I) -> Option<HeadTail<I>> {
+        let head = it.next();
+        head.map(|h| {
+            HeadTail {
+                head: h,
+                tail: it,
+            }
+        })
+    }
+
+    /// Get the next element and update `head`, returning the old head in `Some`.
+    ///
+    /// Returns `None` when the tail is exhausted (only `head` then remains).
+    fn next(&mut self) -> Option<I::Item> {
+        if let Some(next) = self.tail.next() {
+            Some(replace(&mut self.head, next))
+        } else {
+            None
+        }
+    }
+
+    /// Hints at the size of the sequence, same as the `Iterator` method.
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::add_scalar(self.tail.size_hint(), 1)
+    }
+}
+
+impl<I> Clone for HeadTail<I>
+    where I: Iterator + Clone,
+          I::Item: Clone
+{
+    fn clone(&self) -> Self {
+        clone_fields!(HeadTail, self, head, tail)
+    }
+}
+
+/// Make `data` a heap (min-heap w.r.t the sorting).
+fn heapify<T, S>(data: &mut [T], mut less_than: S)
+    where S: FnMut(&T, &T) -> bool
+{
+    for i in (0..data.len() / 2).rev() {
+        sift_down(data, i, &mut less_than);
+    }
+}
+
+/// Sift down element at `index` (`heap` is a min-heap wrt the ordering)
+fn sift_down<T, S>(heap: &mut [T], index: usize, mut less_than: S)
+    where S: FnMut(&T, &T) -> bool
+{
+    debug_assert!(index <= heap.len());
+    let mut pos = index;
+    let mut child = 2 * pos + 1;
+    // the `pos` conditional is to avoid a bounds check
+    while pos < heap.len() && child < heap.len() {
+        let right = child + 1;
+
+        // pick the smaller of the two children
+        if right < heap.len() && less_than(&heap[right], &heap[child]) {
+            child = right;
+        }
+
+        // sift down is done if we are already in order
+        if !less_than(&heap[child], &heap[pos]) {
+            return;
+        }
+        heap.swap(pos, child);
+        pos = child;
+        child = 2 * pos + 1;
+    }
+}
+
+/// An iterator adaptor that merges an abitrary number of base iterators in ascending order.
+/// If all base iterators are sorted (ascending), the result is sorted.
+///
+/// Iterator element type is `I::Item`.
+///
+/// See [`.kmerge()`](../trait.Itertools.html#method.kmerge) for more information.
+pub struct KMerge<I>
+    where I: Iterator
+{
+    heap: Vec<HeadTail<I>>,
+}
+
+/// Create an iterator that merges elements of the contained iterators using
+/// the ordering function.
+///
+/// Equivalent to `iterable.into_iter().kmerge()`.
+///
+/// ```
+/// use itertools::kmerge;
+///
+/// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn kmerge<I>(iterable: I) -> KMerge<<I::Item as IntoIterator>::IntoIter>
+    where I: IntoIterator,
+          I::Item: IntoIterator,
+          <<I as IntoIterator>::Item as IntoIterator>::Item: PartialOrd
+{
+    let iter = iterable.into_iter();
+    let (lower, _) = iter.size_hint();
+    let mut heap = Vec::with_capacity(lower);
+    heap.extend(iter.filter_map(|it| HeadTail::new(it.into_iter())));
+    heapify(&mut heap, |a, b| a.head < b.head);
+    KMerge { heap: heap }
+}
+
+impl<I> Clone for KMerge<I>
+    where I: Iterator + Clone,
+          I::Item: Clone
+{
+    fn clone(&self) -> KMerge<I> {
+        clone_fields!(KMerge, self, heap)
+    }
+}
+
+impl<I> Iterator for KMerge<I>
+    where I: Iterator,
+          I::Item: PartialOrd
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        if self.heap.is_empty() {
+            return None;
+        }
+        let result = if let Some(next) = self.heap[0].next() {
+            next
+        } else {
+            self.heap.swap_remove(0).head
+        };
+        sift_down(&mut self.heap, 0, |a, b| a.head < b.head);
+        Some(result)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.heap.iter()
+                 .map(|i| i.size_hint())
+                 .fold1(size_hint::add)
+                 .unwrap_or((0, Some(0)))
+    }
+}
+
+/// An iterator adaptor that merges an abitrary number of base iterators
+/// according to an ordering function.
+///
+/// Iterator element type is `I::Item`.
+///
+/// See [`.kmerge_by()`](../trait.Itertools.html#method.kmerge_by) for more
+/// information.
+pub struct KMergeBy<I, F>
+    where I: Iterator,
+{
+    heap: Vec<HeadTail<I>>,
+    less_than: F,
+}
+
+/// Create an iterator that merges elements of the contained iterators.
+///
+/// Equivalent to `iterable.into_iter().kmerge_by(less_than)`.
+pub fn kmerge_by<I, F>(iterable: I, mut less_than: F)
+    -> KMergeBy<<I::Item as IntoIterator>::IntoIter, F>
+    where I: IntoIterator,
+          I::Item: IntoIterator,
+          F: FnMut(&<<I as IntoIterator>::Item as IntoIterator>::Item,
+                   &<<I as IntoIterator>::Item as IntoIterator>::Item) -> bool
+{
+    let iter = iterable.into_iter();
+    let (lower, _) = iter.size_hint();
+    let mut heap: Vec<_> = Vec::with_capacity(lower);
+    heap.extend(iter.filter_map(|it| HeadTail::new(it.into_iter())));
+    heapify(&mut heap, |a, b| less_than(&a.head, &b.head));
+    KMergeBy { heap: heap, less_than: less_than }
+}
+
+
+impl<I, F> Iterator for KMergeBy<I, F>
+    where I: Iterator,
+          F: FnMut(&I::Item, &I::Item) -> bool
+{
+    type Item = I::Item;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        if self.heap.is_empty() {
+            return None;
+        }
+        let result = if let Some(next) = self.heap[0].next() {
+            next
+        } else {
+            self.heap.swap_remove(0).head
+        };
+        let less_than = &mut self.less_than;
+        sift_down(&mut self.heap, 0, |a, b| less_than(&a.head, &b.head));
+        Some(result)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.heap.iter()
+                 .map(|i| i.size_hint())
+                 .fold1(size_hint::add)
+                 .unwrap_or((0, Some(0)))
+    }
+}
new file mode 100755
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/lib.rs
@@ -0,0 +1,1738 @@
+#![warn(missing_docs)]
+#![crate_name="itertools"]
+
+//! Itertools — extra iterator adaptors, functions and macros.
+//!
+//! To use the iterator methods in this crate, import the [`Itertools` trait](./trait.Itertools.html):
+//!
+//! ```ignore
+//! use itertools::Itertools;
+//! ```
+//!
+//! ## Rust Version
+//!
+//! This version of itertools requires Rust 1.12 or later.
+//!
+#![doc(html_root_url="https://docs.rs/itertools/")]
+
+extern crate either;
+
+pub use either::Either;
+
+use std::iter::{IntoIterator};
+use std::fmt::Write;
+use std::cmp::Ordering;
+use std::fmt;
+use std::hash::Hash;
+
+#[macro_use]
+mod impl_macros;
+
+/// The concrete iterator types.
+pub mod structs {
+    pub use adaptors::{
+        Dedup,
+        Interleave,
+        InterleaveShortest,
+        Product,
+        PutBack,
+        PutBackN,
+        Batching,
+        Step,
+        MapResults,
+        Merge,
+        MergeBy,
+        MultiPeek,
+        TakeWhileRef,
+        WhileSome,
+        Coalesce,
+        TupleCombinations,
+        Combinations,
+        Unique,
+        UniqueBy,
+        Flatten,
+        Positions,
+    };
+    pub use cons_tuples_impl::ConsTuples;
+    pub use format::{Format, FormatWith};
+    pub use groupbylazy::{IntoChunks, Chunk, Chunks, GroupBy, Group, Groups};
+    pub use intersperse::Intersperse;
+    pub use kmerge_impl::{KMerge, KMergeBy};
+    pub use pad_tail::PadUsing;
+    pub use peeking_take_while::PeekingTakeWhile;
+    pub use process_results_impl::ProcessResults;
+    pub use rciter_impl::RcIter;
+    pub use repeatn::RepeatN;
+    pub use sources::{RepeatCall, Unfold, Iterate};
+    pub use tee::Tee;
+    pub use tuple_impl::{TupleBuffer, TupleWindows, Tuples};
+    pub use with_position::WithPosition;
+    pub use zip_eq_impl::ZipEq;
+    pub use zip_longest::ZipLongest;
+    pub use ziptuple::Zip;
+}
+pub use structs::*;
+pub use concat_impl::concat;
+pub use cons_tuples_impl::cons_tuples;
+pub use diff::diff_with;
+pub use diff::Diff;
+pub use kmerge_impl::{kmerge_by};
+pub use minmax::MinMaxResult;
+pub use peeking_take_while::PeekingNext;
+pub use process_results_impl::process_results;
+pub use repeatn::repeat_n;
+pub use sources::{repeat_call, unfold, iterate};
+pub use with_position::Position;
+pub use zip_longest::EitherOrBoth;
+pub use ziptuple::multizip;
+mod adaptors;
+#[doc(hidden)]
+pub mod free;
+#[doc(inline)]
+pub use free::*;
+mod concat_impl;
+mod cons_tuples_impl;
+mod diff;
+mod format;
+mod groupbylazy;
+mod intersperse;
+mod kmerge_impl;
+mod minmax;
+mod pad_tail;
+mod peeking_take_while;
+mod process_results_impl;
+mod rciter_impl;
+mod repeatn;
+mod size_hint;
+mod sources;
+mod tee;
+mod tuple_impl;
+mod with_position;
+mod zip_eq_impl;
+mod zip_longest;
+mod ziptuple;
+
+#[macro_export]
+/// Create an iterator over the “cartesian product” of iterators.
+///
+/// Iterator element type is like `(A, B, ..., E)` if formed
+/// from iterators `(I, J, ..., M)` with element types `I::Item = A`, `J::Item = B`, etc.
+///
+/// ```
+/// #[macro_use] extern crate itertools;
+/// # fn main() {
+/// // Iterate over the coordinates of a 4 x 4 x 4 grid
+/// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3)
+/// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) {
+///    // ..
+/// }
+/// # }
+/// ```
+///
+/// Note: To enable the macros in this crate, use the `#[macro_use]` attribute
+/// when importing the crate.
+///
+/// ```ignore
+/// #[macro_use] extern crate itertools;
+/// ```
+macro_rules! iproduct {
+    (@flatten $I:expr,) => (
+        $I
+    );
+    (@flatten $I:expr, $J:expr, $($K:expr,)*) => (
+        iproduct!(@flatten $crate::cons_tuples(iproduct!($I, $J)), $($K,)*)
+    );
+    ($I:expr) => (
+        ::std::iter::IntoIterator::into_iter($I)
+    );
+    ($I:expr, $J:expr) => (
+        $crate::Itertools::cartesian_product(iproduct!($I), iproduct!($J))
+    );
+    ($I:expr, $J:expr, $($K:expr),+) => (
+        iproduct!(@flatten iproduct!($I, $J), $($K,)+)
+    );
+}
+
+#[macro_export]
+/// Create an iterator running multiple iterators in lockstep.
+///
+/// The izip! iterator yields elements until any subiterator
+/// returns `None`.
+///
+/// Iterator element type is like `(A, B, ..., E)` if formed
+/// from iterators `(I, J, ..., M)` implementing `I: Iterator<A>`,
+/// `J: Iterator<B>`, ..., `M: Iterator<E>`
+///
+/// ```
+/// #[macro_use] extern crate itertools;
+/// # fn main() {
+///
+/// // Iterate over three sequences side-by-side
+/// let mut xs = [0, 0, 0];
+/// let ys = [69, 107, 101];
+///
+/// for (i, a, b) in izip!(0..100, &mut xs, &ys) {
+///    *a = i ^ *b;
+/// }
+///
+/// assert_eq!(xs, [69, 106, 103]);
+/// # }
+/// ```
+///
+/// Note: To enable the macros in this crate, use the `#[macro_use]` attribute
+/// when importing the crate.
+///
+/// ```ignore
+/// #[macro_use] extern crate itertools;
+/// ```
+macro_rules! izip {
+    ($I:expr) => (
+        ::std::iter::IntoIterator::into_iter($I)
+    );
+    ($($I:expr),*) => (
+        {
+            $crate::multizip(($(izip!($I)),*))
+        }
+    );
+}
+
+/// The trait `Itertools`: extra iterator adaptors and methods for iterators.
+///
+/// This trait defines a number of methods. They are divided into two groups:
+///
+/// * *Adaptors* take an iterator and parameter as input, and return
+/// a new iterator value. These are listed first in the trait. An example
+/// of an adaptor is [`.interleave()`](#method.interleave)
+///
+/// * *Regular methods* are those that don't return iterators and instead
+/// return a regular value of some other kind.
+/// [`.next_tuple()`](#method.next_tuple) is an example and the first regular
+/// method in the list.
+pub trait Itertools : Iterator {
+    // adaptors
+
+    /// Alternate elements from two iterators until both have run out.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// This iterator is *fused*.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (1..7).interleave(vec![-1, -2]);
+    /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]);
+    /// ```
+    fn interleave<J>(self, other: J) -> Interleave<Self, J::IntoIter>
+        where J: IntoIterator<Item = Self::Item>,
+              Self: Sized
+    {
+        interleave(self, other)
+    }
+
+    /// Alternate elements from two iterators until at least one of them has run
+    /// out.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (1..7).interleave_shortest(vec![-1, -2]);
+    /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3]);
+    /// ```
+    fn interleave_shortest<J>(self, other: J) -> InterleaveShortest<Self, J::IntoIter>
+        where J: IntoIterator<Item = Self::Item>,
+              Self: Sized
+    {
+        adaptors::interleave_shortest(self, other.into_iter())
+    }
+
+    /// An iterator adaptor to insert a particular value
+    /// between each element of the adapted iterator.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// This iterator is *fused*.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// itertools::assert_equal((0..3).intersperse(8), vec![0, 8, 1, 8, 2]);
+    /// ```
+    fn intersperse(self, element: Self::Item) -> Intersperse<Self>
+        where Self: Sized,
+              Self::Item: Clone
+    {
+        intersperse::intersperse(self, element)
+    }
+
+    /// Create an iterator which iterates over both this and the specified
+    /// iterator simultaneously, yielding pairs of two optional elements.
+    ///
+    /// This iterator is *fused*.
+    ///
+    /// When both iterators return `None`, all further invocations of `.next()`
+    /// will return `None`.
+    ///
+    /// Iterator element type is
+    /// [`EitherOrBoth<Self::Item, J::Item>`](enum.EitherOrBoth.html).
+    ///
+    /// ```rust
+    /// use itertools::EitherOrBoth::{Both, Right};
+    /// use itertools::Itertools;
+    /// let it = (0..1).zip_longest(1..3);
+    /// itertools::assert_equal(it, vec![Both(0, 1), Right(2)]);
+    /// ```
+    #[inline]
+    fn zip_longest<J>(self, other: J) -> ZipLongest<Self, J::IntoIter>
+        where J: IntoIterator,
+              Self: Sized
+    {
+        zip_longest::zip_longest(self, other.into_iter())
+    }
+
+    /// Create an iterator which iterates over both this and the specified
+    /// iterator simultaneously, yielding pairs of elements.
+    ///
+    /// **Panics** if the iterators reach an end and they are not of equal
+    /// lengths.
+    #[inline]
+    fn zip_eq<J>(self, other: J) -> ZipEq<Self, J::IntoIter>
+        where J: IntoIterator,
+              Self: Sized
+    {
+        zip_eq(self, other)
+    }
+
+    /// A “meta iterator adaptor”. Its closure recives a reference to the
+    /// iterator and may pick off as many elements as it likes, to produce the
+    /// next iterator element.
+    ///
+    /// Iterator element type is `B`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // An adaptor that gathers elements in pairs
+    /// let pit = (0..4).batching(|it| {
+    ///            match it.next() {
+    ///                None => None,
+    ///                Some(x) => match it.next() {
+    ///                    None => None,
+    ///                    Some(y) => Some((x, y)),
+    ///                }
+    ///            }
+    ///        });
+    ///
+    /// itertools::assert_equal(pit, vec![(0, 1), (2, 3)]);
+    /// ```
+    ///
+    fn batching<B, F>(self, f: F) -> Batching<Self, F>
+        where F: FnMut(&mut Self) -> Option<B>,
+              Self: Sized
+    {
+        adaptors::batching(self, f)
+    }
+
+    /// Return an *iterable* that can group iterator elements.
+    /// Consecutive elements that map to the same key (“runs”), are assigned
+    /// to the same group.
+    ///
+    /// `GroupBy` is the storage for the lazy grouping operation.
+    ///
+    /// If the groups are consumed in order, or if each group's iterator is
+    /// dropped without keeping it around, then `GroupBy` uses no
+    /// allocations.  It needs allocations only if several group iterators
+    /// are alive at the same time.
+    ///
+    /// This type implements `IntoIterator` (it is **not** an iterator
+    /// itself), because the group iterators need to borrow from this
+    /// value. It should be stored in a local variable or temporary and
+    /// iterated.
+    ///
+    /// Iterator element type is `(K, Group)`: the group's key and the
+    /// group iterator.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // group data into runs of larger than zero or not.
+    /// let data = vec![1, 3, -2, -2, 1, 0, 1, 2];
+    /// // groups:     |---->|------>|--------->|
+    ///
+    /// // Note: The `&` is significant here, `GroupBy` is iterable
+    /// // only by reference. You can also call `.into_iter()` explicitly.
+    /// for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) {
+    ///     // Check that the sum of each group is +/- 4.
+    ///     assert_eq!(4, group.sum::<i32>().abs());
+    /// }
+    /// ```
+    fn group_by<K, F>(self, key: F) -> GroupBy<K, Self, F>
+        where Self: Sized,
+              F: FnMut(&Self::Item) -> K,
+    {
+        groupbylazy::new(self, key)
+    }
+
+    /// Return an *iterable* that can chunk the iterator.
+    ///
+    /// Yield subiterators (chunks) that each yield a fixed number elements,
+    /// determined by `size`. The last chunk will be shorter if there aren't
+    /// enough elements.
+    ///
+    /// `IntoChunks` is based on `GroupBy`: it is iterable (implements
+    /// `IntoIterator`, **not** `Iterator`), and it only buffers if several
+    /// chunk iterators are alive at the same time.
+    ///
+    /// Iterator element type is `Chunk`, each chunk's iterator.
+    ///
+    /// **Panics** if `size` is 0.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![1, 1, 2, -2, 6, 0, 3, 1];
+    /// //chunk size=3 |------->|-------->|--->|
+    ///
+    /// // Note: The `&` is significant here, `IntoChunks` is iterable
+    /// // only by reference. You can also call `.into_iter()` explicitly.
+    /// for chunk in &data.into_iter().chunks(3) {
+    ///     // Check that the sum of each chunk is 4.
+    ///     assert_eq!(4, chunk.sum());
+    /// }
+    /// ```
+    fn chunks(self, size: usize) -> IntoChunks<Self>
+        where Self: Sized,
+    {
+        assert!(size != 0);
+        groupbylazy::new_chunks(self, size)
+    }
+
+    /// Return an iterator over all contiguous windows producing tuples of
+    /// a specific size (up to 4).
+    ///
+    /// `tuple_windows` clones the iterator elements so that they can be
+    /// part of successive windows, this makes it most suited for iterators
+    /// of references and other values that are cheap to copy.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    /// let mut v = Vec::new();
+    /// for (a, b) in (1..5).tuple_windows() {
+    ///     v.push((a, b));
+    /// }
+    /// assert_eq!(v, vec![(1, 2), (2, 3), (3, 4)]);
+    ///
+    /// let mut it = (1..5).tuple_windows();
+    /// assert_eq!(Some((1, 2, 3)), it.next());
+    /// assert_eq!(Some((2, 3, 4)), it.next());
+    /// assert_eq!(None, it.next());
+    ///
+    /// // this requires a type hint
+    /// let it = (1..5).tuple_windows::<(_, _, _)>();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]);
+    ///
+    /// // you can also specify the complete type
+    /// use itertools::TupleWindows;
+    /// use std::ops::Range;
+    ///
+    /// let it: TupleWindows<Range<u32>, (u32, u32, u32)> = (1..5).tuple_windows();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]);
+    /// ```
+    fn tuple_windows<T>(self) -> TupleWindows<Self, T>
+        where Self: Sized + Iterator<Item = T::Item>,
+              T: tuple_impl::TupleCollect,
+              T::Item: Clone
+    {
+        tuple_impl::tuple_windows(self)
+    }
+
+    /// Return an iterator that groups the items in tuples of a specific size
+    /// (up to 4).
+    ///
+    /// See also the method [`.next_tuple()`](#method.next_tuple).
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    /// let mut v = Vec::new();
+    /// for (a, b) in (1..5).tuples() {
+    ///     v.push((a, b));
+    /// }
+    /// assert_eq!(v, vec![(1, 2), (3, 4)]);
+    ///
+    /// let mut it = (1..7).tuples();
+    /// assert_eq!(Some((1, 2, 3)), it.next());
+    /// assert_eq!(Some((4, 5, 6)), it.next());
+    /// assert_eq!(None, it.next());
+    ///
+    /// // this requires a type hint
+    /// let it = (1..7).tuples::<(_, _, _)>();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]);
+    ///
+    /// // you can also specify the complete type
+    /// use itertools::Tuples;
+    /// use std::ops::Range;
+    ///
+    /// let it: Tuples<Range<u32>, (u32, u32, u32)> = (1..7).tuples();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]);
+    /// ```
+    ///
+    /// See also [`Tuples::into_buffer`](structs/struct.Tuples.html#method.into_buffer).
+    fn tuples<T>(self) -> Tuples<Self, T>
+        where Self: Sized + Iterator<Item = T::Item>,
+              T: tuple_impl::TupleCollect
+    {
+        tuple_impl::tuples(self)
+    }
+
+    /// Split into an iterator pair that both yield all elements from
+    /// the original iterator.
+    ///
+    /// **Note:** If the iterator is clonable, prefer using that instead
+    /// of using this method. It is likely to be more efficient.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    /// let xs = vec![0, 1, 2, 3];
+    ///
+    /// let (mut t1, t2) = xs.into_iter().tee();
+    /// itertools::assert_equal(t1.next(), Some(0));
+    /// itertools::assert_equal(t2, 0..4);
+    /// itertools::assert_equal(t1, 1..4);
+    /// ```
+    fn tee(self) -> (Tee<Self>, Tee<Self>)
+        where Self: Sized,
+              Self::Item: Clone
+    {
+        tee::new(self)
+    }
+
+    /// Return an iterator adaptor that steps `n` elements in the base iterator
+    /// for each iteration.
+    ///
+    /// The iterator steps by yielding the next element from the base iterator,
+    /// then skipping forward `n - 1` elements.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// **Panics** if the step is 0.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (0..8).step(3);
+    /// itertools::assert_equal(it, vec![0, 3, 6]);
+    /// ```
+    fn step(self, n: usize) -> Step<Self>
+        where Self: Sized
+    {
+        adaptors::step(self, n)
+    }
+
+    /// Return an iterator adaptor that applies the provided closure
+    /// to every `Result::Ok` value. `Result::Err` values are
+    /// unchanged.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let input = vec![Ok(41), Err(false), Ok(11)];
+    /// let it = input.into_iter().map_results(|i| i + 1);
+    /// itertools::assert_equal(it, vec![Ok(42), Err(false), Ok(12)]);
+    /// ```
+    fn map_results<F, T, U, E>(self, f: F) -> MapResults<Self, F>
+        where Self: Iterator<Item = Result<T, E>> + Sized,
+              F: FnMut(T) -> U,
+    {
+        adaptors::map_results(self, f)
+    }
+
+    /// Return an iterator adaptor that merges the two base iterators in
+    /// ascending order.  If both base iterators are sorted (ascending), the
+    /// result is sorted.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let a = (0..11).step(3);
+    /// let b = (0..11).step(5);
+    /// let it = a.merge(b);
+    /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]);
+    /// ```
+    fn merge<J>(self, other: J) -> Merge<Self, J::IntoIter>
+        where Self: Sized,
+              Self::Item: PartialOrd,
+              J: IntoIterator<Item = Self::Item>
+    {
+        merge(self, other)
+    }
+
+    /// Return an iterator adaptor that merges the two base iterators in order.
+    /// This is much like `.merge()` but allows for a custom ordering.
+    ///
+    /// This can be especially useful for sequences of tuples.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let a = (0..).zip("bc".chars());
+    /// let b = (0..).zip("ad".chars());
+    /// let it = a.merge_by(b, |x, y| x.1 <= y.1);
+    /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]);
+    /// ```
+
+    fn merge_by<J, F>(self, other: J, is_first: F) -> MergeBy<Self, J::IntoIter, F>
+        where Self: Sized,
+              J: IntoIterator<Item = Self::Item>,
+              F: FnMut(&Self::Item, &Self::Item) -> bool
+    {
+        adaptors::merge_by_new(self, other.into_iter(), is_first)
+    }
+
+    /// Return an iterator adaptor that flattens an iterator of iterators by
+    /// merging them in ascending order.
+    ///
+    /// If all base iterators are sorted (ascending), the result is sorted.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let a = (0..6).step(3);
+    /// let b = (1..6).step(3);
+    /// let c = (2..6).step(3);
+    /// let it = vec![a, b, c].into_iter().kmerge();
+    /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]);
+    /// ```
+    fn kmerge(self) -> KMerge<<Self::Item as IntoIterator>::IntoIter>
+        where Self: Sized,
+              Self::Item: IntoIterator,
+              <Self::Item as IntoIterator>::Item: PartialOrd,
+    {
+        kmerge(self)
+    }
+
+    /// Return an iterator adaptor that flattens an iterator of iterators by
+    /// merging them according to the given closure.
+    ///
+    /// The closure `first` is called with two elements *a*, *b* and should
+    /// return `true` if *a* is ordered before *b*.
+    ///
+    /// If all base iterators are sorted according to `first`, the result is
+    /// sorted.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let a = vec![-1f64, 2., 3., -5., 6., -7.];
+    /// let b = vec![0., 2., -4.];
+    /// let mut it = vec![a, b].into_iter().kmerge_by(|a, b| a.abs() < b.abs());
+    /// assert_eq!(it.next(), Some(0.));
+    /// assert_eq!(it.last(), Some(-7.));
+    /// ```
+    fn kmerge_by<F>(self, first: F)
+        -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, F>
+        where Self: Sized,
+              Self::Item: IntoIterator,
+              F: FnMut(&<Self::Item as IntoIterator>::Item,
+                       &<Self::Item as IntoIterator>::Item) -> bool
+    {
+        kmerge_by(self, first)
+    }
+
+    /// Return an iterator adaptor that iterates over the cartesian product of
+    /// the element sets of two iterators `self` and `J`.
+    ///
+    /// Iterator element type is `(Self::Item, J::Item)`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (0..2).cartesian_product("αβ".chars());
+    /// itertools::assert_equal(it, vec![(0, 'α'), (0, 'β'), (1, 'α'), (1, 'β')]);
+    /// ```
+    fn cartesian_product<J>(self, other: J) -> Product<Self, J::IntoIter>
+        where Self: Sized,
+              Self::Item: Clone,
+              J: IntoIterator,
+              J::IntoIter: Clone
+    {
+        adaptors::cartesian_product(self, other.into_iter())
+    }
+
+    /// Return an iterator adaptor that uses the passed-in closure to
+    /// optionally merge together consecutive elements.
+    ///
+    /// The closure `f` is passed two elements, `previous` and `current` and may
+    /// return either (1) `Ok(combined)` to merge the two values or
+    /// (2) `Err((previous', current'))` to indicate they can't be merged.
+    /// In (2), the value `previous'` is emitted by the iterator.
+    /// Either (1) `combined` or (2) `current'` becomes the previous value
+    /// when coalesce continues with the next pair of elements to merge. The
+    /// value that remains at the end is also emitted by the iterator.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// This iterator is *fused*.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // sum same-sign runs together
+    /// let data = vec![-1., -2., -3., 3., 1., 0., -1.];
+    /// itertools::assert_equal(data.into_iter().coalesce(|x, y|
+    ///         if (x >= 0.) == (y >= 0.) {
+    ///             Ok(x + y)
+    ///         } else {
+    ///             Err((x, y))
+    ///         }),
+    ///         vec![-6., 4., -1.]);
+    /// ```
+    fn coalesce<F>(self, f: F) -> Coalesce<Self, F>
+        where Self: Sized,
+              F: FnMut(Self::Item, Self::Item)
+                       -> Result<Self::Item, (Self::Item, Self::Item)>
+    {
+        adaptors::coalesce(self, f)
+    }
+
+    /// Remove duplicates from sections of consecutive identical elements.
+    /// If the iterator is sorted, all elements will be unique.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// This iterator is *fused*.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![1., 1., 2., 3., 3., 2., 2.];
+    /// itertools::assert_equal(data.into_iter().dedup(),
+    ///                         vec![1., 2., 3., 2.]);
+    /// ```
+    fn dedup(self) -> Dedup<Self>
+        where Self: Sized,
+              Self::Item: PartialEq,
+    {
+        adaptors::dedup(self)
+    }
+
+    /// Return an iterator adaptor that filters out elements that have
+    /// already been produced once during the iteration. Duplicates
+    /// are detected using hash and equality.
+    ///
+    /// Clones of visited elements are stored in a hash set in the
+    /// iterator.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![10, 20, 30, 20, 40, 10, 50];
+    /// itertools::assert_equal(data.into_iter().unique(),
+    ///                         vec![10, 20, 30, 40, 50]);
+    /// ```
+    fn unique(self) -> Unique<Self>
+        where Self: Sized,
+              Self::Item: Clone + Eq + Hash
+    {
+        adaptors::unique(self)
+    }
+
+    /// Return an iterator adaptor that filters out elements that have
+    /// already been produced once during the iteration.
+    ///
+    /// Duplicates are detected by comparing the key they map to
+    /// with the keying function `f` by hash and equality.
+    /// The keys are stored in a hash set in the iterator.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec!["a", "bb", "aa", "c", "ccc"];
+    /// itertools::assert_equal(data.into_iter().unique_by(|s| s.len()),
+    ///                         vec!["a", "bb", "ccc"]);
+    /// ```
+    fn unique_by<V, F>(self, f: F) -> UniqueBy<Self, V, F>
+        where Self: Sized,
+              V: Eq + Hash,
+              F: FnMut(&Self::Item) -> V
+    {
+        adaptors::unique_by(self, f)
+    }
+
+    /// Return an iterator adaptor that borrows from this iterator and
+    /// takes items while the closure `accept` returns `true`.
+    ///
+    /// This adaptor can only be used on iterators that implement `PeekingNext`
+    /// like `.peekable()`, `put_back` and a few other collection iterators.
+    ///
+    /// The last and rejected element (first `false`) is still available when
+    /// `peeking_take_while` is done.
+    ///
+    ///
+    /// See also [`.take_while_ref()`](#method.take_while_ref)
+    /// which is a similar adaptor.
+    fn peeking_take_while<F>(&mut self, accept: F) -> PeekingTakeWhile<Self, F>
+        where Self: Sized + PeekingNext,
+              F: FnMut(&Self::Item) -> bool,
+    {
+        peeking_take_while::peeking_take_while(self, accept)
+    }
+
+    /// Return an iterator adaptor that borrows from a `Clone`-able iterator
+    /// to only pick off elements while the predicate `accept` returns `true`.
+    ///
+    /// It uses the `Clone` trait to restore the original iterator so that the
+    /// last and rejected element (first `false`) is still available when
+    /// `take_while_ref` is done.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut hexadecimals = "0123456789abcdef".chars();
+    ///
+    /// let decimals = hexadecimals.take_while_ref(|c| c.is_numeric())
+    ///                            .collect::<String>();
+    /// assert_eq!(decimals, "0123456789");
+    /// assert_eq!(hexadecimals.next(), Some('a'));
+    ///
+    /// ```
+    fn take_while_ref<F>(&mut self, accept: F) -> TakeWhileRef<Self, F>
+        where Self: Clone,
+              F: FnMut(&Self::Item) -> bool
+    {
+        adaptors::take_while_ref(self, accept)
+    }
+
+    /// Return an iterator adaptor that filters `Option<A>` iterator elements
+    /// and produces `A`. Stops on the first `None` encountered.
+    ///
+    /// Iterator element type is `A`, the unwrapped element.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // List all hexadecimal digits
+    /// itertools::assert_equal(
+    ///     (0..).map(|i| std::char::from_digit(i, 16)).while_some(),
+    ///     "0123456789abcdef".chars());
+    ///
+    /// ```
+    fn while_some<A>(self) -> WhileSome<Self>
+        where Self: Sized + Iterator<Item = Option<A>>
+    {
+        adaptors::while_some(self)
+    }
+
+    /// Return an iterator adaptor that iterates over the combinations of the
+    /// elements from an iterator.
+    ///
+    /// Iterator element can be any homogeneous tuple of type `Self::Item` with
+    /// size up to 4.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut v = Vec::new();
+    /// for (a, b) in (1..5).tuple_combinations() {
+    ///     v.push((a, b));
+    /// }
+    /// assert_eq!(v, vec![(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]);
+    ///
+    /// let mut it = (1..5).tuple_combinations();
+    /// assert_eq!(Some((1, 2, 3)), it.next());
+    /// assert_eq!(Some((1, 2, 4)), it.next());
+    /// assert_eq!(Some((1, 3, 4)), it.next());
+    /// assert_eq!(Some((2, 3, 4)), it.next());
+    /// assert_eq!(None, it.next());
+    ///
+    /// // this requires a type hint
+    /// let it = (1..5).tuple_combinations::<(_, _, _)>();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]);
+    ///
+    /// // you can also specify the complete type
+    /// use itertools::TupleCombinations;
+    /// use std::ops::Range;
+    ///
+    /// let it: TupleCombinations<Range<u32>, (u32, u32, u32)> = (1..5).tuple_combinations();
+    /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]);
+    /// ```
+    fn tuple_combinations<T>(self) -> TupleCombinations<Self, T>
+        where Self: Sized + Clone,
+              Self::Item: Clone,
+              T: adaptors::HasCombination<Self>,
+    {
+        adaptors::tuple_combinations(self)
+    }
+
+    /// Return an iterator adaptor that iterates over the `n`-length combinations of
+    /// the elements from an iterator.
+    ///
+    /// Iterator element type is `Vec<Self::Item>`. The iterator produces a new Vec per iteration,
+    /// and clones the iterator elements.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (1..5).combinations(3);
+    /// itertools::assert_equal(it, vec![
+    ///     vec![1, 2, 3],
+    ///     vec![1, 2, 4],
+    ///     vec![1, 3, 4],
+    ///     vec![2, 3, 4],
+    ///     ]);
+    /// ```
+    fn combinations(self, n: usize) -> Combinations<Self>
+        where Self: Sized,
+              Self::Item: Clone
+    {
+        adaptors::combinations(self, n)
+    }
+
+    /// Return an iterator adaptor that pads the sequence to a minimum length of
+    /// `min` by filling missing elements using a closure `f`.
+    ///
+    /// Iterator element type is `Self::Item`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let it = (0..5).pad_using(10, |i| 2*i);
+    /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 10, 12, 14, 16, 18]);
+    ///
+    /// let it = (0..10).pad_using(5, |i| 2*i);
+    /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
+    ///
+    /// let it = (0..5).pad_using(10, |i| 2*i).rev();
+    /// itertools::assert_equal(it, vec![18, 16, 14, 12, 10, 4, 3, 2, 1, 0]);
+    /// ```
+    fn pad_using<F>(self, min: usize, f: F) -> PadUsing<Self, F>
+        where Self: Sized,
+              F: FnMut(usize) -> Self::Item
+    {
+        pad_tail::pad_using(self, min, f)
+    }
+
+    /// Unravel a nested iterator.
+    ///
+    /// This is more or less equivalent to `.flat_map` with an identity
+    /// function.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![vec![1, 2, 3], vec![4, 5, 6]];
+    /// let flattened = data.iter().flatten();
+    ///
+    /// itertools::assert_equal(flattened, &[1, 2, 3, 4, 5, 6]);
+    /// ```
+    fn flatten(self) -> Flatten<Self, <Self::Item as IntoIterator>::IntoIter>
+        where Self: Sized,
+              Self::Item: IntoIterator
+    {
+        adaptors::flatten(self)
+    }
+
+    /// Return an iterator adaptor that wraps each element in a `Position` to
+    /// ease special-case handling of the first or last elements.
+    ///
+    /// Iterator element type is
+    /// [`Position<Self::Item>`](enum.Position.html)
+    ///
+    /// ```
+    /// use itertools::{Itertools, Position};
+    ///
+    /// let it = (0..4).with_position();
+    /// itertools::assert_equal(it,
+    ///                         vec![Position::First(0),
+    ///                              Position::Middle(1),
+    ///                              Position::Middle(2),
+    ///                              Position::Last(3)]);
+    ///
+    /// let it = (0..1).with_position();
+    /// itertools::assert_equal(it, vec![Position::Only(0)]);
+    /// ```
+    fn with_position(self) -> WithPosition<Self>
+        where Self: Sized,
+    {
+        with_position::with_position(self)
+    }
+
+    /// Return an iterator adaptor that yields the indices of all elements
+    /// satisfying a predicate, counted from the start of the iterator.
+    ///
+    /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(v)).map(|(i, _)| i)`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![1, 2, 3, 3, 4, 6, 7, 9];
+    /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 0), vec![1, 4, 5]);
+    ///
+    /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 1).rev(), vec![7, 6, 3, 2, 0]);
+    /// ```
+    fn positions<P>(self, predicate: P) -> Positions<Self, P>
+        where Self: Sized,
+              P: FnMut(Self::Item) -> bool,
+    {
+        adaptors::positions(self, predicate)
+    }
+
+    // non-adaptor methods
+    /// Advances the iterator and returns the next items grouped in a tuple of
+    /// a specific size (up to 4).
+    ///
+    /// If there are enough elements to be grouped in a tuple, then the tuple is
+    /// returned inside `Some`, otherwise `None` is returned.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut iter = 1..5;
+    ///
+    /// assert_eq!(Some((1, 2)), iter.next_tuple());
+    /// ```
+    fn next_tuple<T>(&mut self) -> Option<T>
+        where Self: Sized + Iterator<Item = T::Item>,
+              T: tuple_impl::TupleCollect
+    {
+        T::collect_from_iter_no_buf(self)
+    }
+
+
+    /// Find the position and value of the first element satisfying a predicate.
+    ///
+    /// The iterator is not advanced past the first element found.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let text = "Hα";
+    /// assert_eq!(text.chars().find_position(|ch| ch.is_lowercase()), Some((1, 'α')));
+    /// ```
+    fn find_position<P>(&mut self, mut pred: P) -> Option<(usize, Self::Item)>
+        where P: FnMut(&Self::Item) -> bool
+    {
+        let mut index = 0usize;
+        for elt in self {
+            if pred(&elt) {
+                return Some((index, elt));
+            }
+            index += 1;
+        }
+        None
+    }
+
+    /// Check whether all elements compare equal.
+    ///
+    /// Empty iterators are considered to have equal elements:
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5];
+    /// assert!(!data.iter().all_equal());
+    /// assert!(data[0..3].iter().all_equal());
+    /// assert!(data[3..5].iter().all_equal());
+    /// assert!(data[5..8].iter().all_equal());
+    ///
+    /// let data : Option<usize> = None;
+    /// assert!(data.into_iter().all_equal());
+    /// ```
+    fn all_equal(&mut self) -> bool
+        where Self::Item: PartialEq,
+    {
+        self.dedup().nth(1).is_none()
+    }
+
+    /// Consume the first `n` elements from the iterator eagerly,
+    /// and return the same iterator again.
+    ///
+    /// It works similarly to *.skip(* `n` *)* except it is eager and
+    /// preserves the iterator type.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut iter = "αβγ".chars().dropping(2);
+    /// itertools::assert_equal(iter, "γ".chars());
+    /// ```
+    ///
+    /// *Fusing notes: if the iterator is exhausted by dropping,
+    /// the result of calling `.next()` again depends on the iterator implementation.*
+    fn dropping(mut self, n: usize) -> Self
+        where Self: Sized
+    {
+        if n > 0 {
+            self.nth(n - 1);
+        }
+        self
+    }
+
+    /// Consume the last `n` elements from the iterator eagerly,
+    /// and return the same iterator again.
+    ///
+    /// This is only possible on double ended iterators. `n` may be
+    /// larger than the number of elements.
+    ///
+    /// Note: This method is eager, dropping the back elements immediately and
+    /// preserves the iterator type.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let init = vec![0, 3, 6, 9].into_iter().dropping_back(1);
+    /// itertools::assert_equal(init, vec![0, 3, 6]);
+    /// ```
+    fn dropping_back(mut self, n: usize) -> Self
+        where Self: Sized,
+              Self: DoubleEndedIterator
+    {
+        if n > 0 {
+            (&mut self).rev().nth(n - 1);
+        }
+        self
+    }
+
+    /// Run the closure `f` eagerly on each element of the iterator.
+    ///
+    /// Consumes the iterator until its end.
+    ///
+    /// ```
+    /// use std::sync::mpsc::channel;
+    /// use itertools::Itertools;
+    ///
+    /// let (tx, rx) = channel();
+    ///
+    /// // use .foreach() to apply a function to each value -- sending it
+    /// (0..5).map(|x| x * 2 + 1).foreach(|x| { tx.send(x).unwrap(); } );
+    ///
+    /// drop(tx);
+    ///
+    /// itertools::assert_equal(rx.iter(), vec![1, 3, 5, 7, 9]);
+    /// ```
+    fn foreach<F>(self, mut f: F)
+        where F: FnMut(Self::Item),
+              Self: Sized,
+    {
+        self.fold((), move |(), element| f(element))
+    }
+
+    /// Combine all an iterator's elements into one element by using `Extend`.
+    ///
+    /// This combinator will extend the first item with each of the rest of the
+    /// items of the iterator. If the iterator is empty, the default value of
+    /// `I::Item` is returned.
+    ///
+    /// ```rust
+    /// use itertools::Itertools;
+    ///
+    /// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]];
+    /// assert_eq!(input.into_iter().concat(),
+    ///            vec![1, 2, 3, 4, 5, 6]);
+    /// ```
+    fn concat(self) -> Self::Item
+        where Self: Sized,
+              Self::Item: Extend<<<Self as Iterator>::Item as IntoIterator>::Item> + IntoIterator + Default
+    {
+        concat(self)
+    }
+
+    /// `.collect_vec()` is simply a type specialization of `.collect()`,
+    /// for convenience.
+    fn collect_vec(self) -> Vec<Self::Item>
+        where Self: Sized
+    {
+        self.collect()
+    }
+
+    /// Assign to each reference in `self` from the `from` iterator,
+    /// stopping at the shortest of the two iterators.
+    ///
+    /// The `from` iterator is queried for its next element before the `self`
+    /// iterator, and if either is exhausted the method is done.
+    ///
+    /// Return the number of elements written.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut xs = [0; 4];
+    /// xs.iter_mut().set_from(1..);
+    /// assert_eq!(xs, [1, 2, 3, 4]);
+    /// ```
+    #[inline]
+    fn set_from<'a, A: 'a, J>(&mut self, from: J) -> usize
+        where Self: Iterator<Item = &'a mut A>,
+              J: IntoIterator<Item = A>
+    {
+        let mut count = 0;
+        for elt in from {
+            match self.next() {
+                None => break,
+                Some(ptr) => *ptr = elt,
+            }
+            count += 1;
+        }
+        count
+    }
+
+    /// Combine all iterator elements into one String, seperated by `sep`.
+    ///
+    /// Use the `Display` implementation of each element.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// assert_eq!(["a", "b", "c"].iter().join(", "), "a, b, c");
+    /// assert_eq!([1, 2, 3].iter().join(", "), "1, 2, 3");
+    /// ```
+    fn join(&mut self, sep: &str) -> String
+        where Self::Item: std::fmt::Display
+    {
+        match self.next() {
+            None => String::new(),
+            Some(first_elt) => {
+                // estimate lower bound of capacity needed
+                let (lower, _) = self.size_hint();
+                let mut result = String::with_capacity(sep.len() * lower);
+                write!(&mut result, "{}", first_elt).unwrap();
+                for elt in self {
+                    result.push_str(sep);
+                    write!(&mut result, "{}", elt).unwrap();
+                }
+                result
+            }
+        }
+    }
+
+    /// Format all iterator elements, separated by `sep`.
+    ///
+    /// All elements are formatted (any formatting trait)
+    /// with `sep` inserted between each element.
+    ///
+    /// **Panics** if the formatter helper is formatted more than once.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = [1.1, 2.71828, -3.];
+    /// assert_eq!(
+    ///     format!("{:.2}", data.iter().format(", ")),
+    ///            "1.10, 2.72, -3.00");
+    /// ```
+    fn format(self, sep: &str) -> Format<Self>
+        where Self: Sized,
+    {
+        format::new_format_default(self, sep)
+    }
+
+    /// Format all iterator elements, separated by `sep`.
+    ///
+    /// This is a customizable version of `.format()`.
+    ///
+    /// The supplied closure `format` is called once per iterator element,
+    /// with two arguments: the element and a callback that takes a
+    /// `&Display` value, i.e. any reference to type that implements `Display`.
+    ///
+    /// Using `&format_args!(...)` is the most versatile way to apply custom
+    /// element formatting. The callback can be called multiple times if needed.
+    ///
+    /// **Panics** if the formatter helper is formatted more than once.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let data = [1.1, 2.71828, -3.];
+    /// let data_formatter = data.iter().format_with(", ", |elt, f| f(&format_args!("{:.2}", elt)));
+    /// assert_eq!(format!("{}", data_formatter),
+    ///            "1.10, 2.72, -3.00");
+    ///
+    /// // .format_with() is recursively composable
+    /// let matrix = [[1., 2., 3.],
+    ///               [4., 5., 6.]];
+    /// let matrix_formatter = matrix.iter().format_with("\n", |row, f| {
+    ///                                 f(&row.iter().format_with(", ", |elt, g| g(&elt)))
+    ///                              });
+    /// assert_eq!(format!("{}", matrix_formatter),
+    ///            "1, 2, 3\n4, 5, 6");
+    ///
+    ///
+    /// ```
+    fn format_with<F>(self, sep: &str, format: F) -> FormatWith<Self, F>
+        where Self: Sized,
+              F: FnMut(Self::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result,
+    {
+        format::new_format(self, sep, format)
+    }
+
+    /// Fold `Result` values from an iterator.
+    ///
+    /// Only `Ok` values are folded. If no error is encountered, the folded
+    /// value is returned inside `Ok`. Otherwise, the operation terminates
+    /// and returns the first `Err` value it encounters. No iterator elements are
+    /// consumed after the first error.
+    ///
+    /// The first accumulator value is the `start` parameter.
+    /// Each iteration passes the accumulator value and the next value inside `Ok`
+    /// to the fold function `f` and its return value becomes the new accumulator value.
+    ///
+    /// For example the sequence *Ok(1), Ok(2), Ok(3)* will result in a
+    /// computation like this:
+    ///
+    /// ```ignore
+    /// let mut accum = start;
+    /// accum = f(accum, 1);
+    /// accum = f(accum, 2);
+    /// accum = f(accum, 3);
+    /// ```
+    ///
+    /// With a `start` value of 0 and an addition as folding function,
+    /// this effetively results in *((0 + 1) + 2) + 3*
+    ///
+    /// ```
+    /// use std::ops::Add;
+    /// use itertools::Itertools;
+    ///
+    /// let values = [1, 2, -2, -1, 2, 1];
+    /// assert_eq!(
+    ///     values.iter()
+    ///           .map(Ok::<_, ()>)
+    ///           .fold_results(0, Add::add),
+    ///     Ok(3)
+    /// );
+    /// assert!(
+    ///     values.iter()
+    ///           .map(|&x| if x >= 0 { Ok(x) } else { Err("Negative number") })
+    ///           .fold_results(0, Add::add)
+    ///           .is_err()
+    /// );
+    /// ```
+    fn fold_results<A, E, B, F>(&mut self, mut start: B, mut f: F) -> Result<B, E>
+        where Self: Iterator<Item = Result<A, E>>,
+              F: FnMut(B, A) -> B
+    {
+        for elt in self {
+            match elt {
+                Ok(v) => start = f(start, v),
+                Err(u) => return Err(u),
+            }
+        }
+        Ok(start)
+    }
+
+    /// Fold `Option` values from an iterator.
+    ///
+    /// Only `Some` values are folded. If no `None` is encountered, the folded
+    /// value is returned inside `Some`. Otherwise, the operation terminates
+    /// and returns `None`. No iterator elements are consumed after the `None`.
+    ///
+    /// This is the `Option` equivalent to `fold_results`.
+    ///
+    /// ```
+    /// use std::ops::Add;
+    /// use itertools::Itertools;
+    ///
+    /// let mut values = vec![Some(1), Some(2), Some(-2)].into_iter();
+    /// assert_eq!(values.fold_options(5, Add::add), Some(5 + 1 + 2 - 2));
+    ///
+    /// let mut more_values = vec![Some(2), None, Some(0)].into_iter();
+    /// assert!(more_values.fold_options(0, Add::add).is_none());
+    /// assert_eq!(more_values.next().unwrap(), Some(0));
+    /// ```
+    fn fold_options<A, B, F>(&mut self, mut start: B, mut f: F) -> Option<B>
+        where Self: Iterator<Item = Option<A>>,
+              F: FnMut(B, A) -> B
+    {
+        for elt in self {
+            match elt {
+                Some(v) => start = f(start, v),
+                None => return None,
+            }
+        }
+        Some(start)
+    }
+
+    /// Accumulator of the elements in the iterator.
+    ///
+    /// Like `.fold()`, without a base case. If the iterator is
+    /// empty, return `None`. With just one element, return it.
+    /// Otherwise elements are accumulated in sequence using the closure `f`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// assert_eq!((0..10).fold1(|x, y| x + y).unwrap_or(0), 45);
+    /// assert_eq!((0..0).fold1(|x, y| x * y), None);
+    /// ```
+    fn fold1<F>(mut self, f: F) -> Option<Self::Item>
+        where F: FnMut(Self::Item, Self::Item) -> Self::Item,
+              Self: Sized,
+    {
+        self.next().map(move |x| self.fold(x, f))
+    }
+
+    /// An iterator method that applies a function, producing a single, final value.
+    ///
+    /// `fold_while()` is basically equivalent to `fold()` but with additional support for
+    /// early exit via short-circuiting.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    /// use itertools::FoldWhile::{Continue, Done};
+    ///
+    /// let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    ///
+    /// let mut result = 0;
+    ///
+    /// // for loop:
+    /// for i in &numbers {
+    ///     if *i > 5 {
+    ///         break;
+    ///     }
+    ///     result = result + i;
+    /// }
+    ///
+    /// // fold:
+    /// let result2 = numbers.iter().fold(0, |acc, x| {
+    ///     if *x > 5 { acc } else { acc + x }
+    /// });
+    ///
+    /// // fold_while:
+    /// let result3 = numbers.iter().fold_while(0, |acc, x| {
+    ///     if *x > 5 { Done(acc) } else { Continue(acc + x) }
+    /// }).into_inner();
+    ///
+    /// // they're the same
+    /// assert_eq!(result, result2);
+    /// assert_eq!(result2, result3);
+    /// ```
+    ///
+    /// The big difference between the computations of `result2` and `result3` is that while
+    /// `fold()` called the provided closure for every item of the callee iterator,
+    /// `fold_while()` actually stopped iterating as soon as it encountered `Fold::Done(_)`.
+    fn fold_while<B, F>(&mut self, init: B, mut f: F) -> FoldWhile<B>
+        where Self: Sized,
+              F: FnMut(B, Self::Item) -> FoldWhile<B>
+    {
+        let mut acc = init;
+        while let Some(item) = self.next() {
+            match f(acc, item) {
+                FoldWhile::Continue(res) => acc = res,
+                res @ FoldWhile::Done(_) => return res,
+            }
+        }
+        FoldWhile::Continue(acc)
+    }
+
+    /// Collect all iterator elements into a sorted vector in ascending order.
+    ///
+    /// **Note:** This consumes the entire iterator, uses the
+    /// `slice::sort_by()` method and returns the sorted vector.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // sort the letters of the text in ascending order
+    /// let text = "bdacfe";
+    /// itertools::assert_equal(text.chars().sorted(),
+    ///                         "abcdef".chars());
+    /// ```
+    fn sorted(self) -> Vec<Self::Item>
+        where Self: Sized,
+              Self::Item: Ord
+    {
+        self.sorted_by(Ord::cmp)
+    }
+
+    /// Collect all iterator elements into a sorted vector.
+    ///
+    /// **Note:** This consumes the entire iterator, uses the
+    /// `slice::sort_by()` method and returns the sorted vector.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // sort people in descending order by age
+    /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)];
+    ///
+    /// let oldest_people_first = people
+    ///     .into_iter()
+    ///     .sorted_by(|a, b| Ord::cmp(&b.1, &a.1))
+    ///     .into_iter()
+    ///     .map(|(person, _age)| person);
+    ///
+    /// itertools::assert_equal(oldest_people_first,
+    ///                         vec!["Jill", "Jack", "Jane", "John"]);
+    /// ```
+    fn sorted_by<F>(self, cmp: F) -> Vec<Self::Item>
+        where Self: Sized,
+              F: FnMut(&Self::Item, &Self::Item) -> Ordering,
+    {
+        let mut v: Vec<Self::Item> = self.collect();
+
+        v.sort_by(cmp);
+        v
+    }
+
+    /// Collect all iterator elements into one of two
+    /// partitions. Unlike `Iterator::partition`, each partition may
+    /// have a distinct type.
+    ///
+    /// ```
+    /// use itertools::{Itertools, Either};
+    ///
+    /// let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)];
+    ///
+    /// let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures
+    ///     .into_iter()
+    ///     .partition_map(|r| {
+    ///         match r {
+    ///             Ok(v) => Either::Left(v),
+    ///             Err(v) => Either::Right(v),
+    ///         }
+    ///     });
+    ///
+    /// assert_eq!(successes, [1, 2]);
+    /// assert_eq!(failures, [false, true]);
+    /// ```
+    fn partition_map<A, B, F, L, R>(self, predicate: F) -> (A, B)
+        where Self: Sized,
+              F: Fn(Self::Item) -> Either<L, R>,
+              A: Default + Extend<L>,
+              B: Default + Extend<R>,
+    {
+        let mut left = A::default();
+        let mut right = B::default();
+
+        for val in self {
+            match predicate(val) {
+                Either::Left(v) => left.extend(Some(v)),
+                Either::Right(v) => right.extend(Some(v)),
+            }
+        }
+
+        (left, right)
+    }
+
+    /// Return the minimum and maximum elements in the iterator.
+    ///
+    /// The return type `MinMaxResult` is an enum of three variants:
+    ///
+    /// - `NoElements` if the iterator is empty.
+    /// - `OneElement(x)` if the iterator has exactly one element.
+    /// - `MinMax(x, y)` is returned otherwise, where `x <= y`. Two
+    ///    values are equal if and only if there is more than one
+    ///    element in the iterator and all elements are equal.
+    ///
+    /// On an iterator of length `n`, `minmax` does `1.5 * n` comparisons,
+    /// and so is faster than calling `min` and `max` separately which does
+    /// `2 * n` comparisons.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax};
+    ///
+    /// let a: [i32; 0] = [];
+    /// assert_eq!(a.iter().minmax(), NoElements);
+    ///
+    /// let a = [1];
+    /// assert_eq!(a.iter().minmax(), OneElement(&1));
+    ///
+    /// let a = [1, 2, 3, 4, 5];
+    /// assert_eq!(a.iter().minmax(), MinMax(&1, &5));
+    ///
+    /// let a = [1, 1, 1, 1];
+    /// assert_eq!(a.iter().minmax(), MinMax(&1, &1));
+    /// ```
+    ///
+    /// The elements can be floats but no particular result is guaranteed
+    /// if an element is NaN.
+    fn minmax(self) -> MinMaxResult<Self::Item>
+        where Self: Sized, Self::Item: PartialOrd
+    {
+        minmax::minmax_impl(self, |_| (), |x, y, _, _| x < y)
+    }
+
+    /// Return the minimum and maximum element of an iterator, as determined by
+    /// the specified function.
+    ///
+    /// The return value is a variant of `MinMaxResult` like for `minmax()`.
+    ///
+    /// For the minimum, the first minimal element is returned.  For the maximum,
+    /// the last maximal element wins.  This matches the behavior of the standard
+    /// `Iterator::min()` and `Iterator::max()` methods.
+    ///
+    /// The keys can be floats but no particular result is guaranteed
+    /// if a key is NaN.
+    fn minmax_by_key<K, F>(self, key: F) -> MinMaxResult<Self::Item>
+        where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K
+    {
+        minmax::minmax_impl(self, key, |_, _, xk, yk| xk < yk)
+    }
+
+    /// Return the minimum and maximum element of an iterator, as determined by
+    /// the specified comparison function.
+    ///
+    /// The return value is a variant of `MinMaxResult` like for `minmax()`.
+    ///
+    /// For the minimum, the first minimal element is returned.  For the maximum,
+    /// the last maximal element wins.  This matches the behavior of the standard
+    /// `Iterator::min()` and `Iterator::max()` methods.
+    fn minmax_by<F>(self, mut compare: F) -> MinMaxResult<Self::Item>
+        where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering
+    {
+        minmax::minmax_impl(
+            self,
+            |_| (),
+            |x, y, _, _| Ordering::Less == compare(x, y)
+        )
+    }
+}
+
+impl<T: ?Sized> Itertools for T where T: Iterator { }
+
+/// Return `true` if both iterators produce equal sequences
+/// (elements pairwise equal and sequences of the same length),
+/// `false` otherwise.
+///
+/// **Note:** the standard library method `Iterator::eq` now provides
+/// the same functionality.
+///
+/// ```
+/// assert!(itertools::equal(vec![1, 2, 3], 1..4));
+/// assert!(!itertools::equal(&[0, 0], &[0, 0, 0]));
+/// ```
+pub fn equal<I, J>(a: I, b: J) -> bool
+    where I: IntoIterator,
+          J: IntoIterator,
+          I::Item: PartialEq<J::Item>
+{
+    let mut ia = a.into_iter();
+    let mut ib = b.into_iter();
+    loop {
+        match ia.next() {
+            Some(ref x) => match ib.next() {
+                Some(ref y) => if x != y { return false; },
+                None => return false,
+            },
+            None => return ib.next().is_none()
+        }
+    }
+}
+
+/// Assert that two iterators produce equal sequences, with the same
+/// semantics as *equal(a, b)*.
+///
+/// **Panics** on assertion failure with a message that shows the
+/// two iteration elements.
+///
+/// ```ignore
+/// assert_equal("exceed".split('c'), "excess".split('c'));
+/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1',
+/// ```
+pub fn assert_equal<I, J>(a: I, b: J)
+    where I: IntoIterator,
+          J: IntoIterator,
+          I::Item: fmt::Debug + PartialEq<J::Item>,
+          J::Item: fmt::Debug,
+{
+    let mut ia = a.into_iter();
+    let mut ib = b.into_iter();
+    let mut i = 0;
+    loop {
+        match (ia.next(), ib.next()) {
+            (None, None) => return,
+            (a, b) => {
+                let equal = match (&a, &b) {
+                    (&Some(ref a), &Some(ref b)) => a == b,
+                    _ => false,
+                };
+                assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}",
+                        i=i, a=a, b=b);
+                i += 1;
+            }
+        }
+    }
+}
+
+/// Partition a sequence using predicate `pred` so that elements
+/// that map to `true` are placed before elements which map to `false`.
+///
+/// The order within the partitions is arbitrary.
+///
+/// Return the index of the split point.
+///
+/// ```
+/// use itertools::partition;
+///
+/// # // use repeated numbers to not promise any ordering
+/// let mut data = [7, 1, 1, 7, 1, 1, 7];
+/// let split_index = partition(&mut data, |elt| *elt >= 3);
+///
+/// assert_eq!(data, [7, 7, 7, 1, 1, 1, 1]);
+/// assert_eq!(split_index, 3);
+/// ```
+pub fn partition<'a, A: 'a, I, F>(iter: I, mut pred: F) -> usize
+    where I: IntoIterator<Item = &'a mut A>,
+          I::IntoIter: DoubleEndedIterator,
+          F: FnMut(&A) -> bool
+{
+    let mut split_index = 0;
+    let mut iter = iter.into_iter();
+    'main: while let Some(front) = iter.next() {
+        if !pred(front) {
+            loop {
+                match iter.next_back() {
+                    Some(back) => if pred(back) {
+                        std::mem::swap(front, back);
+                        break;
+                    },
+                    None => break 'main,
+                }
+            }
+        }
+        split_index += 1;
+    }
+    split_index
+}
+
+/// An enum used for controlling the execution of `.fold_while()`.
+///
+/// See [`.fold_while()`](trait.Itertools.html#method.fold_while) for more information.
+#[derive(Copy, Clone, Debug)]
+pub enum FoldWhile<T> {
+    /// Continue folding with this value
+    Continue(T),
+    /// Fold is complete and will return this value
+    Done(T),
+}
+
+impl<T> FoldWhile<T> {
+    /// Return the value in the continue or done.
+    pub fn into_inner(self) -> T {
+        match self {
+            FoldWhile::Continue(x) | FoldWhile::Done(x) => x,
+        }
+    }
+
+    /// Return true if `self` is `Done`, false if it is `Continue`.
+    pub fn is_done(&self) -> bool {
+        match *self {
+            FoldWhile::Continue(_) => false,
+            FoldWhile::Done(_) => true,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/minmax.rs
@@ -0,0 +1,114 @@
+
+/// `MinMaxResult` is an enum returned by `minmax`. See `Itertools::minmax()` for
+/// more detail.
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub enum MinMaxResult<T> {
+    /// Empty iterator
+    NoElements,
+
+    /// Iterator with one element, so the minimum and maximum are the same
+    OneElement(T),
+
+    /// More than one element in the iterator, the first element is not larger
+    /// than the second
+    MinMax(T, T)
+}
+
+impl<T: Clone> MinMaxResult<T> {
+    /// `into_option` creates an `Option` of type `(T, T)`. The returned `Option`
+    /// has variant `None` if and only if the `MinMaxResult` has variant
+    /// `NoElements`. Otherwise `Some((x, y))` is returned where `x <= y`.
+    /// If the `MinMaxResult` has variant `OneElement(x)`, performing this
+    /// operation will make one clone of `x`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use itertools::MinMaxResult::{self, NoElements, OneElement, MinMax};
+    ///
+    /// let r: MinMaxResult<i32> = NoElements;
+    /// assert_eq!(r.into_option(), None);
+    ///
+    /// let r = OneElement(1);
+    /// assert_eq!(r.into_option(), Some((1, 1)));
+    ///
+    /// let r = MinMax(1, 2);
+    /// assert_eq!(r.into_option(), Some((1, 2)));
+    /// ```
+    pub fn into_option(self) -> Option<(T,T)> {
+        match self {
+            MinMaxResult::NoElements => None,
+            MinMaxResult::OneElement(x) => Some((x.clone(), x)),
+            MinMaxResult::MinMax(x, y) => Some((x, y))
+        }
+    }
+}
+
+/// Implementation guts for `minmax` and `minmax_by_key`.
+pub fn minmax_impl<I, K, F, L>(mut it: I, mut key_for: F,
+                               mut lt: L) -> MinMaxResult<I::Item>
+    where I: Iterator,
+          F: FnMut(&I::Item) -> K,
+          L: FnMut(&I::Item, &I::Item, &K, &K) -> bool,
+{
+    let (mut min, mut max, mut min_key, mut max_key) = match it.next() {
+        None => return MinMaxResult::NoElements,
+        Some(x) => {
+            match it.next() {
+                None => return MinMaxResult::OneElement(x),
+                Some(y) => {
+                    let xk = key_for(&x);
+                    let yk = key_for(&y);
+                    if !lt(&y, &x, &yk, &xk) {(x, y, xk, yk)} else {(y, x, yk, xk)}
+                }
+            }
+        }
+    };
+
+    loop {
+        // `first` and `second` are the two next elements we want to look
+        // at.  We first compare `first` and `second` (#1). The smaller one
+        // is then compared to current minimum (#2). The larger one is
+        // compared to current maximum (#3). This way we do 3 comparisons
+        // for 2 elements.
+        let first = match it.next() {
+            None => break,
+            Some(x) => x
+        };
+        let second = match it.next() {
+            None => {
+                let first_key = key_for(&first);
+                if lt(&first, &min, &first_key, &min_key) {
+                    min = first;
+                } else if !lt(&first, &max, &first_key, &max_key) {
+                    max = first;
+                }
+                break;
+            }
+            Some(x) => x
+        };
+        let first_key = key_for(&first);
+        let second_key = key_for(&second);
+        if !lt(&second, &first, &second_key, &first_key) {
+            if lt(&first, &min, &first_key, &min_key) {
+                min = first;
+                min_key = first_key;
+            }
+            if !lt(&second, &max, &second_key, &max_key) {
+                max = second;
+                max_key = second_key;
+            }
+        } else {
+            if lt(&second, &min, &second_key, &min_key) {
+                min = second;
+                min_key = second_key;
+            }
+            if !lt(&first, &max, &first_key, &max_key) {
+                max = first;
+                max_key = first_key;
+            }
+        }
+    }
+
+    MinMaxResult::MinMax(min, max)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/pad_tail.rs
@@ -0,0 +1,82 @@
+use std::iter::Fuse;
+use size_hint;
+
+/// An iterator adaptor that pads a sequence to a minimum length by filling
+/// missing elements using a closure.
+///
+/// Iterator element type is `I::Item`.
+///
+/// See [`.pad_using()`](../trait.Itertools.html#method.pad_using) for more information.
+#[derive(Clone)]
+pub struct PadUsing<I, F> {
+    iter: Fuse<I>,
+    min: usize,
+    pos: usize,
+    filler: F,
+}
+
+/// Create a new **PadUsing** iterator.
+pub fn pad_using<I, F>(iter: I, min: usize, filler: F) -> PadUsing<I, F>
+    where I: Iterator,
+          F: FnMut(usize) -> I::Item
+{
+    PadUsing {
+        iter: iter.fuse(),
+        min: min,
+        pos: 0,
+        filler: filler,
+    }
+}
+
+impl<I, F> Iterator for PadUsing<I, F>
+    where I: Iterator,
+          F: FnMut(usize) -> I::Item
+{
+    type Item = I::Item;
+
+    #[inline]
+    fn next(&mut self) -> Option<I::Item> {
+        match self.iter.next() {
+            None => {
+                if self.pos < self.min {
+                    let e = Some((self.filler)(self.pos));
+                    self.pos += 1;
+                    e
+                } else {
+                    None
+                }
+            },
+            e => {
+                self.pos += 1;
+                e
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let tail = self.min.saturating_sub(self.pos);
+        size_hint::max(self.iter.size_hint(), (tail, Some(tail)))
+    }
+}
+
+impl<I, F> DoubleEndedIterator for PadUsing<I, F>
+    where I: DoubleEndedIterator + ExactSizeIterator,
+          F: FnMut(usize) -> I::Item
+{
+    fn next_back(&mut self) -> Option<I::Item> {
+        if self.min == 0 {
+            self.iter.next_back()
+        } else if self.iter.len() >= self.min {
+            self.min -= 1;
+            self.iter.next_back()
+        } else {
+            self.min -= 1;
+            Some((self.filler)(self.min))
+        }
+    }
+}
+
+impl<I, F> ExactSizeIterator for PadUsing<I, F>
+    where I: ExactSizeIterator,
+          F: FnMut(usize) -> I::Item
+{}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/peeking_take_while.rs
@@ -0,0 +1,144 @@
+
+use std::iter::Peekable;
+use PutBack;
+use PutBackN;
+
+/// An iterator that allows peeking at an element before deciding to accept it.
+///
+/// See [`.peeking_take_while()`](trait.Itertools.html#method.peeking_take_while)
+/// for more information.
+///
+/// This is implemented by peeking adaptors like peekable and put back,
+/// but also by a few iterators that can be peeked natively, like the slice’s
+/// by reference iterator (`std::slice::Iter`).
+pub trait PeekingNext : Iterator {
+    /// Pass a reference to the next iterator element to the closure `accept`;
+    /// if `accept` returns true, return it as the next element,
+    /// else None.
+    fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
+        where F: FnOnce(&Self::Item) -> bool;
+}
+
+impl<I> PeekingNext for Peekable<I>
+    where I: Iterator,
+{
+    fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
+        where F: FnOnce(&Self::Item) -> bool
+    {
+        if let Some(r) = self.peek() {
+            if !accept(r) {
+                return None;
+            }
+        }
+        self.next()
+    }
+}
+
+impl<I> PeekingNext for PutBack<I>
+    where I: Iterator,
+{
+    fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
+        where F: FnOnce(&Self::Item) -> bool
+    {
+        if let Some(r) = self.next() {
+            if !accept(&r) {
+                self.put_back(r);
+                return None;
+            }
+            Some(r)
+        } else {
+            None
+        }
+    }
+}
+
+impl<I> PeekingNext for PutBackN<I>
+    where I: Iterator,
+{
+    fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
+        where F: FnOnce(&Self::Item) -> bool
+    {
+        if let Some(r) = self.next() {
+            if !accept(&r) {
+                self.put_back(r);
+                return None;
+            }
+            Some(r)
+        } else {
+            None
+        }
+    }
+}
+
+/// An iterator adaptor that takes items while a closure returns `true`.
+///
+/// See [`.peeking_take_while()`](../trait.Itertools.html#method.peeking_take_while)
+/// for more information.
+pub struct PeekingTakeWhile<'a, I: 'a, F>
+    where I: Iterator,
+{
+    iter: &'a mut I,
+    f: F,
+}
+
+/// Create a PeekingTakeWhile
+pub fn peeking_take_while<I, F>(iter: &mut I, f: F) -> PeekingTakeWhile<I, F>
+    where I: Iterator,
+{
+    PeekingTakeWhile {
+        iter: iter,
+        f: f,
+    }
+}
+
+impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F>
+    where I: PeekingNext,
+          F: FnMut(&I::Item) -> bool,
+
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.peeking_next(&mut self.f)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+// Some iterators are so lightweight we can simply clone them to save their
+// state and use that for peeking.
+macro_rules! peeking_next_by_clone {
+    ([$($typarm:tt)*] $type_:ty) => {
+        impl<$($typarm)*> PeekingNext for $type_ {
+            fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item>
+                where F: FnOnce(&Self::Item) -> bool
+            {
+                let saved_state = self.clone();
+                if let Some(r) = self.next() {
+                    if !accept(&r) {
+                        *self = saved_state;
+                    } else {
+                        return Some(r)
+                    }
+                }
+                None
+            }
+        }
+    }
+}
+
+peeking_next_by_clone! { ['a, T] ::std::slice::Iter<'a, T> }
+peeking_next_by_clone! { ['a] ::std::str::Chars<'a> }
+peeking_next_by_clone! { ['a] ::std::str::CharIndices<'a> }
+peeking_next_by_clone! { ['a] ::std::str::Bytes<'a> }
+peeking_next_by_clone! { ['a, T] ::std::option::Iter<'a, T> }
+peeking_next_by_clone! { ['a, T] ::std::result::Iter<'a, T> }
+peeking_next_by_clone! { [T] ::std::iter::Empty<T> }
+peeking_next_by_clone! { ['a, T] ::std::collections::linked_list::Iter<'a, T> }
+peeking_next_by_clone! { ['a, T] ::std::collections::vec_deque::Iter<'a, T> }
+
+// cloning a Rev has no extra overhead; peekable and put backs are never DEI.
+peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator]
+                         ::std::iter::Rev<I> }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/process_results_impl.rs
@@ -0,0 +1,79 @@
+
+/// An iterator that produces only the `T` values as long as the
+/// inner iterator produces `Ok(T)`.
+///
+/// Used by [`process_results`](../fn.process_results.html), see its docs
+/// for more information.
+pub struct ProcessResults<'a, I, E: 'a> {
+    error: &'a mut Result<(), E>,
+    iter: I,
+}
+
+impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E>
+    where I: Iterator<Item = Result<T, E>>
+{
+    type Item = T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        match self.iter.next() {
+            Some(Ok(x)) => Some(x),
+            Some(Err(e)) => {
+                *self.error = Err(e);
+                None
+            }
+            None => None,
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+/// “Lift” a function of the values of an iterator so that it can process
+/// an iterator of `Result` values instead.
+///
+/// `iterable` is an iterator or iterable with `Result<T, E>` elements, where
+/// `T` is the value type and `E` the error type.
+///
+/// `processor` is a closure that receives an adapted version of the iterable
+/// as the only argument — the adapted iterator produces elements of type `T`,
+/// as long as the original iterator produces `Ok` values.
+///
+/// If the original iterable produces an error at any point, the adapted
+/// iterator ends and the `process_results` function will return the
+/// error iself.
+///
+/// Otherwise, the return value from the closure is returned wrapped
+/// inside `Ok`.
+///
+/// # Example
+///
+/// ```
+/// use itertools::process_results;
+///
+/// type R = Result<i32, &'static str>;
+///
+/// let first_values: Vec<R> = vec![Ok(1), Ok(0), Ok(3)];
+/// let second_values: Vec<R> = vec![Ok(2), Ok(1), Err("overflow")];
+///
+/// // “Lift” the iterator .max() method to work on the values in Results using process_results
+///
+/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0));
+/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0));
+///
+/// assert_eq!(first_max, Ok(3));
+/// assert!(second_max.is_err());
+/// ```
+pub fn process_results<I, F, T, E, R>(iterable: I, processor: F) -> Result<R, E>
+    where I: IntoIterator<Item = Result<T, E>>,
+          F: FnOnce(ProcessResults<I::IntoIter, E>) -> R
+{
+    let iter = iterable.into_iter();
+    let mut error = Ok(());
+
+    let result = processor(ProcessResults { error: &mut error, iter: iter });
+
+    error.map(|_| result)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/rciter_impl.rs
@@ -0,0 +1,97 @@
+
+use std::iter::IntoIterator;
+use std::rc::Rc;
+use std::cell::RefCell;
+
+/// A wrapper for `Rc<RefCell<I>>`, that implements the `Iterator` trait.
+pub struct RcIter<I> {
+    /// The boxed iterator.
+    pub rciter: Rc<RefCell<I>>,
+}
+
+/// Return an iterator inside a `Rc<RefCell<_>>` wrapper.
+///
+/// The returned `RcIter` can be cloned, and each clone will refer back to the
+/// same original iterator.
+///
+/// `RcIter` allows doing interesting things like using `.zip()` on an iterator with
+/// itself, at the cost of runtime borrow checking which may have a performance
+/// penalty.
+///
+/// Iterator element type is `Self::Item`.
+///
+/// ```
+/// use itertools::rciter;
+/// use itertools::zip;
+///
+/// // In this example a range iterator is created and we iterate it using
+/// // three separate handles (two of them given to zip).
+/// // We also use the IntoIterator implementation for `&RcIter`.
+///
+/// let mut iter = rciter(0..9);
+/// let mut z = zip(&iter, &iter);
+///
+/// assert_eq!(z.next(), Some((0, 1)));
+/// assert_eq!(z.next(), Some((2, 3)));
+/// assert_eq!(z.next(), Some((4, 5)));
+/// assert_eq!(iter.next(), Some(6));
+/// assert_eq!(z.next(), Some((7, 8)));
+/// assert_eq!(z.next(), None);
+/// ```
+///
+/// **Panics** in iterator methods if a borrow error is encountered in the
+/// iterator methods. It can only happen if the `RcIter` is reentered in
+/// `.next()`, i.e. if it somehow participates in an “iterator knot”
+/// where it is an adaptor of itself.
+pub fn rciter<I>(iterable: I) -> RcIter<I::IntoIter>
+    where I: IntoIterator
+{
+    RcIter { rciter: Rc::new(RefCell::new(iterable.into_iter())) }
+}
+
+impl<I> Clone for RcIter<I> {
+    #[inline]
+    fn clone(&self) -> RcIter<I> {
+        RcIter { rciter: self.rciter.clone() }
+    }
+}
+
+impl<A, I> Iterator for RcIter<I>
+    where I: Iterator<Item = A>
+{
+    type Item = A;
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        self.rciter.borrow_mut().next()
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // To work sanely with other API that assume they own an iterator,
+        // so it can't change in other places, we can't guarantee as much
+        // in our size_hint. Other clones may drain values under our feet.
+        let (_, hi) = self.rciter.borrow().size_hint();
+        (0, hi)
+    }
+}
+
+impl<I> DoubleEndedIterator for RcIter<I>
+    where I: DoubleEndedIterator
+{
+    #[inline]
+    fn next_back(&mut self) -> Option<I::Item> {
+        self.rciter.borrow_mut().next_back()
+    }
+}
+
+/// Return an iterator from `&RcIter<I>` (by simply cloning it).
+impl<'a, I> IntoIterator for &'a RcIter<I>
+    where I: Iterator
+{
+    type Item = I::Item;
+    type IntoIter = RcIter<I>;
+
+    fn into_iter(self) -> RcIter<I> {
+        self.clone()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/repeatn.rs
@@ -0,0 +1,52 @@
+
+/// An iterator that produces *n* repetitions of an element.
+///
+/// See [`repeat_n()`](../fn.repeat_n.html) for more information.
+pub struct RepeatN<A> {
+    elt: Option<A>,
+    n: usize,
+}
+
+/// Create an iterator that produces `n` repetitions of `element`.
+pub fn repeat_n<A>(element: A, n: usize) -> RepeatN<A>
+    where A: Clone,
+{
+    if n == 0 {
+        RepeatN { elt: None, n: n, }
+    } else {
+        RepeatN { elt: Some(element), n: n, }
+    }
+}
+
+impl<A> Iterator for RepeatN<A>
+    where A: Clone
+{
+    type Item = A;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        if self.n > 1 {
+            self.n -= 1;
+            self.elt.as_ref().cloned()
+        } else {
+            self.n = 0;
+            self.elt.take()
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (self.n, Some(self.n))
+    }
+}
+
+impl<A> DoubleEndedIterator for RepeatN<A>
+    where A: Clone
+{
+    #[inline]
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.next()
+    }
+}
+
+impl<A> ExactSizeIterator for RepeatN<A>
+    where A: Clone
+{}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/size_hint.rs
@@ -0,0 +1,104 @@
+//! Arithmetic on **Iterator** *.size_hint()* values.
+//!
+
+use std::usize;
+use std::cmp;
+
+/// **SizeHint** is the return type of **Iterator::size_hint()**.
+pub type SizeHint = (usize, Option<usize>);
+
+/// Add **SizeHint** correctly.
+#[inline]
+pub fn add(a: SizeHint, b: SizeHint) -> SizeHint {
+    let min = a.0.checked_add(b.0).unwrap_or(usize::MAX);
+    let max = match (a.1, b.1) {
+        (Some(x), Some(y)) => x.checked_add(y),
+        _ => None,
+    };
+
+    (min, max)
+}
+
+/// Add **x** correctly to a **SizeHint**.
+#[inline]
+pub fn add_scalar(sh: SizeHint, x: usize) -> SizeHint {
+    let (mut low, mut hi) = sh;
+    low = low.saturating_add(x);
+    hi = hi.and_then(|elt| elt.checked_add(x));
+    (low, hi)
+}
+
+/// Sbb **x** correctly to a **SizeHint**.
+#[inline]
+#[allow(dead_code)]
+pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint {
+    let (mut low, mut hi) = sh;
+    low = low.saturating_sub(x);
+    hi = hi.map(|elt| elt.saturating_sub(x));
+    (low, hi)
+}
+
+
+/// Multiply **SizeHint** correctly
+///
+/// ```ignore
+/// use std::usize;
+/// use itertools::size_hint;
+///
+/// assert_eq!(size_hint::mul((3, Some(4)), (3, Some(4))),
+///            (9, Some(16)));
+///
+/// assert_eq!(size_hint::mul((3, Some(4)), (usize::MAX, None)),
+///            (usize::MAX, None));
+///
+/// assert_eq!(size_hint::mul((3, None), (0, Some(0))),
+///            (0, Some(0)));
+/// ```
+#[inline]
+pub fn mul(a: SizeHint, b: SizeHint) -> SizeHint {
+    let low = a.0.checked_mul(b.0).unwrap_or(usize::MAX);
+    let hi = match (a.1, b.1) {
+        (Some(x), Some(y)) => x.checked_mul(y),
+        (Some(0), None) | (None, Some(0)) => Some(0),
+        _ => None,
+    };
+    (low, hi)
+}
+
+/// Multiply **x** correctly with a **SizeHint**.
+#[inline]
+pub fn mul_scalar(sh: SizeHint, x: usize) -> SizeHint {
+    let (mut low, mut hi) = sh;
+    low = low.saturating_mul(x);
+    hi = hi.and_then(|elt| elt.checked_mul(x));
+    (low, hi)
+}
+
+/// Return the maximum
+#[inline]
+pub fn max(a: SizeHint, b: SizeHint) -> SizeHint {
+    let (a_lower, a_upper) = a;
+    let (b_lower, b_upper) = b;
+
+    let lower = cmp::max(a_lower, b_lower);
+
+    let upper = match (a_upper, b_upper) {
+        (Some(x), Some(y)) => Some(cmp::max(x, y)),
+        _ => None,
+    };
+
+    (lower, upper)
+}
+
+/// Return the minimum
+#[inline]
+pub fn min(a: SizeHint, b: SizeHint) -> SizeHint {
+    let (a_lower, a_upper) = a;
+    let (b_lower, b_upper) = b;
+    let lower = cmp::min(a_lower, b_lower);
+    let upper = match (a_upper, b_upper) {
+        (Some(u1), Some(u2)) => Some(cmp::min(u1, u2)),
+        _ => a_upper.or(b_upper),
+    };
+    (lower, upper)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/sources.rs
@@ -0,0 +1,183 @@
+//! Iterators that are sources (produce elements from parameters,
+//! not from another iterator).
+
+use std::fmt;
+use std::mem;
+
+/// See [`repeat_call`](../fn.repeat_call.html) for more information.
+pub struct RepeatCall<F> {
+    f: F,
+}
+
+impl<F> fmt::Debug for RepeatCall<F>
+{
+    debug_fmt_fields!(RepeatCall, );
+}
+
+/// An iterator source that produces elements indefinitely by calling
+/// a given closure.
+///
+/// Iterator element type is the return type of the closure.
+///
+/// ```
+/// use itertools::repeat_call;
+/// use itertools::Itertools;
+/// use std::collections::BinaryHeap;
+///
+/// let mut heap = BinaryHeap::from(vec![2, 5, 3, 7, 8]);
+///
+/// // extract each element in sorted order
+/// for element in repeat_call(|| heap.pop()).while_some() {
+///     print!("{}", element);
+/// }
+///
+/// itertools::assert_equal(
+///     repeat_call(|| 1).take(5),
+///     vec![1, 1, 1, 1, 1]
+/// );
+/// ```
+pub fn repeat_call<F>(function: F) -> RepeatCall<F> {
+    RepeatCall { f: function }
+}
+
+impl<A, F> Iterator for RepeatCall<F>
+    where F: FnMut() -> A
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        Some((self.f)())
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (usize::max_value(), None)
+    }
+}
+
+/// Creates a new unfold source with the specified closure as the "iterator
+/// function" and an initial state to eventually pass to the closure
+///
+/// `unfold` is a general iterator builder: it has a mutable state value,
+/// and a closure with access to the state that produces the next value.
+///
+/// This more or less equivalent to a regular struct with an `Iterator`
+/// implementation, and is useful for one-off iterators.
+///
+/// ```
+/// // an iterator that yields sequential Fibonacci numbers,
+/// // and stops at the maximum representable value.
+///
+/// use itertools::unfold;
+///
+/// let (mut x1, mut x2) = (1u32, 1u32);
+/// let mut fibonacci = unfold((), move |_| {
+///     // Attempt to get the next Fibonacci number
+///     let next = x1.saturating_add(x2);
+///
+///     // Shift left: ret <- x1 <- x2 <- next
+///     let ret = x1;
+///     x1 = x2;
+///     x2 = next;
+///
+///     // If addition has saturated at the maximum, we are finished
+///     if ret == x1 && ret > 1 {
+///         return None;
+///     }
+///
+///     Some(ret)
+/// });
+///
+/// itertools::assert_equal(fibonacci.by_ref().take(8),
+///                         vec![1, 1, 2, 3, 5, 8, 13, 21]);
+/// assert_eq!(fibonacci.last(), Some(2_971_215_073))
+/// ```
+pub fn unfold<A, St, F>(initial_state: St, f: F) -> Unfold<St, F>
+    where F: FnMut(&mut St) -> Option<A>
+{
+    Unfold {
+        f: f,
+        state: initial_state,
+    }
+}
+
+impl<St, F> fmt::Debug for Unfold<St, F>
+    where St: fmt::Debug,
+{
+    debug_fmt_fields!(Unfold, state);
+}
+
+/// See [`unfold`](../fn.unfold.html) for more information.
+#[derive(Clone)]
+pub struct Unfold<St, F> {
+    f: F,
+    /// Internal state that will be passed to the closure on the next iteration
+    pub state: St,
+}
+
+impl<A, St, F> Iterator for Unfold<St, F>
+    where F: FnMut(&mut St) -> Option<A>
+{
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        (self.f)(&mut self.state)
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        // no possible known bounds at this point
+        (0, None)
+    }
+}
+
+/// An iterator that infinitely applies function to value and yields results.
+///
+/// This `struct` is created by the [`iterate()`] function. See its documentation for more.
+///
+/// [`iterate()`]: ../fn.iterate.html
+#[derive(Clone)]
+pub struct Iterate<St, F> {
+    state: St,
+    f: F,
+}
+
+impl<St, F> fmt::Debug for Iterate<St, F>
+    where St: fmt::Debug,
+{
+    debug_fmt_fields!(Iterate, state);
+}
+
+impl<St, F> Iterator for Iterate<St, F>
+    where F: FnMut(&St) -> St
+{
+    type Item = St;
+
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        let next_state = (self.f)(&self.state);
+        Some(mem::replace(&mut self.state, next_state))
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (usize::max_value(), None)
+    }
+}
+
+/// Creates a new iterator that infinitely applies function to value and yields results.
+///
+/// ```
+/// use itertools::iterate;
+///
+/// itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]);
+/// ```
+pub fn iterate<St, F>(initial_value: St, f: F) -> Iterate<St, F>
+    where F: FnMut(&St) -> St
+{
+    Iterate {
+        state: initial_value,
+        f: f,
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/tee.rs
@@ -0,0 +1,75 @@
+use super::size_hint;
+
+use std::cell::RefCell;
+use std::collections::VecDeque;
+use std::rc::Rc;
+
+/// Common buffer object for the two tee halves
+struct TeeBuffer<A, I> {
+    backlog: VecDeque<A>,
+    iter: I,
+    /// The owner field indicates which id should read from the backlog
+    owner: bool,
+}
+
+/// One half of an iterator pair where both return the same elements.
+///
+/// See [`.tee()`](../trait.Itertools.html#method.tee) for more information.
+pub struct Tee<I>
+    where I: Iterator
+{
+    rcbuffer: Rc<RefCell<TeeBuffer<I::Item, I>>>,
+    id: bool,
+}
+
+pub fn new<I>(iter: I) -> (Tee<I>, Tee<I>)
+    where I: Iterator
+{
+    let buffer = TeeBuffer{backlog: VecDeque::new(), iter: iter, owner: false};
+    let t1 = Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true};
+    let t2 = Tee{rcbuffer: t1.rcbuffer.clone(), id: false};
+    (t1, t2)
+}
+
+impl<I> Iterator for Tee<I>
+    where I: Iterator,
+          I::Item: Clone
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<I::Item> {
+        // .borrow_mut may fail here -- but only if the user has tied some kind of weird
+        // knot where the iterator refers back to itself.
+        let mut buffer = self.rcbuffer.borrow_mut();
+        if buffer.owner == self.id {
+            match buffer.backlog.pop_front() {
+                None => {}
+                some_elt => return some_elt,
+            }
+        }
+        match buffer.iter.next() {
+            None => None,
+            Some(elt) => {
+                buffer.backlog.push_back(elt.clone());
+                buffer.owner = !self.id;
+                Some(elt)
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let buffer = self.rcbuffer.borrow();
+        let sh = buffer.iter.size_hint();
+
+        if buffer.owner == self.id {
+            let log_len = buffer.backlog.len();
+            size_hint::add_scalar(sh, log_len)
+        } else {
+            sh
+        }
+    }
+}
+
+impl<I> ExactSizeIterator for Tee<I>
+    where I: ExactSizeIterator,
+          I::Item: Clone
+{}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/tuple_impl.rs
@@ -0,0 +1,262 @@
+//! Some iterator that produces tuples
+
+use std::iter::Fuse;
+
+/// An iterator over a incomplete tuple.
+///
+/// See [`.tuples()`](../trait.Itertools.html#method.tuples) and
+/// [`Tuples::into_buffer()`](struct.Tuples.html#method.into_buffer).
+pub struct TupleBuffer<T>
+    where T: TupleCollect
+{
+    cur: usize,
+    buf: T::Buffer,
+}
+
+impl<T> TupleBuffer<T>
+    where T: TupleCollect
+{
+    fn new(buf: T::Buffer) -> Self {
+        TupleBuffer {
+            cur: 0,
+            buf: buf,
+        }
+    }
+}
+
+impl<T> Iterator for TupleBuffer<T>
+    where T: TupleCollect
+{
+    type Item = T::Item;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let s = self.buf.as_mut();
+        if let Some(ref mut item) = s.get_mut(self.cur) {
+            self.cur += 1;
+            item.take()
+        } else {
+            None
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let buffer = &self.buf.as_ref()[self.cur..];
+        let len = if buffer.len() == 0 {
+            0
+        } else {
+            buffer.iter()
+                  .position(|x| x.is_none())
+                  .unwrap_or(buffer.len())
+        };
+        (len, Some(len))
+    }
+}
+
+impl<T> ExactSizeIterator for TupleBuffer<T>
+    where T: TupleCollect
+{
+}
+
+/// An iterator that groups the items in tuples of a specific size.
+///
+/// See [`.tuples()`](../trait.Itertools.html#method.tuples) for more information.
+pub struct Tuples<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect
+{
+    iter: Fuse<I>,
+    buf: T::Buffer,
+}
+
+/// Create a new tuples iterator.
+pub fn tuples<I, T>(iter: I) -> Tuples<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect
+{
+    Tuples {
+        iter: iter.fuse(),
+        buf: Default::default(),
+    }
+}
+
+impl<I, T> Iterator for Tuples<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect
+{
+    type Item = T;
+
+    fn next(&mut self) -> Option<T> {
+        T::collect_from_iter(&mut self.iter, &mut self.buf)
+    }
+}
+
+impl<I, T> Tuples<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect
+{
+    /// Return a buffer with the produced items that was not enough to be grouped in a tuple.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut iter = (0..5).tuples();
+    /// assert_eq!(Some((0, 1, 2)), iter.next());
+    /// assert_eq!(None, iter.next());
+    /// itertools::assert_equal(vec![3, 4], iter.into_buffer());
+    /// ```
+    pub fn into_buffer(self) -> TupleBuffer<T> {
+        TupleBuffer::new(self.buf)
+    }
+}
+
+
+/// An iterator over all contiguous windows that produces tuples of a specific size.
+///
+/// See [`.tuple_windows()`](../trait.Itertools.html#method.tuple_windows) for more
+/// information.
+pub struct TupleWindows<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect
+{
+    iter: I,
+    last: Option<T>,
+}
+
+/// Create a new tuple windows iterator.
+pub fn tuple_windows<I, T>(mut iter: I) -> TupleWindows<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect,
+          T::Item: Clone
+{
+    use std::iter::once;
+
+    let mut last = None;
+    if T::num_items() != 1 {
+        // put in a duplicate item in front of the tuple; this simplifies
+        // .next() function.
+        if let Some(item) = iter.next() {
+            let iter = once(item.clone()).chain(once(item)).chain(&mut iter);
+            last = T::collect_from_iter_no_buf(iter);
+        }
+    }
+
+    TupleWindows {
+        last: last,
+        iter: iter,
+    }
+}
+
+impl<I, T> Iterator for TupleWindows<I, T>
+    where I: Iterator<Item = T::Item>,
+          T: TupleCollect + Clone,
+          T::Item: Clone
+{
+    type Item = T;
+
+    fn next(&mut self) -> Option<T> {
+        if T::num_items() == 1 {
+            return T::collect_from_iter_no_buf(&mut self.iter)
+        }
+        if let Some(ref mut last) = self.last {
+            if let Some(new) = self.iter.next() {
+                last.left_shift_push(new);
+                return Some(last.clone());
+            }
+        }
+        None
+    }
+}
+
+pub trait TupleCollect: Sized {
+    type Item;
+    type Buffer: Default + AsRef<[Option<Self::Item>]> + AsMut<[Option<Self::Item>]>;
+
+    fn collect_from_iter<I>(iter: I, buf: &mut Self::Buffer) -> Option<Self>
+        where I: IntoIterator<Item = Self::Item>;
+
+    fn collect_from_iter_no_buf<I>(iter: I) -> Option<Self>
+        where I: IntoIterator<Item = Self::Item>;
+
+    fn num_items() -> usize;
+
+    fn left_shift_push(&mut self, item: Self::Item);
+}
+
+macro_rules! impl_tuple_collect {
+    () => ();
+    ($N:expr; $A:ident ; $($X:ident),* ; $($Y:ident),* ; $($Y_rev:ident),*) => (
+        impl<$A> TupleCollect for ($($X),*,) {
+            type Item = $A;
+            type Buffer = [Option<$A>; $N - 1];
+
+            #[allow(unused_assignments, unused_mut)]
+            fn collect_from_iter<I>(iter: I, buf: &mut Self::Buffer) -> Option<Self>
+                where I: IntoIterator<Item = $A>
+            {
+                let mut iter = iter.into_iter();
+                $(
+                    let mut $Y = None;
+                )*
+
+                loop {
+                    $(
+                        $Y = iter.next();
+                        if $Y.is_none() {
+                            break
+                        }
+                    )*
+                    return Some(($($Y.unwrap()),*,))
+                }
+
+                let mut i = 0;
+                let mut s = buf.as_mut();
+                $(
+                    if i < s.len() {
+                        s[i] = $Y;
+                        i += 1;
+                    }
+                )*
+                return None;
+            }
+
+            #[allow(unused_assignments)]
+            fn collect_from_iter_no_buf<I>(iter: I) -> Option<Self>
+                where I: IntoIterator<Item = $A>
+            {
+                let mut iter = iter.into_iter();
+                loop {
+                    $(
+                        let $Y = if let Some($Y) = iter.next() {
+                            $Y
+                        } else {
+                            break;
+                        };
+                    )*
+                    return Some(($($Y),*,))
+                }
+
+                return None;
+            }
+
+            fn num_items() -> usize {
+                $N
+            }
+
+            fn left_shift_push(&mut self, item: $A) {
+                use std::mem::replace;
+
+                let &mut ($(ref mut $Y),*,) = self;
+                let tmp = item;
+                $(
+                    let tmp = replace($Y_rev, tmp);
+                )*
+                drop(tmp);
+            }
+        }
+    )
+}
+
+impl_tuple_collect!(1; A; A; a; a);
+impl_tuple_collect!(2; A; A, A; a, b; b, a);
+impl_tuple_collect!(3; A; A, A, A; a, b, c; c, b, a);
+impl_tuple_collect!(4; A; A, A, A, A; a, b, c, d; d, c, b, a);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/with_position.rs
@@ -0,0 +1,89 @@
+use std::iter::{Fuse,Peekable};
+
+/// An iterator adaptor that wraps each element in an [`Position`](../enum.Position.html).
+///
+/// Iterator element type is `Position<I::Item>`.
+///
+/// See [`.with_position()`](../trait.Itertools.html#method.with_position) for more information.
+pub struct WithPosition<I>
+    where I: Iterator,
+{
+    handled_first: bool,
+    peekable: Peekable<Fuse<I>>,
+}
+
+/// Create a new `WithPosition` iterator.
+pub fn with_position<I>(iter: I) -> WithPosition<I>
+    where I: Iterator,
+{
+    WithPosition {
+        handled_first: false,
+        peekable: iter.fuse().peekable(),
+    }
+}
+
+/// A value yielded by `WithPosition`.
+/// Indicates the position of this element in the iterator results.
+///
+/// See [`.with_position()`](trait.Itertools.html#method.with_position) for more information.
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub enum Position<T> {
+    /// This is the first element.
+    First(T),
+    /// This is neither the first nor the last element.
+    Middle(T),
+    /// This is the last element.
+    Last(T),
+    /// This is the only element.
+    Only(T),
+}
+
+impl<T> Position<T> {
+    /// Return the inner value.
+    pub fn into_inner(self) -> T {
+        match self {
+            Position::First(x) |
+            Position::Middle(x) |
+            Position::Last(x) |
+            Position::Only(x) => x,
+        }
+    }
+}
+
+impl<I: Iterator> Iterator for WithPosition<I> {
+    type Item = Position<I::Item>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        match self.peekable.next() {
+            Some(item) => {
+                if !self.handled_first {
+                    // Haven't seen the first item yet, and there is one to give.
+                    self.handled_first = true;
+                    // Peek to see if this is also the last item,
+                    // in which case tag it as `Only`.
+                    match self.peekable.peek() {
+                        Some(_) => Some(Position::First(item)),
+                        None => Some(Position::Only(item)),
+                    }
+                } else {
+                    // Have seen the first item, and there's something left.
+                    // Peek to see if this is the last item.
+                    match self.peekable.peek() {
+                        Some(_) => Some(Position::Middle(item)),
+                        None => Some(Position::Last(item)),
+                    }
+                }
+            }
+            // Iterator is finished.
+            None => None,
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.peekable.size_hint()
+    }
+}
+
+impl<I> ExactSizeIterator for WithPosition<I>
+    where I: ExactSizeIterator,
+{ }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/zip_eq_impl.rs
@@ -0,0 +1,60 @@
+use super::size_hint;
+
+/// An iterator which iterates two other iterators simultaneously
+///
+/// See [`.zip_eq()`](../trait.Itertools.html#method.zip_eq) for more information.
+#[derive(Clone)]
+#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
+pub struct ZipEq<I, J> {
+    a: I,
+    b: J,
+}
+
+/// Iterate `i` and `j` in lock step.
+///
+/// **Panics** if the iterators are not of the same length.
+///
+/// `IntoIterator` enabled version of `i.zip_eq(j)`.
+///
+/// ```
+/// use itertools::zip_eq;
+///
+/// let data = [1, 2, 3, 4, 5];
+/// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) {
+///     /* loop body */
+/// }
+/// ```
+pub fn zip_eq<I, J>(i: I, j: J) -> ZipEq<I::IntoIter, J::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator
+{
+    ZipEq {
+        a: i.into_iter(),
+        b: j.into_iter(),
+    }
+}
+
+impl<I, J> Iterator for ZipEq<I, J>
+    where I: Iterator,
+          J: Iterator
+{
+    type Item = (I::Item, J::Item);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        match (self.a.next(), self.b.next()) {
+            (None, None) => None,
+            (Some(a), Some(b)) => Some((a, b)),
+            (None, Some(_)) | (Some(_), None) =>
+            panic!("itertools: .zip_eq() reached end of one iterator before the other")
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::min(self.a.size_hint(), self.b.size_hint())
+    }
+}
+
+impl<I, J> ExactSizeIterator for ZipEq<I, J>
+    where I: ExactSizeIterator,
+          J: ExactSizeIterator
+{}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/zip_longest.rs
@@ -0,0 +1,94 @@
+use std::cmp::Ordering::{Equal, Greater, Less};
+use super::size_hint;
+use std::iter::Fuse;
+use self::EitherOrBoth::{Right, Left, Both};
+
+// ZipLongest originally written by SimonSapin,
+// and dedicated to itertools https://github.com/rust-lang/rust/pull/19283
+
+/// An iterator which iterates two other iterators simultaneously
+///
+/// This iterator is *fused*.
+///
+/// See [`.zip_longest()`](../trait.Itertools.html#method.zip_longest) for more information.
+#[derive(Clone)]
+#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
+pub struct ZipLongest<T, U> {
+    a: Fuse<T>,
+    b: Fuse<U>,
+}
+
+/// Create a new `ZipLongest` iterator.
+pub fn zip_longest<T, U>(a: T, b: U) -> ZipLongest<T, U> 
+    where T: Iterator,
+          U: Iterator
+{
+    ZipLongest {
+        a: a.fuse(),
+        b: b.fuse(),
+    }
+}
+
+impl<T, U> Iterator for ZipLongest<T, U>
+    where T: Iterator,
+          U: Iterator
+{
+    type Item = EitherOrBoth<T::Item, U::Item>;
+
+    #[inline]
+    fn next(&mut self) -> Option<Self::Item> {
+        match (self.a.next(), self.b.next()) {
+            (None, None) => None,
+            (Some(a), None) => Some(Left(a)),
+            (None, Some(b)) => Some(Right(b)),
+            (Some(a), Some(b)) => Some(Both(a, b)),
+        }
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        size_hint::max(self.a.size_hint(), self.b.size_hint())
+    }
+}
+
+impl<T, U> DoubleEndedIterator for ZipLongest<T, U>
+    where T: DoubleEndedIterator + ExactSizeIterator,
+          U: DoubleEndedIterator + ExactSizeIterator
+{
+    #[inline]
+    fn next_back(&mut self) -> Option<Self::Item> {
+        match self.a.len().cmp(&self.b.len()) {
+            Equal => match (self.a.next_back(), self.b.next_back()) {
+                (None, None) => None,
+                (Some(a), Some(b)) => Some(Both(a, b)),
+                // These can only happen if .len() is inconsistent with .next_back()
+                (Some(a), None) => Some(Left(a)),
+                (None, Some(b)) => Some(Right(b)),
+            },
+            Greater => self.a.next_back().map(Left),
+            Less => self.b.next_back().map(Right),
+        }
+    }
+}
+
+impl<T, U> ExactSizeIterator for ZipLongest<T, U>
+    where T: ExactSizeIterator,
+          U: ExactSizeIterator
+{}
+
+
+/// A value yielded by `ZipLongest`.
+/// Contains one or two values, depending on which of the input iterators are exhausted.
+///
+/// See [`.zip_longest()`](trait.Itertools.html#method.zip_longest) for more information.
+#[derive(Clone, PartialEq, Eq, Debug)]
+pub enum EitherOrBoth<A, B> {
+    /// Neither input iterator is exhausted yet, yielding two values.
+    Both(A, B),
+    /// The parameter iterator of `.zip_longest()` is exhausted,
+    /// only yielding a value from the `self` iterator.
+    Left(A),
+    /// The `self` iterator of `.zip_longest()` is exhausted,
+    /// only yielding a value from the parameter iterator.
+    Right(B),
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/src/ziptuple.rs
@@ -0,0 +1,112 @@
+use super::size_hint;
+
+/// See [`multizip`](../fn.multizip.html) for more information.
+#[derive(Clone)]
+pub struct Zip<T> {
+    t: T,
+}
+
+impl<T> Zip<T> {
+    /// Deprecated: renamed to multizip
+    #[deprecated(note = "Renamed to multizip")]
+    pub fn new<U>(t: U) -> Zip<T>
+        where Zip<T>: From<U>,
+              Zip<T>: Iterator,
+    {
+        multizip(t)
+    }
+}
+
+/// An iterator that generalizes *.zip()* and allows running multiple iterators in lockstep.
+///
+/// The iterator `Zip<(I, J, ..., M)>` is formed from a tuple of iterators (or values that
+/// implement `IntoIterator`) and yields elements
+/// until any of the subiterators yields `None`.
+///
+/// The iterator element type is a tuple like like `(A, B, ..., E)` where `A` to `E` are the
+/// element types of the subiterator.
+///
+/// ```
+/// use itertools::multizip;
+///
+/// // Iterate over three sequences side-by-side
+/// let mut xs = [0, 0, 0];
+/// let ys = [69, 107, 101];
+///
+/// for (i, a, b) in multizip((0..100, &mut xs, &ys)) {
+///    *a = i ^ *b;
+/// }
+///
+/// assert_eq!(xs, [69, 106, 103]);
+/// ```
+pub fn multizip<T, U>(t: U) -> Zip<T>
+    where Zip<T>: From<U>,
+          Zip<T>: Iterator,
+{
+    Zip::from(t)
+}
+
+macro_rules! impl_zip_iter {
+    ($($B:ident),*) => (
+        #[allow(non_snake_case)]
+        impl<$($B: IntoIterator),*> From<($($B,)*)> for Zip<($($B::IntoIter,)*)> {
+            fn from(t: ($($B,)*)) -> Self {
+                let ($($B,)*) = t;
+                Zip { t: ($($B.into_iter(),)*) }
+            }
+        }
+
+        #[allow(non_snake_case)]
+        #[allow(unused_assignments)]
+        impl<$($B),*> Iterator for Zip<($($B,)*)>
+            where
+            $(
+                $B: Iterator,
+            )*
+        {
+            type Item = ($($B::Item,)*);
+
+            fn next(&mut self) -> Option<Self::Item>
+            {
+                let ($(ref mut $B,)*) = self.t;
+
+                // NOTE: Just like iter::Zip, we check the iterators
+                // for None in order. We may finish unevenly (some
+                // iterators gave n + 1 elements, some only n).
+                $(
+                    let $B = match $B.next() {
+                        None => return None,
+                        Some(elt) => elt
+                    };
+                )*
+                Some(($($B,)*))
+            }
+
+            fn size_hint(&self) -> (usize, Option<usize>)
+            {
+                let sh = (::std::usize::MAX, None);
+                let ($(ref $B,)*) = self.t;
+                $(
+                    let sh = size_hint::min($B.size_hint(), sh);
+                )*
+                sh
+            }
+        }
+
+        #[allow(non_snake_case)]
+        impl<$($B),*> ExactSizeIterator for Zip<($($B,)*)> where
+            $(
+                $B: ExactSizeIterator,
+            )*
+        { }
+    );
+}
+
+impl_zip_iter!(A);
+impl_zip_iter!(A, B);
+impl_zip_iter!(A, B, C);
+impl_zip_iter!(A, B, C, D);
+impl_zip_iter!(A, B, C, D, E);
+impl_zip_iter!(A, B, C, D, E, F);
+impl_zip_iter!(A, B, C, D, E, F, G);
+impl_zip_iter!(A, B, C, D, E, F, G, H);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/tests/peeking_take_while.rs
@@ -0,0 +1,53 @@
+
+extern crate itertools;
+
+use itertools::Itertools;
+use itertools::{put_back, put_back_n};
+
+#[test]
+fn peeking_take_while_peekable() {
+    let mut r = (0..10).peekable();
+    r.peeking_take_while(|x| *x <= 3).count();
+    assert_eq!(r.next(), Some(4));
+}
+
+#[test]
+fn peeking_take_while_put_back() {
+    let mut r = put_back(0..10);
+    r.peeking_take_while(|x| *x <= 3).count();
+    assert_eq!(r.next(), Some(4));
+    r.peeking_take_while(|_| true).count();
+    assert_eq!(r.next(), None);
+}
+
+#[test]
+fn peeking_take_while_put_back_n() {
+    let mut r = put_back_n(6..10);
+    for elt in (0..6).rev() {
+        r.put_back(elt);
+    }
+    r.peeking_take_while(|x| *x <= 3).count();
+    assert_eq!(r.next(), Some(4));
+    r.peeking_take_while(|_| true).count();
+    assert_eq!(r.next(), None);
+}
+
+#[test]
+fn peeking_take_while_slice_iter() {
+    let v = [1, 2, 3, 4, 5, 6];
+    let mut r = v.iter();
+    r.peeking_take_while(|x| **x <= 3).count();
+    assert_eq!(r.next(), Some(&4));
+    r.peeking_take_while(|_| true).count();
+    assert_eq!(r.next(), None);
+}
+
+#[test]
+fn peeking_take_while_slice_iter_rev() {
+    let v = [1, 2, 3, 4, 5, 6];
+    let mut r = v.iter().rev();
+    r.peeking_take_while(|x| **x >= 3).count();
+    assert_eq!(r.next(), Some(&2));
+    r.peeking_take_while(|_| true).count();
+    assert_eq!(r.next(), None);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/tests/quick.rs
@@ -0,0 +1,867 @@
+//! The purpose of these tests is to cover corner cases of iterators
+//! and adaptors.
+//!
+//! In particular we test the tedious size_hint and exact size correctness.
+
+#[macro_use] extern crate itertools;
+
+extern crate quickcheck;
+
+use std::default::Default;
+
+use quickcheck as qc;
+use std::ops::Range;
+use std::cmp::Ordering;
+use itertools::Itertools;
+use itertools::{
+    multizip,
+    EitherOrBoth,
+};
+use itertools::free::{
+    cloned,
+    enumerate,
+    multipeek,
+    put_back,
+    put_back_n,
+    rciter,
+    zip,
+    zip_eq,
+};
+
+use quickcheck::TestResult;
+
+/// Trait for size hint modifier types
+trait HintKind: Copy + Send + qc::Arbitrary {
+    fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>);
+}
+
+/// Exact size hint variant that leaves hints unchanged
+#[derive(Clone, Copy, Debug)]
+struct Exact {}
+
+impl HintKind for Exact {
+    fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>) {
+        org_hint
+    }
+}
+
+impl qc::Arbitrary for Exact {
+    fn arbitrary<G: qc::Gen>(_: &mut G) -> Self {
+        Exact {}
+    }
+}
+
+/// Inexact size hint variant to simulate imprecise (but valid) size hints
+///
+/// Will always decrease the lower bound and increase the upper bound
+/// of the size hint by set amounts.
+#[derive(Clone, Copy, Debug)]
+struct Inexact {
+    underestimate: usize,
+    overestimate: usize,
+}
+
+impl HintKind for Inexact {
+    fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>) {
+        let (org_lower, org_upper) = org_hint;
+        (org_lower.saturating_sub(self.underestimate),
+         org_upper.and_then(move |x| x.checked_add(self.overestimate)))
+    }
+}
+
+impl qc::Arbitrary for Inexact {
+    fn arbitrary<G: qc::Gen>(g: &mut G) -> Self {
+        let ue_value = usize::arbitrary(g);
+        let oe_value = usize::arbitrary(g);
+        // Compensate for quickcheck using extreme values too rarely
+        let ue_choices = &[0, ue_value, usize::max_value()];
+        let oe_choices = &[0, oe_value, usize::max_value()];
+        Inexact {
+            underestimate: *g.choose(ue_choices).unwrap(),
+            overestimate: *g.choose(oe_choices).unwrap(),
+        }
+    }
+
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        let underestimate_value = self.underestimate;
+        let overestimate_value = self.overestimate;
+        Box::new(
+            underestimate_value.shrink().flat_map(move |ue_value|
+                overestimate_value.shrink().map(move |oe_value|
+                    Inexact {
+                        underestimate: ue_value,
+                        overestimate: oe_value,
+                    }
+                )
+            )
+        )
+    }
+}
+
+/// Our base iterator that we can impl Arbitrary for
+///
+/// By default we'll return inexact bounds estimates for size_hint
+/// to make tests harder ro pass.
+///
+/// NOTE: Iter is tricky and is not fused, to help catch bugs.
+/// At the end it will return None once, then return Some(0),
+/// then return None again.
+#[derive(Clone, Debug)]
+struct Iter<T, SK: HintKind = Inexact> {
+    iterator: Range<T>,
+    // fuse/done flag
+    fuse_flag: i32,
+    hint_kind: SK,
+}
+
+impl<T, HK> Iter<T, HK> where HK: HintKind
+{
+    fn new(it: Range<T>, hint_kind: HK) -> Self {
+        Iter {
+            iterator: it,
+            fuse_flag: 0,
+            hint_kind: hint_kind
+        }
+    }
+}
+
+impl<T, HK> Iterator for Iter<T, HK>
+    where Range<T>: Iterator,
+          <Range<T> as Iterator>::Item: Default,
+          HK: HintKind,
+{
+    type Item = <Range<T> as Iterator>::Item;
+
+    fn next(&mut self) -> Option<Self::Item>
+    {
+        let elt = self.iterator.next();
+        if elt.is_none() {
+            self.fuse_flag += 1;
+            // check fuse flag
+            if self.fuse_flag == 2 {
+                return Some(Default::default())
+            }
+        }
+        elt
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>)
+    {
+        let org_hint = self.iterator.size_hint();
+        self.hint_kind.loosen_bounds(org_hint)
+    }
+}
+
+impl<T, HK> DoubleEndedIterator for Iter<T, HK>
+    where Range<T>: DoubleEndedIterator,
+          <Range<T> as Iterator>::Item: Default,
+          HK: HintKind
+{
+    fn next_back(&mut self) -> Option<Self::Item> { self.iterator.next_back() }
+}
+
+impl<T> ExactSizeIterator for Iter<T, Exact> where Range<T>: ExactSizeIterator,
+    <Range<T> as Iterator>::Item: Default,
+{ }
+
+impl<T, HK> qc::Arbitrary for Iter<T, HK>
+    where T: qc::Arbitrary,
+          HK: HintKind,
+{
+    fn arbitrary<G: qc::Gen>(g: &mut G) -> Self
+    {
+        Iter::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g))
+    }
+
+    fn shrink(&self) -> Box<Iterator<Item=Iter<T, HK>>>
+    {
+        let r = self.iterator.clone();
+        let hint_kind = self.hint_kind;
+        Box::new(
+            r.start.shrink().flat_map(move |a|
+                r.end.shrink().map(move |b|
+                    Iter::new(a.clone()..b, hint_kind)
+                )
+            )
+        )
+    }
+}
+
+fn correct_size_hint<I: Iterator>(mut it: I) -> bool {
+    // record size hint at each iteration
+    let initial_hint = it.size_hint();
+    let mut hints = Vec::with_capacity(initial_hint.0 + 1);
+    hints.push(initial_hint);
+    while let Some(_) = it.next() {
+        hints.push(it.size_hint())
+    }
+
+    let mut true_count = hints.len(); // start off +1 too much
+
+    // check all the size hints
+    for &(low, hi) in &hints {
+        true_count -= 1;
+        if low > true_count ||
+            (hi.is_some() && hi.unwrap() < true_count)
+        {
+            println!("True size: {:?}, size hint: {:?}", true_count, (low, hi));
+            //println!("All hints: {:?}", hints);
+            return false
+        }
+    }
+    true
+}
+
+fn exact_size<I: ExactSizeIterator>(mut it: I) -> bool {
+    // check every iteration
+    let (mut low, mut hi) = it.size_hint();
+    if Some(low) != hi { return false; }
+    while let Some(_) = it.next() {
+        let (xlow, xhi) = it.size_hint();
+        if low != xlow + 1 { return false; }
+        low = xlow;
+        hi = xhi;
+        if Some(low) != hi { return false; }
+    }
+    let (low, hi) = it.size_hint();
+    low == 0 && hi == Some(0)
+}
+
+// Exact size for this case, without ExactSizeIterator
+fn exact_size_for_this<I: Iterator>(mut it: I) -> bool {
+    // check every iteration
+    let (mut low, mut hi) = it.size_hint();
+    if Some(low) != hi { return false; }
+    while let Some(_) = it.next() {
+        let (xlow, xhi) = it.size_hint();
+        if low != xlow + 1 { return false; }
+        low = xlow;
+        hi = xhi;
+        if Some(low) != hi { return false; }
+    }
+    let (low, hi) = it.size_hint();
+    low == 0 && hi == Some(0)
+}
+
+/*
+ * NOTE: Range<i8> is broken!
+ * (all signed ranges are)
+#[quickcheck]
+fn size_range_i8(a: Iter<i8>) -> bool {
+    exact_size(a)
+}
+
+#[quickcheck]
+fn size_range_i16(a: Iter<i16>) -> bool {
+    exact_size(a)
+}
+
+#[quickcheck]
+fn size_range_u8(a: Iter<u8>) -> bool {
+    exact_size(a)
+}
+ */
+
+macro_rules! quickcheck {
+    // accept several property function definitions
+    // The property functions can use pattern matching and `mut` as usual
+    // in the function arguments, but the functions can not be generic.
+    {$($(#$attr:tt)* fn $fn_name:ident($($arg:tt)*) -> $ret:ty { $($code:tt)* })*} => (
+        $(
+            #[test]
+            $(#$attr)*
+            fn $fn_name() {
+                fn prop($($arg)*) -> $ret {
+                    $($code)*
+                }
+                ::quickcheck::quickcheck(quickcheck!(@fn prop [] $($arg)*));
+            }
+        )*
+    );
+    // parse argument list (with patterns allowed) into prop as fn(_, _) -> _
+    (@fn $f:ident [$($t:tt)*]) => {
+        $f as fn($($t),*) -> _
+    };
+    (@fn $f:ident [$($p:tt)*] : $($tail:tt)*) => {
+        quickcheck!(@fn $f [$($p)* _] $($tail)*)
+    };
+    (@fn $f:ident [$($p:tt)*] $t:tt $($tail:tt)*) => {
+        quickcheck!(@fn $f [$($p)*] $($tail)*)
+    };
+}
+
+quickcheck! {
+
+    fn size_product(a: Iter<u16>, b: Iter<u16>) -> bool {
+        correct_size_hint(a.cartesian_product(b))
+    }
+    fn size_product3(a: Iter<u16>, b: Iter<u16>, c: Iter<u16>) -> bool {
+        correct_size_hint(iproduct!(a, b, c))
+    }
+
+    fn correct_cartesian_product3(a: Iter<u16>, b: Iter<u16>, c: Iter<u16>,
+                                  take_manual: usize) -> ()
+    {
+        // test correctness of iproduct through regular iteration (take)
+        // and through fold.
+        let ac = a.clone();
+        let br = &b.clone();
+        let cr = &c.clone();
+        let answer: Vec<_> = ac.flat_map(move |ea| br.clone().flat_map(move |eb| cr.clone().map(move |ec| (ea, eb, ec)))).collect();
+        let mut product_iter = iproduct!(a, b, c);
+        let mut actual = Vec::new();
+
+        actual.extend((&mut product_iter).take(take_manual));
+        if actual.len() == take_manual {
+            product_iter.fold((), |(), elt| actual.push(elt));
+        }
+        assert_eq!(answer, actual);
+    }
+
+    fn size_step(a: Iter<i16, Exact>, s: usize) -> bool {
+        let mut s = s;
+        if s == 0 {
+            s += 1; // never zero
+        }
+        let filt = a.clone().dedup();
+        correct_size_hint(filt.step(s)) &&
+            exact_size(a.step(s))
+    }
+    fn equal_step(a: Iter<i16>, s: usize) -> bool {
+        let mut s = s;
+        if s == 0 {
+            s += 1; // never zero
+        }
+        let mut i = 0;
+        itertools::equal(a.clone().step(s), a.filter(|_| {
+            let keep = i % s == 0;
+            i += 1;
+            keep
+        }))
+    }
+    fn equal_step_vec(a: Vec<i16>, s: usize) -> bool {
+        let mut s = s;
+        if s == 0 {
+            s += 1; // never zero
+        }
+        let mut i = 0;
+        itertools::equal(a.iter().step(s), a.iter().filter(|_| {
+            let keep = i % s == 0;
+            i += 1;
+            keep
+        }))
+    }
+
+    fn size_multipeek(a: Iter<u16, Exact>, s: u8) -> bool {
+        let mut it = multipeek(a);
+        // peek a few times
+        for _ in 0..s {
+            it.peek();
+        }
+        exact_size(it)
+    }
+
+    fn equal_merge(a: Vec<i16>, b: Vec<i16>) -> bool {
+        let mut sa = a.clone();
+        let mut sb = b.clone();
+        sa.sort();
+        sb.sort();
+        let mut merged = sa.clone();
+        merged.extend(sb.iter().cloned());
+        merged.sort();
+        itertools::equal(&merged, sa.iter().merge(&sb))
+    }
+    fn size_merge(a: Iter<u16>, b: Iter<u16>) -> bool {
+        correct_size_hint(a.merge(b))
+    }
+    fn size_zip(a: Iter<i16, Exact>, b: Iter<i16, Exact>, c: Iter<i16, Exact>) -> bool {
+        let filt = a.clone().dedup();
+        correct_size_hint(multizip((filt, b.clone(), c.clone()))) &&
+            exact_size(multizip((a, b, c)))
+    }
+    fn size_zip_rc(a: Iter<i16>, b: Iter<i16>) -> bool {
+        let rc = rciter(a.clone());
+        correct_size_hint(multizip((&rc, &rc, b)))
+    }
+
+    fn equal_kmerge(a: Vec<i16>, b: Vec<i16>, c: Vec<i16>) -> bool {
+        use itertools::free::kmerge;
+        let mut sa = a.clone();
+        let mut sb = b.clone();
+        let mut sc = c.clone();
+        sa.sort();
+        sb.sort();
+        sc.sort();
+        let mut merged = sa.clone();
+        merged.extend(sb.iter().cloned());
+        merged.extend(sc.iter().cloned());
+        merged.sort();
+        itertools::equal(merged.into_iter(), kmerge(vec![sa, sb, sc]))
+    }
+
+    // Any number of input iterators
+    fn equal_kmerge_2(mut inputs: Vec<Vec<i16>>) -> bool {
+        use itertools::free::kmerge;
+        // sort the inputs
+        for input in &mut inputs {
+            input.sort();
+        }
+        let mut merged = inputs.concat();
+        merged.sort();
+        itertools::equal(merged.into_iter(), kmerge(inputs))
+    }
+
+    // Any number of input iterators
+    fn equal_kmerge_by_ge(mut inputs: Vec<Vec<i16>>) -> bool {
+        // sort the inputs
+        for input in &mut inputs {
+            input.sort();
+            input.reverse();
+        }
+        let mut merged = inputs.concat();
+        merged.sort();
+        merged.reverse();
+        itertools::equal(merged.into_iter(),
+                         inputs.into_iter().kmerge_by(|x, y| x >= y))
+    }
+
+    // Any number of input iterators
+    fn equal_kmerge_by_lt(mut inputs: Vec<Vec<i16>>) -> bool {
+        // sort the inputs
+        for input in &mut inputs {
+            input.sort();
+        }
+        let mut merged = inputs.concat();
+        merged.sort();
+        itertools::equal(merged.into_iter(),
+                         inputs.into_iter().kmerge_by(|x, y| x < y))
+    }
+
+    // Any number of input iterators
+    fn equal_kmerge_by_le(mut inputs: Vec<Vec<i16>>) -> bool {
+        // sort the inputs
+        for input in &mut inputs {
+            input.sort();
+        }
+        let mut merged = inputs.concat();
+        merged.sort();
+        itertools::equal(merged.into_iter(),
+                         inputs.into_iter().kmerge_by(|x, y| x <= y))
+    }
+    fn size_kmerge(a: Iter<i16>, b: Iter<i16>, c: Iter<i16>) -> bool {
+        use itertools::free::kmerge;
+        correct_size_hint(kmerge(vec![a, b, c]))
+    }
+    fn equal_zip_eq(a: Vec<i32>, b: Vec<i32>) -> bool {
+        let len = std::cmp::min(a.len(), b.len());
+        let a = &a[..len];
+        let b = &b[..len];
+        itertools::equal(zip_eq(a, b), zip(a, b))
+    }
+    fn size_zip_longest(a: Iter<i16, Exact>, b: Iter<i16, Exact>) -> bool {
+        let filt = a.clone().dedup();
+        let filt2 = b.clone().dedup();
+        correct_size_hint(filt.zip_longest(b.clone())) &&
+        correct_size_hint(a.clone().zip_longest(filt2)) &&
+            exact_size(a.zip_longest(b))
+    }
+    fn size_2_zip_longest(a: Iter<i16>, b: Iter<i16>) -> bool {
+        let it = a.clone().zip_longest(b.clone());
+        let jt = a.clone().zip_longest(b.clone());
+        itertools::equal(a.clone(),
+                         it.filter_map(|elt| match elt {
+                             EitherOrBoth::Both(x, _) => Some(x),
+                             EitherOrBoth::Left(x) => Some(x),
+                             _ => None,
+                         }
+                         ))
+            &&
+        itertools::equal(b.clone(),
+                         jt.filter_map(|elt| match elt {
+                             EitherOrBoth::Both(_, y) => Some(y),
+                             EitherOrBoth::Right(y) => Some(y),
+                             _ => None,
+                         }
+                         ))
+    }
+    fn size_interleave(a: Iter<i16>, b: Iter<i16>) -> bool {
+        correct_size_hint(a.interleave(b))
+    }
+    fn exact_interleave(a: Iter<i16, Exact>, b: Iter<i16, Exact>) -> bool {
+        exact_size_for_this(a.interleave(b))
+    }
+    fn size_interleave_shortest(a: Iter<i16>, b: Iter<i16>) -> bool {
+        correct_size_hint(a.interleave_shortest(b))
+    }
+    fn exact_interleave_shortest(a: Vec<()>, b: Vec<()>) -> bool {
+        exact_size_for_this(a.iter().interleave_shortest(&b))
+    }
+    fn size_intersperse(a: Iter<i16>, x: i16) -> bool {
+        correct_size_hint(a.intersperse(x))
+    }
+    fn equal_intersperse(a: Vec<i32>, x: i32) -> bool {
+        let mut inter = false;
+        let mut i = 0;
+        for elt in a.iter().cloned().intersperse(x) {
+            if inter {
+                if elt != x { return false }
+            } else {
+                if elt != a[i] { return false }
+                i += 1;
+            }
+            inter = !inter;
+        }
+        true
+    }
+
+    fn equal_flatten(a: Vec<Option<i32>>) -> bool {
+        itertools::equal(a.iter().flatten(),
+                         a.iter().filter_map(|x| x.as_ref()))
+    }
+
+    fn equal_flatten_vec(a: Vec<Vec<u8>>) -> bool {
+        itertools::equal(a.iter().flatten(),
+                         a.iter().flat_map(|x| x))
+    }
+
+    fn equal_combinations_2(a: Vec<u8>) -> bool {
+        let mut v = Vec::new();
+        for (i, &x) in enumerate(&a) {
+            for &y in &a[i + 1..] {
+                v.push((x, y));
+            }
+        }
+        itertools::equal(cloned(&a).tuple_combinations::<(_, _)>(), cloned(&v))
+    }
+}
+
+quickcheck! {
+    fn equal_dedup(a: Vec<i32>) -> bool {
+        let mut b = a.clone();
+        b.dedup();
+        itertools::equal(&b, a.iter().dedup())
+    }
+}
+
+quickcheck! {
+    fn size_dedup(a: Vec<i32>) -> bool {
+        correct_size_hint(a.iter().dedup())
+    }
+}
+
+quickcheck! {
+    fn exact_repeatn((n, x): (usize, i32)) -> bool {
+        let it = itertools::repeat_n(x, n);
+        exact_size(it)
+    }
+}
+
+quickcheck! {
+    fn size_put_back(a: Vec<u8>, x: Option<u8>) -> bool {
+        let mut it = put_back(a.into_iter());
+        match x {
+            Some(t) => it.put_back(t),
+            None => {}
+        }
+        correct_size_hint(it)
+    }
+}
+
+quickcheck! {
+    fn size_put_backn(a: Vec<u8>, b: Vec<u8>) -> bool {
+        let mut it = put_back_n(a.into_iter());
+        for elt in b {
+            it.put_back(elt)
+        }
+        correct_size_hint(it)
+    }
+}
+
+quickcheck! {
+    fn size_tee(a: Vec<u8>) -> bool {
+        let (mut t1, mut t2) = a.iter().tee();
+        t1.next();
+        t1.next();
+        t2.next();
+        exact_size(t1) && exact_size(t2)
+    }
+}
+
+quickcheck! {
+    fn size_tee_2(a: Vec<u8>) -> bool {
+        let (mut t1, mut t2) = a.iter().dedup().tee();
+        t1.next();
+        t1.next();
+        t2.next();
+        correct_size_hint(t1) && correct_size_hint(t2)
+    }
+}
+
+quickcheck! {
+    fn size_take_while_ref(a: Vec<u8>, stop: u8) -> bool {
+        correct_size_hint(a.iter().take_while_ref(|x| **x != stop))
+    }
+}
+
+quickcheck! {
+    fn equal_partition(a: Vec<i32>) -> bool {
+        let mut a = a;
+        let mut ap = a.clone();
+        let split_index = itertools::partition(&mut ap, |x| *x >= 0);
+        let parted = (0..split_index).all(|i| ap[i] >= 0) &&
+            (split_index..a.len()).all(|i| ap[i] < 0);
+
+        a.sort();
+        ap.sort();
+        parted && (a == ap)
+    }
+}
+
+quickcheck! {
+    fn size_combinations(it: Iter<i16>) -> bool {
+        correct_size_hint(it.tuple_combinations::<(_, _)>())
+    }
+}
+
+quickcheck! {
+    fn equal_combinations(it: Iter<i16>) -> bool {
+        let values = it.clone().collect_vec();
+        let mut cmb = it.tuple_combinations();
+        for i in 0..values.len() {
+            for j in i+1..values.len() {
+                let pair = (values[i], values[j]);
+                if pair != cmb.next().unwrap() {
+                    return false;
+                }
+            }
+        }
+        cmb.next() == None
+    }
+}
+
+quickcheck! {
+    fn size_pad_tail(it: Iter<i8>, pad: u8) -> bool {
+        correct_size_hint(it.clone().pad_using(pad as usize, |_| 0)) &&
+            correct_size_hint(it.dropping(1).rev().pad_using(pad as usize, |_| 0))
+    }
+}
+
+quickcheck! {
+    fn size_pad_tail2(it: Iter<i8, Exact>, pad: u8) -> bool {
+        exact_size(it.pad_using(pad as usize, |_| 0))
+    }
+}
+
+quickcheck! {
+    fn size_unique(it: Iter<i8>) -> bool {
+        correct_size_hint(it.unique())
+    }
+}
+
+quickcheck! {
+    fn fuzz_group_by_lazy_1(it: Iter<u8>) -> bool {
+        let jt = it.clone();
+        let groups = it.group_by(|k| *k);
+        let res = itertools::equal(jt, groups.into_iter().flat_map(|(_, x)| x));
+        res
+    }
+}
+
+quickcheck! {
+    fn fuzz_group_by_lazy_2(data: Vec<u8>) -> bool {
+        let groups = data.iter().group_by(|k| *k / 10);
+        let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x));
+        res
+    }
+}
+
+quickcheck! {
+    fn fuzz_group_by_lazy_3(data: Vec<u8>) -> bool {
+        let grouper = data.iter().group_by(|k| *k / 10);
+        let groups = grouper.into_iter().collect_vec();
+        let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x));
+        res
+    }
+}
+
+quickcheck! {
+    fn fuzz_group_by_lazy_duo(data: Vec<u8>, order: Vec<(bool, bool)>) -> bool {
+        let grouper = data.iter().group_by(|k| *k / 3);
+        let mut groups1 = grouper.into_iter();
+        let mut groups2 = grouper.into_iter();
+        let mut elts = Vec::<&u8>::new();
+        let mut old_groups = Vec::new();
+
+        let tup1 = |(_, b)| b;
+        for &(ord, consume_now) in &order {
+            let iter = &mut [&mut groups1, &mut groups2][ord as usize];
+            match iter.next() {
+                Some((_, gr)) => if consume_now {
+                    for og in old_groups.drain(..) {
+                        elts.extend(og);
+                    }
+                    elts.extend(gr);
+                } else {
+                    old_groups.push(gr);
+                },
+                None => break,
+            }
+        }
+        for og in old_groups.drain(..) {
+            elts.extend(og);
+        }
+        for gr in groups1.map(&tup1) { elts.extend(gr); }
+        for gr in groups2.map(&tup1) { elts.extend(gr); }
+        itertools::assert_equal(&data, elts);
+        true
+    }
+}
+
+quickcheck! {
+    fn equal_chunks_lazy(a: Vec<u8>, size: u8) -> bool {
+        let mut size = size;
+        if size == 0 {
+            size += 1;
+        }
+        let chunks = a.iter().chunks(size as usize);
+        let it = a.chunks(size as usize);
+        for (a, b) in chunks.into_iter().zip(it) {
+            if !itertools::equal(a, b) {
+                return false;
+            }
+        }
+        true
+    }
+}
+
+quickcheck! {
+    fn equal_tuple_windows_1(a: Vec<u8>) -> bool {
+        let x = a.windows(1).map(|s| (&s[0], ));
+        let y = a.iter().tuple_windows::<(_,)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuple_windows_2(a: Vec<u8>) -> bool {
+        let x = a.windows(2).map(|s| (&s[0], &s[1]));
+        let y = a.iter().tuple_windows::<(_, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuple_windows_3(a: Vec<u8>) -> bool {
+        let x = a.windows(3).map(|s| (&s[0], &s[1], &s[2]));
+        let y = a.iter().tuple_windows::<(_, _, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuple_windows_4(a: Vec<u8>) -> bool {
+        let x = a.windows(4).map(|s| (&s[0], &s[1], &s[2], &s[3]));
+        let y = a.iter().tuple_windows::<(_, _, _, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuples_1(a: Vec<u8>) -> bool {
+        let x = a.chunks(1).map(|s| (&s[0], ));
+        let y = a.iter().tuples::<(_,)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuples_2(a: Vec<u8>) -> bool {
+        let x = a.chunks(2).filter(|s| s.len() == 2).map(|s| (&s[0], &s[1]));
+        let y = a.iter().tuples::<(_, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuples_3(a: Vec<u8>) -> bool {
+        let x = a.chunks(3).filter(|s| s.len() == 3).map(|s| (&s[0], &s[1], &s[2]));
+        let y = a.iter().tuples::<(_, _, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn equal_tuples_4(a: Vec<u8>) -> bool {
+        let x = a.chunks(4).filter(|s| s.len() == 4).map(|s| (&s[0], &s[1], &s[2], &s[3]));
+        let y = a.iter().tuples::<(_, _, _, _)>();
+        itertools::equal(x, y)
+    }
+
+    fn exact_tuple_buffer(a: Vec<u8>) -> bool {
+        let mut iter = a.iter().tuples::<(_, _, _, _)>();
+        (&mut iter).last();
+        let buffer = iter.into_buffer();
+        assert_eq!(buffer.len(), a.len() % 4);
+        exact_size(buffer)
+    }
+}
+
+// with_position
+quickcheck! {
+    fn with_position_exact_size_1(a: Vec<u8>) -> bool {
+        exact_size_for_this(a.iter().with_position())
+    }
+    fn with_position_exact_size_2(a: Iter<u8, Exact>) -> bool {
+        exact_size_for_this(a.with_position())
+    }
+}
+
+/// A peculiar type: Equality compares both tuple items, but ordering only the
+/// first item.  This is so we can check the stability property easily.
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Val(u32, u32);
+
+impl PartialOrd<Val> for Val {
+    fn partial_cmp(&self, other: &Val) -> Option<Ordering> {
+        self.0.partial_cmp(&other.0)
+    }
+}
+
+impl Ord for Val {
+    fn cmp(&self, other: &Val) -> Ordering {
+        self.0.cmp(&other.0)
+    }
+}
+
+impl qc::Arbitrary for Val {
+    fn arbitrary<G: qc::Gen>(g: &mut G) -> Self {
+        let (x, y) = <(u32, u32)>::arbitrary(g);
+        Val(x, y)
+    }
+    fn shrink(&self) -> Box<Iterator<Item = Self>> {
+        Box::new((self.0, self.1).shrink().map(|(x, y)| Val(x, y)))
+    }
+}
+
+quickcheck! {
+    fn minmax(a: Vec<Val>) -> bool {
+        use itertools::MinMaxResult;
+
+
+        let minmax = a.iter().minmax();
+        let expected = match a.len() {
+            0 => MinMaxResult::NoElements,
+            1 => MinMaxResult::OneElement(&a[0]),
+            _ => MinMaxResult::MinMax(a.iter().min().unwrap(),
+                                      a.iter().max().unwrap()),
+        };
+        minmax == expected
+    }
+}
+
+quickcheck! {
+    fn minmax_f64(a: Vec<f64>) -> TestResult {
+        use itertools::MinMaxResult;
+
+        if a.iter().any(|x| x.is_nan()) {
+            return TestResult::discard();
+        }
+
+        let min = cloned(&a).fold1(f64::min);
+        let max = cloned(&a).fold1(f64::max);
+
+        let minmax = cloned(&a).minmax();
+        let expected = match a.len() {
+            0 => MinMaxResult::NoElements,
+            1 => MinMaxResult::OneElement(min.unwrap()),
+            _ => MinMaxResult::MinMax(min.unwrap(), max.unwrap()),
+        };
+        TestResult::from_bool(minmax == expected)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/tests/tests.rs
@@ -0,0 +1,904 @@
+//! Licensed under the Apache License, Version 2.0
+//! http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
+//! http://opensource.org/licenses/MIT, at your
+//! option. This file may not be copied, modified, or distributed
+//! except according to those terms.
+
+#[macro_use] extern crate itertools as it;
+extern crate permutohedron;
+
+use it::Itertools;
+use it::interleave;
+use it::multizip;
+use it::multipeek;
+use it::FoldWhile;
+use it::free::rciter;
+use it::free::put_back;
+use it::free::put_back_n;
+use it::cloned;
+
+#[test]
+fn product2() {
+    let s = "αβ";
+
+    let mut prod = iproduct!(s.chars(), 0..2);
+    assert!(prod.next() == Some(('α', 0)));
+    assert!(prod.next() == Some(('α', 1)));
+    assert!(prod.next() == Some(('β', 0)));
+    assert!(prod.next() == Some(('β', 1)));
+    assert!(prod.next() == None);
+}
+
+#[test]
+fn product3() {
+    let prod = iproduct!(0..3, 0..2, 0..2);
+    assert_eq!(prod.size_hint(), (12, Some(12)));
+    let v = prod.collect_vec();
+    for i in 0..3 {
+        for j in 0..2 {
+            for k in 0..2 {
+                assert!((i, j, k) == v[(i * 2 * 2 + j * 2 + k) as usize]);
+            }
+        }
+    }
+    for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) {
+        /* test compiles */
+    }
+}
+
+#[test]
+fn product_temporary() {
+    for (_x, _y, _z) in iproduct!(
+        [0, 1, 2].iter().cloned(),
+        [0, 1, 2].iter().cloned(),
+        [0, 1, 2].iter().cloned())
+    {
+        // ok
+    }
+}
+
+
+#[test]
+fn izip_macro() {
+    let mut zip = izip!(0..3, 0..2, 0..2i8);
+    for i in 0..2 {
+        assert!((i as usize, i, i as i8) == zip.next().unwrap());
+    }
+    assert!(zip.next().is_none());
+
+    let xs: [isize; 0] = [];
+    let mut zip = izip!(0..3, 0..2, 0..2i8, &xs);
+    assert!(zip.next().is_none());
+}
+
+#[test]
+fn izip3() {
+    let mut zip = multizip((0..3, 0..2, 0..2i8));
+    for i in 0..2 {
+        assert!((i as usize, i, i as i8) == zip.next().unwrap());
+    }
+    assert!(zip.next().is_none());
+
+    let xs: [isize; 0] = [];
+    let mut zip = multizip((0..3, 0..2, 0..2i8, xs.iter()));
+    assert!(zip.next().is_none());
+
+    for (_, _, _, _, _) in multizip((0..3, 0..2, xs.iter(), &xs, xs.to_vec())) {
+        /* test compiles */
+    }
+}
+
+#[test]
+fn write_to() {
+    let xs = [7, 9, 8];
+    let mut ys = [0; 5];
+    let cnt = ys.iter_mut().set_from(xs.iter().map(|x| *x));
+    assert!(cnt == xs.len());
+    assert!(ys == [7, 9, 8, 0, 0]);
+
+    let cnt = ys.iter_mut().set_from(0..10);
+    assert!(cnt == ys.len());
+    assert!(ys == [0, 1, 2, 3, 4]);
+}
+
+#[test]
+fn test_interleave() {
+    let xs: [u8; 0]  = [];
+    let ys = [7u8, 9, 8, 10];
+    let zs = [2u8, 77];
+    let it = interleave(xs.iter(), ys.iter());
+    it::assert_equal(it, ys.iter());
+
+    let rs = [7u8, 2, 9, 77, 8, 10];
+    let it = interleave(ys.iter(), zs.iter());
+    it::assert_equal(it, rs.iter());
+}
+
+#[test]
+fn interleave_shortest() {
+    let v0: Vec<i32> = vec![0, 2, 4];
+    let v1: Vec<i32> = vec![1, 3, 5, 7];
+    let it = v0.into_iter().interleave_shortest(v1.into_iter());
+    assert_eq!(it.size_hint(), (6, Some(6)));
+    assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]);
+
+    let v0: Vec<i32> = vec![0, 2, 4, 6, 8];
+    let v1: Vec<i32> = vec![1, 3, 5];
+    let it = v0.into_iter().interleave_shortest(v1.into_iter());
+    assert_eq!(it.size_hint(), (7, Some(7)));
+    assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]);
+
+    let i0 = ::std::iter::repeat(0);
+    let v1: Vec<_> = vec![1, 3, 5];
+    let it = i0.interleave_shortest(v1.into_iter());
+    assert_eq!(it.size_hint(), (7, Some(7)));
+
+    let v0: Vec<_> = vec![0, 2, 4];
+    let i1 = ::std::iter::repeat(1);
+    let it = v0.into_iter().interleave_shortest(i1);
+    assert_eq!(it.size_hint(), (6, Some(6)));
+}
+
+#[test]
+fn foreach() {
+    let xs = [1i32, 2, 3];
+    let mut sum = 0;
+    xs.iter().foreach(|elt| sum += *elt);
+    assert!(sum == 6);
+}
+
+#[test]
+fn dropping() {
+    let xs = [1, 2, 3];
+    let mut it = xs.iter().dropping(2);
+    assert_eq!(it.next(), Some(&3));
+    assert!(it.next().is_none());
+    let mut it = xs.iter().dropping(5);
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn intersperse() {
+    let xs = ["a", "", "b", "c"];
+    let v: Vec<&str> = xs.iter().map(|x| x.clone()).intersperse(", ").collect();
+    let text: String = v.concat();
+    assert_eq!(text, "a, , b, c".to_string());
+
+    let ys = [0, 1, 2, 3];
+    let mut it = ys[..0].iter().map(|x| *x).intersperse(1);
+    assert!(it.next() == None);
+}
+
+#[test]
+fn dedup() {
+    let xs = [0, 1, 1, 1, 2, 1, 3, 3];
+    let ys = [0, 1, 2, 1, 3];
+    it::assert_equal(ys.iter(), xs.iter().dedup());
+    let xs = [0, 0, 0, 0, 0];
+    let ys = [0];
+    it::assert_equal(ys.iter(), xs.iter().dedup());
+
+    let xs = [0, 1, 1, 1, 2, 1, 3, 3];
+    let ys = [0, 1, 2, 1, 3];
+    let mut xs_d = Vec::new();
+    xs.iter().dedup().fold((), |(), &elt| xs_d.push(elt));
+    assert_eq!(&xs_d, &ys);
+}
+
+#[test]
+fn all_equal() {
+    assert!(!"AABBCCC".chars().all_equal());
+    assert!("AAAAAAA".chars().all_equal());
+    for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) {
+        assert!(sub.all_equal());
+    }
+}
+
+#[test]
+fn unique_by() {
+    let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"];
+    let ys = ["aaa", "bbbbb", "ccc"];
+    it::assert_equal(ys.iter(), xs.iter().unique_by(|x| x[..2].to_string()));
+}
+
+#[test]
+fn unique() {
+    let xs = [0, 1, 2, 3, 2, 1, 3];
+    let ys = [0, 1, 2, 3];
+    it::assert_equal(ys.iter(), xs.iter().unique());
+    let xs = [0, 1];
+    let ys = [0, 1];
+    it::assert_equal(ys.iter(), xs.iter().unique());
+}
+
+#[test]
+fn batching() {
+    let xs = [0, 1, 2, 1, 3];
+    let ys = [(0, 1), (2, 1)];
+
+    // An iterator that gathers elements up in pairs
+    let pit = xs.iter().cloned().batching(|it| {
+               match it.next() {
+                   None => None,
+                   Some(x) => match it.next() {
+                       None => None,
+                       Some(y) => Some((x, y)),
+                   }
+               }
+           });
+    it::assert_equal(pit, ys.iter().cloned());
+}
+
+#[test]
+fn test_put_back() {
+    let xs = [0, 1, 1, 1, 2, 1, 3, 3];
+    let mut pb = put_back(xs.iter().cloned());
+    pb.next();
+    pb.put_back(1);
+    pb.put_back(0);
+    it::assert_equal(pb, xs.iter().cloned());
+}
+
+#[test]
+fn test_put_back_n() {
+    let xs = [0, 1, 1, 1, 2, 1, 3, 3];
+    let mut pb = put_back_n(xs.iter().cloned());
+    pb.next();
+    pb.next();
+    pb.put_back(1);
+    pb.put_back(0);
+    it::assert_equal(pb, xs.iter().cloned());
+}
+
+#[test]
+fn tee() {
+    let xs  = [0, 1, 2, 3];
+    let (mut t1, mut t2) = xs.iter().cloned().tee();
+    assert_eq!(t1.next(), Some(0));
+    assert_eq!(t2.next(), Some(0));
+    assert_eq!(t1.next(), Some(1));
+    assert_eq!(t1.next(), Some(2));
+    assert_eq!(t1.next(), Some(3));
+    assert_eq!(t1.next(), None);
+    assert_eq!(t2.next(), Some(1));
+    assert_eq!(t2.next(), Some(2));
+    assert_eq!(t1.next(), None);
+    assert_eq!(t2.next(), Some(3));
+    assert_eq!(t2.next(), None);
+    assert_eq!(t1.next(), None);
+    assert_eq!(t2.next(), None);
+
+    let (t1, t2) = xs.iter().cloned().tee();
+    it::assert_equal(t1, xs.iter().cloned());
+    it::assert_equal(t2, xs.iter().cloned());
+
+    let (t1, t2) = xs.iter().cloned().tee();
+    it::assert_equal(t1.zip(t2), xs.iter().cloned().zip(xs.iter().cloned()));
+}
+
+
+#[test]
+fn test_rciter() {
+    let xs = [0, 1, 1, 1, 2, 1, 3, 5, 6];
+
+    let mut r1 = rciter(xs.iter().cloned());
+    let mut r2 = r1.clone();
+    assert_eq!(r1.next(), Some(0));
+    assert_eq!(r2.next(), Some(1));
+    let mut z = r1.zip(r2);
+    assert_eq!(z.next(), Some((1, 1)));
+    assert_eq!(z.next(), Some((2, 1)));
+    assert_eq!(z.next(), Some((3, 5)));
+    assert_eq!(z.next(), None);
+
+    // test intoiterator
+    let r1 = rciter(0..5);
+    let mut z = izip!(&r1, r1);
+    assert_eq!(z.next(), Some((0, 1)));
+}
+
+#[test]
+fn step() {
+    it::assert_equal((0..10).step(1), (0..10));
+    it::assert_equal((0..10).step(2), (0..10).filter(|x: &i32| *x % 2 == 0));
+    it::assert_equal((0..10).step(10), 0..1);
+}
+
+#[test]
+fn trait_pointers() {
+    struct ByRef<'r, I: ?Sized>(&'r mut I) where I: 'r;
+
+    impl<'r, X, I: ?Sized> Iterator for ByRef<'r, I> where
+        I: 'r + Iterator<Item=X>
+    {
+        type Item = X;
+        fn next(&mut self) -> Option<X>
+        {
+            self.0.next()
+        }
+    }
+
+    let mut it = Box::new(0..10) as Box<Iterator<Item=i32>>;
+    assert_eq!(it.next(), Some(0));
+
+    {
+        /* make sure foreach works on non-Sized */
+        let jt: &mut Iterator<Item = i32> = &mut *it;
+        assert_eq!(jt.next(), Some(1));
+
+        {
+            let mut r = ByRef(jt);
+            assert_eq!(r.next(), Some(2));
+        }
+
+        assert_eq!(jt.find_position(|x| *x == 4), Some((1, 4)));
+        jt.foreach(|_| ());
+    }
+}
+
+#[test]
+fn merge() {
+    it::assert_equal((0..10).step(2).merge((1..10).step(2)), (0..10));
+}
+
+#[test]
+fn merge_by() {
+    let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")];
+    let even = vec![(2, "foo"), (4, "bar"), (6, "baz")];
+    let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")];
+    let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0);
+    it::assert_equal(results, expected.iter());
+}
+
+#[test]
+fn merge_by_btree() {
+    use std::collections::BTreeMap;
+    let mut bt1 = BTreeMap::new();
+    bt1.insert("hello", 1);
+    bt1.insert("world", 3);
+    let mut bt2 = BTreeMap::new();
+    bt2.insert("foo", 2);
+    bt2.insert("bar", 4);
+    let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 );
+    let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)];
+    it::assert_equal(results, expected.into_iter());
+}
+
+#[test]
+fn kmerge() {
+    let its = (0..4).map(|s| (s..10).step(4));
+
+    it::assert_equal(its.kmerge(), (0..10));
+}
+
+#[test]
+fn kmerge_2() {
+    let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step(4));
+    
+    it::assert_equal(its.kmerge(), (0..10));
+}
+
+#[test]
+fn kmerge_empty() {
+    let its = (0..4).map(|_| (0..0));
+    assert_eq!(its.kmerge().next(), None);
+}
+
+#[test]
+fn kmerge_size_hint() {
+    let its = (0..5).map(|_| (0..10));
+    assert_eq!(its.kmerge().size_hint(), (50, Some(50)));
+}
+
+#[test]
+fn kmerge_empty_size_hint() {
+    let its = (0..5).map(|_| (0..0));
+    assert_eq!(its.kmerge().size_hint(), (0, Some(0)));
+}
+
+#[test]
+fn join() {
+    let many = [1, 2, 3];
+    let one  = [1];
+    let none: Vec<i32> = vec![];
+
+    assert_eq!(many.iter().join(", "), "1, 2, 3");
+    assert_eq!( one.iter().join(", "), "1");
+    assert_eq!(none.iter().join(", "), "");
+}
+
+#[test]
+fn sorted_by() {
+    let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| {
+        a.cmp(&b)
+    });
+    assert_eq!(sc, vec![1, 2, 3, 4]);
+
+    let v = (0..5).sorted_by(|&a, &b| a.cmp(&b).reverse());
+    assert_eq!(v, vec![4, 3, 2, 1, 0]);
+}
+
+#[test]
+fn test_multipeek() {
+    let nums = vec![1u8,2,3,4,5];
+
+    let mp = multipeek(nums.iter().map(|&x| x));
+    assert_eq!(nums, mp.collect::<Vec<_>>());
+
+    let mut mp = multipeek(nums.iter().map(|&x| x));
+    assert_eq!(mp.peek(), Some(&1));
+    assert_eq!(mp.next(), Some(1));
+    assert_eq!(mp.peek(), Some(&2));
+    assert_eq!(mp.peek(), Some(&3));
+    assert_eq!(mp.next(), Some(2));
+    assert_eq!(mp.peek(), Some(&3));
+    assert_eq!(mp.peek(), Some(&4));
+    assert_eq!(mp.peek(), Some(&5));
+    assert_eq!(mp.peek(), None);
+    assert_eq!(mp.next(), Some(3));
+    assert_eq!(mp.next(), Some(4));
+    assert_eq!(mp.next(), Some(5));
+    assert_eq!(mp.next(), None);
+    assert_eq!(mp.peek(), None);
+
+}
+
+#[test]
+fn test_multipeek_reset() {
+    let data = [1, 2, 3, 4];
+
+    let mut mp = multipeek(cloned(&data));
+    assert_eq!(mp.peek(), Some(&1));
+    assert_eq!(mp.next(), Some(1));
+    assert_eq!(mp.peek(), Some(&2));
+    assert_eq!(mp.peek(), Some(&3));
+    mp.reset_peek();
+    assert_eq!(mp.peek(), Some(&2));
+    assert_eq!(mp.next(), Some(2));
+}
+
+#[test]
+fn repeatn() {
+    let s = "α";
+    let mut it = it::repeat_n(s, 3);
+    assert_eq!(it.len(), 3);
+    assert_eq!(it.next(), Some(s));
+    assert_eq!(it.next(), Some(s));
+    assert_eq!(it.next(), Some(s));
+    assert_eq!(it.next(), None);
+    assert_eq!(it.next(), None);
+}
+
+#[test]
+fn count_clones() {
+    // Check that RepeatN only clones N - 1 times.
+
+    use std::cell::Cell;
+    #[derive(PartialEq, Debug)]
+    struct Foo {
+        n: Cell<usize>
+    }
+
+    impl Clone for Foo
+    {
+        fn clone(&self) -> Self
+        {
+            let n = self.n.get();
+            self.n.set(n + 1);
+            Foo { n: Cell::new(n + 1) }
+        }
+    }
+
+
+    for n in 0..10 {
+        let f = Foo{n: Cell::new(0)};
+        let it = it::repeat_n(f, n);
+        // drain it
+        let last = it.last();
+        if n == 0 {
+            assert_eq!(last, None);
+        } else {
+            assert_eq!(last, Some(Foo{n: Cell::new(n - 1)}));
+        }
+    }
+}
+
+#[test]
+fn part() {
+    let mut data = [7, 1, 1, 9, 1, 1, 3];
+    let i = it::partition(&mut data, |elt| *elt >= 3);
+    assert_eq!(i, 3);
+    assert_eq!(data, [7, 3, 9, 1, 1, 1, 1]);
+
+    let i = it::partition(&mut data, |elt| *elt == 1);
+    assert_eq!(i, 4);
+    assert_eq!(data, [1, 1, 1, 1, 9, 3, 7]);
+
+    let mut data = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+    let i = it::partition(&mut data, |elt| *elt % 3 == 0);
+    assert_eq!(i, 3);
+    assert_eq!(data, [9, 6, 3, 4, 5, 2, 7, 8, 1]);
+}
+
+#[test]
+fn pad_using() {
+    it::assert_equal((0..0).pad_using(1, |_| 1), (1..2));
+
+    let v: Vec<usize> = vec![0, 1, 2];
+    let r = v.into_iter().pad_using(5, |n| n);
+    it::assert_equal(r, vec![0, 1, 2, 3, 4]);
+
+    let v: Vec<usize> = vec![0, 1, 2];
+    let r = v.into_iter().pad_using(1, |_| panic!());
+    it::assert_equal(r, vec![0, 1, 2]);
+}
+
+#[test]
+fn while_some() {
+    let ns = (1..10).map(|x| if x % 5 != 0 { Some(x) } else { None })
+                    .while_some();
+    it::assert_equal(ns, vec![1, 2, 3, 4]);
+}
+
+#[test]
+fn group_by() {
+    for (ch1, sub) in &"AABBCCC".chars().group_by(|&x| x) {
+        for ch2 in sub {
+            assert_eq!(ch1, ch2);
+        }
+    }
+
+    for (ch1, sub) in &"AAABBBCCCCDDDD".chars().group_by(|&x| x) {
+        for ch2 in sub {
+            assert_eq!(ch1, ch2);
+            if ch1 == 'C' {
+                break;
+            }
+        }
+    }
+
+    let toupper = |ch: &char| ch.to_uppercase().nth(0).unwrap();
+
+    // try all possible orderings
+    for indices in permutohedron::Heap::new(&mut [0, 1, 2, 3]) {
+        let groups = "AaaBbbccCcDDDD".chars().group_by(&toupper);
+        let mut subs = groups.into_iter().collect_vec();
+
+        for &idx in &indices[..] {
+            let (key, text) = match idx {
+                 0 => ('A', "Aaa".chars()),
+                 1 => ('B', "Bbb".chars()),
+                 2 => ('C', "ccCc".chars()),
+                 3 => ('D', "DDDD".chars()),
+                 _ => unreachable!(),
+            };
+            assert_eq!(key, subs[idx].0);
+            it::assert_equal(&mut subs[idx].1, text);
+        }
+    }
+
+    let groups = "AAABBBCCCCDDDD".chars().group_by(|&x| x);
+    let mut subs = groups.into_iter().map(|(_, g)| g).collect_vec();
+
+    let sd = subs.pop().unwrap();
+    let sc = subs.pop().unwrap();
+    let sb = subs.pop().unwrap();
+    let sa = subs.pop().unwrap();
+    for (a, b, c, d) in multizip((sa, sb, sc, sd)) {
+        assert_eq!(a, 'A');
+        assert_eq!(b, 'B');
+        assert_eq!(c, 'C');
+        assert_eq!(d, 'D');
+    }
+
+    // check that the key closure is called exactly n times
+    {
+        let mut ntimes = 0;
+        let text = "AABCCC";
+        for (_, sub) in &text.chars().group_by(|&x| { ntimes += 1; x}) {
+            for _ in sub {
+            }
+        }
+        assert_eq!(ntimes, text.len());
+    }
+
+    {
+        let mut ntimes = 0;
+        let text = "AABCCC";
+        for _ in &text.chars().group_by(|&x| { ntimes += 1; x}) {
+        }
+        assert_eq!(ntimes, text.len());
+    }
+
+    {
+        let text = "ABCCCDEEFGHIJJKK";
+        let gr = text.chars().group_by(|&x| x);
+        it::assert_equal(gr.into_iter().flat_map(|(_, sub)| sub), text.chars());
+    }
+}
+
+#[test]
+fn group_by_lazy_2() {
+    let data = vec![0, 1];
+    let groups = data.iter().group_by(|k| *k);
+    let gs = groups.into_iter().collect_vec();
+    it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g));
+
+    let data = vec![0, 1, 1, 0, 0];
+    let groups = data.iter().group_by(|k| *k);
+    let mut gs = groups.into_iter().collect_vec();
+    gs[1..].reverse();
+    it::assert_equal(&[0, 0, 0, 1, 1], gs.into_iter().flat_map(|(_, g)| g));
+
+    let grouper = data.iter().group_by(|k| *k);
+    let mut groups = Vec::new();
+    for (k, group) in &grouper {
+        if *k == 1 {
+            groups.push(group);
+        }
+    }
+    it::assert_equal(&mut groups[0], &[1, 1]);
+
+    let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
+    let grouper = data.iter().group_by(|k| *k);
+    let mut groups = Vec::new();
+    for (i, (_, group)) in grouper.into_iter().enumerate() {
+        if i < 2 {
+            groups.push(group);
+        } else if i < 4 {
+            for _ in group {
+            }
+        } else {
+            groups.push(group);
+        }
+    }
+    it::assert_equal(&mut groups[0], &[0, 0, 0]);
+    it::assert_equal(&mut groups[1], &[1, 1]);
+    it::assert_equal(&mut groups[2], &[3, 3]);
+
+    // use groups as chunks
+    let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
+    let mut i = 0;
+    let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k });
+    for (i, group) in &grouper {
+        match i {
+            0 => it::assert_equal(group, &[0, 0, 0]),
+            1 => it::assert_equal(group, &[1, 1, 0]),
+            2 => it::assert_equal(group, &[0, 2, 2]),
+            3 => it::assert_equal(group, &[3, 3]),
+            _ => unreachable!(),
+        }
+    }
+}
+
+#[test]
+fn group_by_lazy_3() {
+    // test consuming each group on the lap after it was produced
+    let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2];
+    let grouper = data.iter().group_by(|elt| *elt);
+    let mut last = None;
+    for (key, group) in &grouper {
+        if let Some(gr) = last.take() {
+            for elt in gr {
+                assert!(elt != key && i32::abs(elt - key) == 1);
+            }
+        }
+        last = Some(group);
+    }
+}
+
+#[test]
+fn chunks() {
+    let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
+    let grouper = data.iter().chunks(3);
+    for (i, chunk) in grouper.into_iter().enumerate() {
+        match i {
+            0 => it::assert_equal(chunk, &[0, 0, 0]),
+            1 => it::assert_equal(chunk, &[1, 1, 0]),
+            2 => it::assert_equal(chunk, &[0, 2, 2]),
+            3 => it::assert_equal(chunk, &[3, 3]),
+            _ => unreachable!(),
+        }
+    }
+}
+
+#[test]
+fn concat_empty() {
+    let data: Vec<Vec<()>> = Vec::new();
+    assert_eq!(data.into_iter().concat(), Vec::new())
+}
+
+#[test]
+fn concat_non_empty() {
+    let data = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]];
+    assert_eq!(data.into_iter().concat(), vec![1,2,3,4,5,6,7,8,9])
+}
+
+#[test]
+fn flatten_iter() {
+    let data = vec![vec![1,2,3], vec![4,5,6]];
+    let flattened = data.into_iter().flatten();
+
+    it::assert_equal(flattened, vec![1,2,3,4,5,6]);
+}
+
+#[test]
+fn flatten_clone() {
+    let data = &[
+        &[1,2,3],
+        &[4,5,6]
+    ];
+    let flattened1 = data.into_iter().cloned().flatten();
+    let flattened2 = flattened1.clone();
+
+    it::assert_equal(flattened1, &[1,2,3,4,5,6]);
+    it::assert_equal(flattened2, &[1,2,3,4,5,6]);
+}
+
+#[test]
+fn flatten_fold() {
+    let xs = [0, 1, 1, 1, 2, 1, 3, 3];
+    let ch = xs.iter().chunks(3);
+    let mut iter = ch.into_iter().flatten();
+    iter.next();
+    let mut xs_d = Vec::new();
+    iter.fold((), |(), &elt| xs_d.push(elt));
+    assert_eq!(&xs_d[..], &xs[1..]);
+}
+
+#[test]
+fn combinations() {
+    assert!((1..3).combinations(5).next().is_none());
+
+    let it = (1..3).combinations(2);
+    it::assert_equal(it, vec![
+        vec![1, 2],
+        ]);
+
+    let it = (1..5).combinations(2);
+    it::assert_equal(it, vec![
+        vec![1, 2],
+        vec![1, 3],
+        vec![1, 4],
+        vec![2, 3],
+        vec![2, 4],
+        vec![3, 4],
+        ]);
+
+    it::assert_equal((0..0).tuple_combinations::<(_, _)>(), <Vec<_>>::new());
+    it::assert_equal((0..1).tuple_combinations::<(_, _)>(), <Vec<_>>::new());
+    it::assert_equal((0..2).tuple_combinations::<(_, _)>(), vec![(0, 1)]);
+
+    it::assert_equal((0..0).combinations(2), <Vec<Vec<_>>>::new());
+    it::assert_equal((0..1).combinations(1), vec![vec![0]]);
+    it::assert_equal((0..2).combinations(1), vec![vec![0], vec![1]]);
+    it::assert_equal((0..2).combinations(2), vec![vec![0, 1]]);
+}
+
+#[test]
+fn combinations_of_too_short() {
+    for i in 1..10 {
+        assert!((0..0).combinations(i).next().is_none());
+        assert!((0..i - 1).combinations(i).next().is_none());
+    }
+}
+
+
+#[test]
+fn combinations_zero() {
+    it::assert_equal((1..3).combinations(0), vec![vec![]]);
+}
+
+#[test]
+fn diff_mismatch() {
+    let a = vec![1, 2, 3, 4];
+    let b = vec![1.0, 5.0, 3.0, 4.0];
+    let b_map = b.into_iter().map(|f| f as i32);
+    let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b);
+
+    assert!(match diff {
+        Some(it::Diff::FirstMismatch(1, _, from_diff)) =>
+            from_diff.collect::<Vec<_>>() == vec![5, 3, 4],
+        _ => false,
+    });
+}
+
+#[test]
+fn diff_longer() {
+    let a = vec![1, 2, 3, 4];
+    let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
+    let b_map = b.into_iter().map(|f| f as i32);
+    let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b);
+
+    assert!(match diff {
+        Some(it::Diff::Longer(_, remaining)) =>
+            remaining.collect::<Vec<_>>() == vec![5, 6],
+        _ => false,
+    });
+}
+
+#[test]
+fn diff_shorter() {
+    let a = vec![1, 2, 3, 4];
+    let b = vec![1.0, 2.0];
+    let b_map = b.into_iter().map(|f| f as i32);
+    let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b);
+
+    assert!(match diff {
+        Some(it::Diff::Shorter(len, _)) => len == 2,
+        _ => false,
+    });
+}
+
+#[test]
+fn fold_while() {
+    let mut iterations = 0;
+    let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    let sum = vec.into_iter().fold_while(0, |acc, item| {
+        iterations += 1;
+        let new_sum = acc.clone() + item;
+        if new_sum <= 20 {
+            FoldWhile::Continue(new_sum)
+        } else {
+            FoldWhile::Done(acc)
+        }
+    }).into_inner();
+    assert_eq!(iterations, 6);
+    assert_eq!(sum, 15);
+}
+
+#[test]
+fn minmax() {
+    use std::cmp::Ordering;
+    use it::MinMaxResult;
+
+    // A peculiar type: Equality compares both tuple items, but ordering only the
+    // first item.  This is so we can check the stability property easily.
+    #[derive(Clone, Debug, PartialEq, Eq)]
+    struct Val(u32, u32);
+
+    impl PartialOrd<Val> for Val {
+        fn partial_cmp(&self, other: &Val) -> Option<Ordering> {
+            self.0.partial_cmp(&other.0)
+        }
+    }
+
+    impl Ord for Val {
+        fn cmp(&self, other: &Val) -> Ordering {
+            self.0.cmp(&other.0)
+        }
+    }
+
+    assert_eq!(None::<Option<u32>>.iter().minmax(), MinMaxResult::NoElements);
+
+    assert_eq!(Some(1u32).iter().minmax(), MinMaxResult::OneElement(&1));
+
+    let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)];
+
+    let minmax = data.iter().minmax();
+    assert_eq!(minmax, MinMaxResult::MinMax(&Val(0, 1), &Val(2, 1)));
+
+    let (min, max) = data.iter().minmax_by_key(|v| v.1).into_option().unwrap();
+    assert_eq!(min, &Val(2, 0));
+    assert_eq!(max, &Val(0, 2));
+
+    let (min, max) = data.iter().minmax_by(|x, y| x.1.cmp(&y.1)).into_option().unwrap();
+    assert_eq!(min, &Val(2, 0));
+    assert_eq!(max, &Val(0, 2));
+}
+
+#[test]
+fn format() {
+    let data = [0, 1, 2, 3];
+    let ans1 = "0, 1, 2, 3";
+    let ans2 = "0--1--2--3";
+
+    let t1 = format!("{}", data.iter().format(", "));
+    assert_eq!(t1, ans1);
+    let t2 = format!("{:?}", data.iter().format("--"));
+    assert_eq!(t2, ans2);
+
+    let dataf = [1.1, 2.71828, -22.];
+    let t3 = format!("{:.2e}", dataf.iter().format(", "));
+    assert_eq!(t3, "1.10e0, 2.72e0, -2.20e1");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/tests/tuples.rs
@@ -0,0 +1,73 @@
+extern crate itertools;
+
+use itertools::Itertools;
+
+#[test]
+fn tuples() {
+    let v = [1, 2, 3, 4, 5];
+    let mut iter = v.iter().cloned().tuples();
+    assert_eq!(Some((1,)), iter.next());
+    assert_eq!(Some((2,)), iter.next());
+    assert_eq!(Some((3,)), iter.next());
+    assert_eq!(Some((4,)), iter.next());
+    assert_eq!(Some((5,)), iter.next());
+    assert_eq!(None, iter.next());
+    assert_eq!(None, iter.into_buffer().next());
+
+    let mut iter = v.iter().cloned().tuples();
+    assert_eq!(Some((1, 2)), iter.next());
+    assert_eq!(Some((3, 4)), iter.next());
+    assert_eq!(None, iter.next());
+    itertools::assert_equal(vec![5], iter.into_buffer());
+
+    let mut iter = v.iter().cloned().tuples();
+    assert_eq!(Some((1, 2, 3)), iter.next());
+    assert_eq!(None, iter.next());
+    itertools::assert_equal(vec![4, 5], iter.into_buffer());
+
+    let mut iter = v.iter().cloned().tuples();
+    assert_eq!(Some((1, 2, 3, 4)), iter.next());
+    assert_eq!(None, iter.next());
+    itertools::assert_equal(vec![5], iter.into_buffer());
+}
+
+#[test]
+fn tuple_windows() {
+    let v = [1, 2, 3, 4, 5];
+
+    let mut iter = v.iter().cloned().tuple_windows();
+    assert_eq!(Some((1,)), iter.next());
+    assert_eq!(Some((2,)), iter.next());
+    assert_eq!(Some((3,)), iter.next());
+
+    let mut iter = v.iter().cloned().tuple_windows();
+    assert_eq!(Some((1, 2)), iter.next());
+    assert_eq!(Some((2, 3)), iter.next());
+    assert_eq!(Some((3, 4)), iter.next());
+    assert_eq!(Some((4, 5)), iter.next());
+    assert_eq!(None, iter.next());
+
+    let mut iter = v.iter().cloned().tuple_windows();
+    assert_eq!(Some((1, 2, 3)), iter.next());
+    assert_eq!(Some((2, 3, 4)), iter.next());
+    assert_eq!(Some((3, 4, 5)), iter.next());
+    assert_eq!(None, iter.next());
+
+    let mut iter = v.iter().cloned().tuple_windows();
+    assert_eq!(Some((1, 2, 3, 4)), iter.next());
+    assert_eq!(Some((2, 3, 4, 5)), iter.next());
+    assert_eq!(None, iter.next());
+
+    let v = [1, 2, 3];
+    let mut iter = v.iter().cloned().tuple_windows::<(_, _, _, _)>();
+    assert_eq!(None, iter.next());
+}
+
+#[test]
+fn next_tuple() {
+    let v = [1, 2, 3, 4, 5];
+    let mut iter = v.iter();
+    assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((1, 2)));
+    assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((3, 4)));
+    assert_eq!(iter.next_tuple::<(_, _)>(), None);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itertools-0.6.5/tests/zip.rs
@@ -0,0 +1,65 @@
+extern crate itertools;
+
+use itertools::Itertools;
+use itertools::EitherOrBoth::{Both, Left, Right};
+use itertools::free::zip_eq;
+
+#[test]
+fn zip_longest_fused() {
+    let a = [Some(1), None, Some(3), Some(4)];
+    let b = [1, 2, 3];
+
+    let unfused = a.iter().batching(|it| *it.next().unwrap())
+        .zip_longest(b.iter().cloned());
+    itertools::assert_equal(unfused,
+                       vec![Both(1, 1), Right(2), Right(3)]);
+}
+
+#[test]
+fn test_zip_longest_size_hint() {
+    let c = (1..10).cycle();
+    let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+    let v2 = &[10, 11, 12];
+
+    assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None));
+
+    assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10)));
+}
+
+#[test]
+fn test_double_ended_zip_longest() {
+    let xs = [1, 2, 3, 4, 5, 6];
+    let ys = [1, 2, 3, 7];
+    let a = xs.iter().map(|&x| x);
+    let b = ys.iter().map(|&x| x);
+    let mut it = a.zip_longest(b);
+    assert_eq!(it.next(), Some(Both(1, 1)));
+    assert_eq!(it.next(), Some(Both(2, 2)));
+    assert_eq!(it.next_back(), Some(Left(6)));
+    assert_eq!(it.next_back(), Some(Left(5)));
+    assert_eq!(it.next_back(), Some(Both(4, 7)));
+    assert_eq!(it.next(), Some(Both(3, 3)));
+    assert_eq!(it.next(), None);
+}
+
+
+#[should_panic]
+#[test]
+fn zip_eq_panic1()
+{
+    let a = [1, 2];
+    let b = [1, 2, 3];
+
+    zip_eq(&a, &b).count();
+}
+
+#[should_panic]
+#[test]
+fn zip_eq_panic2()
+{
+    let a: [i32; 0] = [];
+    let b = [1, 2, 3];
+
+    zip_eq(&a, &b).count();
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-intern/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"8b38b56ce5ba48b676a177c9382178b1931453fffbfbd62979b75b2b4885a963","src/lib.rs":"8b90882a6add8d03ba1b88e03348e711d2493791201619f68f9a213747545872","src/test.rs":"ae6d77f68ae1eedb4e5301c07cacdfdf088998b852854967e5ec6c477d27e899"},"package":"cc4fd87be4a815fd373e02773983940f0d75fb26fde8c098e9e45f7af03154c0"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-intern/Cargo.toml
@@ -0,0 +1,19 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "lalrpop-intern"
+version = "0.15.1"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
+description = "Simple string interner used by LALRPOP"
+license = "Apache-2.0/MIT"
+repository = "https://github.com/lalrpop/lalrpop"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-intern/src/lib.rs
@@ -0,0 +1,100 @@
+use std::collections::HashMap;
+use std::cell::RefCell;
+use std::fmt::{Debug, Display, Error, Formatter};
+use std::cmp::{Ord, Ordering, PartialOrd};
+
+#[cfg(test)]
+mod test;
+
+thread_local! {
+    static INTERNER_TLS: RefCell<Interner> =
+        RefCell::new(Interner::new())
+}
+
+pub struct Interner {
+    map: HashMap<String, InternedString>,
+    strings: Vec<String>,
+}
+
+#[derive(Copy, Clone, Hash, Eq, PartialEq)]
+pub struct InternedString {
+    index: u32,
+}
+
+pub fn intern(s: &str) -> InternedString {
+    write(|interner| {
+        match interner.map.get(s) {
+            Some(&v) => {
+                return v;
+            }
+            None => {}
+        }
+
+        let index = interner.strings.len() as u32;
+        let result = InternedString { index: index };
+        interner.map.insert(s.to_string(), result);
+        interner.strings.push(s.to_string());
+        return result;
+    })
+}
+
+pub fn read<F, R>(f: F) -> R
+where
+    F: FnOnce(&Interner) -> R,
+{
+    INTERNER_TLS.with(|interner| f(&*interner.borrow()))
+}
+
+fn write<F, R>(f: F) -> R
+where
+    F: FnOnce(&mut Interner) -> R,
+{
+    INTERNER_TLS.with(|interner| f(&mut *interner.borrow_mut()))
+}
+
+impl Interner {
+    fn new() -> Interner {
+        Interner {
+            map: HashMap::new(),
+            strings: vec![],
+        }
+    }
+
+    pub fn data(&self, i: InternedString) -> &str {
+        &self.strings[i.index()]
+    }
+}
+
+impl InternedString {
+    fn index(&self) -> usize {
+        self.index as usize
+    }
+
+    pub fn len(&self) -> usize {
+        read(|interner| interner.data(*self).len())
+    }
+}
+
+impl Debug for InternedString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        read(|interner| Debug::fmt(&interner.data(*self), fmt))
+    }
+}
+
+impl Display for InternedString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        read(|interner| Display::fmt(&interner.data(*self), fmt))
+    }
+}
+
+impl PartialOrd<InternedString> for InternedString {
+    fn partial_cmp(&self, other: &InternedString) -> Option<Ordering> {
+        read(|interner| PartialOrd::partial_cmp(interner.data(*self), interner.data(*other)))
+    }
+}
+
+impl Ord for InternedString {
+    fn cmp(&self, other: &InternedString) -> Ordering {
+        read(|interner| Ord::cmp(interner.data(*self), interner.data(*other)))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-intern/src/test.rs
@@ -0,0 +1,23 @@
+use super::intern;
+
+#[test]
+fn basic() {
+    let i = intern("hello");
+    let j = intern("world");
+    assert!(i != j);
+    assert_eq!(intern("hello"), i);
+    assert_eq!(i.to_string(), "hello");
+    assert_eq!(j.to_string(), "world");
+}
+
+#[test]
+fn debug() {
+    let i = intern("hello");
+    assert_eq!(format!("{:?}", i), "\"hello\"");
+}
+
+#[test]
+fn display() {
+    let i = intern("hello");
+    assert_eq!(format!("{}", i), "hello");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"2cc40fcf65c624ccd767f373e8a67b19f28eac032a0d2caf35044d72bc2bc77c","src/api/mod.rs":"3140db5d97aae171c820f09b8217b51fdbfbcb011279581dacc98d6dfbe1fd1a","src/build/action.rs":"a0fdb1a9228e5043cd3da3d0effb46d29bbbb01c8a5be820862692b674393460","src/build/fake_term.rs":"0356fa66487dc6bce478deafb1ad9a1976499281f79172ed049228d0e454cb2a","src/build/mod.rs":"6b10abcf38118ef15406eb0969a4b5e4ae7639c1891e64d6ded191d3a0b8eba1","src/collections/map.rs":"12042df3cede0e7b76539aa10068a7a143490dbbc6463ba10a33ab49fe70d760","src/collections/mod.rs":"51c4f28da5d201b3ed7e06f9c12883a288e5a55f4ee49824414b30d661c1a380","src/collections/multimap.rs":"aa84c44400fef4635b772f78e09be56aaea370feac045ef6336f8309cfb58a64","src/collections/set.rs":"55c9f8942bcdc79b6f404e9b3ec0b0de33b1ff73b97c46ec7ac337b728d92a70","src/file_text.rs":"39ea19ed379054fcea047a879f178aa801ba9ce41db4d4389e3bba46ee0c0cf3","src/generate.rs":"084ff538a44ea7c1a67e56ffd66060ec9f3c389f40a723989a3048e8aef8a050","src/grammar/consts.rs":"ac3d60118674c065b99c69428842f6a4e389563ebc51aead98568495c13133d6","src/grammar/mod.rs":"6b8bd7a7df0ed18486c8e0ac12304135c3277aeffe6f6faf8bf49a29edb50f6b","src/grammar/parse_tree.rs":"1f147a0ce70dd0cc03cfdf64c8b4df2dcc84b9dc1a3ffe8d1cfc5b418dac978e","src/grammar/pattern.rs":"7314b4e6321aa2811f92d1ed605ebf993007e54a91aae875d8186d7008fbef98","src/grammar/repr.rs":"5c5675e84d25dd86972f2e641cc26dd414058a12b8fcc403586b7ad937776fbd","src/grammar/token/mod.rs":"347c171330eed42c23356e42c9e9b30cc7564b5fdc5bf6625573c44fdb885cdf","src/grammar/token/test.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/kernel_set.rs":"c6da6013debabd7e4624571a31984ba8cb3902b4e4afb61f48ae2277e61a2e8e","src/lexer/dfa/interpret.rs":"3fe65d62acada89c3d39c4f89f96860573a55ccb0195ee518361aca2b24b4cd7","src/lexer/dfa/mod.rs":"8b8e75795cbfdd121d7c905e8cf0b03df21dfc5693a8190adcf6eec7960b7ad2","src/lexer/dfa/overlap.rs":"5373f47905ca913ba747a44295dce338b085d30a2fa47fe740e832fd526000ca","src/lexer/dfa/test.rs":"f3b8510b644906d7529a45574f24edbe78238bd7b92dc4f27eeb47c875873273","src/lexer/intern_token/mod.rs":"12389ce82391943d348ce771a81b32b74cd8a99a22697d4411eb2b886a20ac2a","src/lexer/mod.rs":"427cd764234bc844b1653a3e32f5d2aed344e3dbd5b16d10d318ae337bc03a4e","src/lexer/nfa/interpret.rs":"0232acd16c1f74b4b10b4e2b62362d0c638ccedfb2d39c4ed6578fecb55090df","src/lexer/nfa/mod.rs":"a7fc713397a91f7617adf5bd1724bb6032a570ff56a331085ef7b33b9bec838c","src/lexer/nfa/test.rs":"c4fc89d218d67a56b414635991409061ba8c7c34c539f83118748b5f2ddbd699","src/lexer/re/mod.rs":"6dbe87ded5f2354e3ca1f02867f0101be478b9a8ff39155a5c3941ca89773c0b","src/lexer/re/test.rs":"c32af553e10cafc7d5c975fd347041dc065e1e17d380f9c8800282a3f0bb7957","src/lib.rs":"d97614ef5559e858e76ec9e2cc4d2c26a95230c9d8cf2c945cdf1412537935a7","src/log.rs":"44b4d616801c0bc46bb07051d393b21dd3c9f9686627a0b7583a06664a2ef4ea","src/lr1/build/mod.rs":"658217bd35f43c6761b480ef66dbb4e4d74385f8d46f8f8aa136d2572361111c","src/lr1/build/test.rs":"d3082486e4836d979fc71adc661429f9bcb2255e73785de3aa7afb1f98579cbb","src/lr1/build_lalr/mod.rs":"ec59df171ce24317b22be2eb2efddf8fcdd732e12c6f90c0f9f4efbf1c666f9a","src/lr1/build_lalr/test.rs":"ee40db2b645373440720577e57d1b54c4d8f302e448246ed44ee41129f80e295","src/lr1/codegen/ascent.rs":"708e016e83cb158a5c62355d1f130f44661ae53109931a472fd09344f45a2e0f","src/lr1/codegen/base.rs":"ea0efa6111ea4021d9bac2819f3755131c616fe201a10deb971d02139aa64dff","src/lr1/codegen/mod.rs":"7189f8aa348bd2b6fcf37daa5f7e819849f5b6f0915f1c31d21b356d2f9df7b6","src/lr1/codegen/parse_table.rs":"411c5f9472a291053445924f595156bcbe54ad1554bad9dc5d6b461020859723","src/lr1/codegen/test_all.rs":"ec808cb7a534c6894882873c0c33990363a7c8218347a7542e047924c099d30c","src/lr1/core/mod.rs":"c953b6ae599a0ea0c71fe8f33c349d70c5a5b7772cf94228da7fd2c01efb7460","src/lr1/error/mod.rs":"58f1ddabccf7a59548148b49cd014994afc2e21545b3e9d7bce71dc744ab0fa8","src/lr1/error/test.rs":"0399afaa009a760ffe0fde63ffa8ff7e77dc83edd76c4681caecafc3e9151baa","src/lr1/example/mod.rs":"5fa766e7ea6baefe9b8c8766e5b772e0d13d800007eb9e96b38c67f3ab21e6e4","src/lr1/example/test.rs":"53bb8d20c8673ab67490c18004505c676b2a9d0cc171283dbfcd7f28f681f7d5","src/lr1/first/mod.rs":"1480361d3d468506f02755d562f2c7717b22a3f60b20ff1261de40796b199111","src/lr1/first/test.rs":"483c4c555f46136db01fcadb3cf205019b2337870aca42c6881c75570919f5da","src/lr1/interpret.rs":"c6b988be0adf7c5e833a2ba0d80be40875f4d9073ea82e1ec8e86c5484a93b87","src/lr1/item.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/lr1/lane_table/README.md":"494de731bd3ac5c44dc05c84497e59e713bbc1e50c24b4dd199a6576ae72f925","src/lr1/lane_table/construct/merge.rs":"4bfa79dec544b397d9455c6202cc2374db8c2e135a457e31ee77cf9ab206c274","src/lr1/lane_table/construct/mod.rs":"8b6a1f7ee2eca7591c5e43e29c3a3c3ccd88b4df8f6f550162d51bbb78f38af9","src/lr1/lane_table/construct/state_set.rs":"c47a87ec43e956e630121e2e9194fd77dff1d57d4cb9249136199b51fd1ca604","src/lr1/lane_table/lane/mod.rs":"690efee0f32af107dd4ee05f90c0dcb0b67ae4b553c0f95e7d92fc9e896e1475","src/lr1/lane_table/mod.rs":"6f671cc10a8df06f7dc807193521b4af27a207b74e181e9a073f0d43da0415df","src/lr1/lane_table/table/context_set/mod.rs":"94cc5922b13126b88dd452845803c6ce0d96f23e527a60fb9240315589d0192d","src/lr1/lane_table/table/context_set/test.rs":"b4f8ea549fe8247264aa8d8d891894f45f409aab247d3989638e480d5d9686d2","src/lr1/lane_table/table/mod.rs":"535084856c85e1e7d6de47ec5b19c8bcaba9b9c3b917a4c7c245e3a6c722528e","src/lr1/lane_table/test.rs":"1ab1447a5a16e95fc2e0a2674da3091041aafb6156ad4cfbe8bddd8f2d6d651a","src/lr1/lookahead.rs":"5c368c28e8101d59f18b5ee57adcc0fe34462ae39884a13bc1d6b652e3838ca9","src/lr1/mod.rs":"0c968f46ac56b4606d1e2119411e3e65a49c15cc3a7d0c79d298f139bb9b233c","src/lr1/report/mod.rs":"b67fc309b725d9eff58ea57ea5c219001d8023d93ab6e40f1a796f6d4f331d1a","src/lr1/state_graph.rs":"4168fa99fee5e7ac47e23a4506c90f16239c3b6a1dc756d9b3efbdca4a8505ce","src/lr1/tls.rs":"f40f9bacab9a471b58029eea4244996fe48dc41ee41cfb31c51b015bf20f4dfe","src/lr1/trace/mod.rs":"d71cf150567f3f0af3bf2c3bcaf1c443d9785edb27d9900393c6b3515cb1f17a","src/lr1/trace/reduce/mod.rs":"fe976f6de97d8dd4c9d582ba538fc0fdde0489313f07ab4fcb8769f0aab27eb7","src/lr1/trace/reduce/test.rs":"56789d4af6b330c65cac4099e31bf54a02c98d8a7607f010e9d404dbce208bdc","src/lr1/trace/shift/mod.rs":"a85b17d3ec5c60990b438f5912eda8fe41d878e11fc613d897aee414780f8bf5","src/lr1/trace/shift/test.rs":"2c727135de13d45198d9fd62abf3bbabb356cf6888071e9d35aa1cb1cf39742b","src/lr1/trace/trace_graph/mod.rs":"e37bb24a2b37e780e83735a8fc33005bcd1a5117caa956c23a2b462954fbfd2e","src/lr1/trace/trace_graph/test.rs":"be123da8f47641b49878eb6da1f77a237ea9e14f620de09de7eb5c93eaf1cba9","src/message/builder.rs":"9ba48b51f12a8f21210ba82e6dd51b37442d5a0e1a25cee13e967bf36a04ea7b","src/message/horiz.rs":"8354a19142434ab05958f1bbd26e36244fcf57f101997fcb1bf210d168ff7970","src/message/indent.rs":"0e739f0a445bcb5165d2d4406c89b139057df4cccbc6a37a9b63792e6996925d","src/message/message.rs":"c217f00b20243771b6d4c002a88321501ff78a66346f1cdc39bd49e3635d346b","src/message/mod.rs":"1df6aade06d6a56cfb23faeb27da328ff3e3281364f91376cea5a54e3dca067b","src/message/styled.rs":"f027ef2bd3fe90a865f2437cde9cbe857b5dc1ffff986e6eded7ed96252a5e60","src/message/test.rs":"5cb26ccff7242f2acde35e78077b77955c053da30f1badf7cc2e7962942b351a","src/message/text.rs":"c98f53953ed215e0933de12657ccc3cd97476cca0d8730ada51e8789bb6d2958","src/message/vert.rs":"d204e54edce130d45d830b4e5018863dc3be9083e037c357b38b61ced42921e2","src/message/wrap.rs":"a27c8d93e5d357b5ad0e451ea5b6476b0536cf458ecbdd421506bba6c4372c97","src/normalize/inline/graph/mod.rs":"26700d5d96ddd62433a83ac14f836e1a7bebf7b78e0fb0179f33f733d6a1a87e","src/normalize/inline/graph/test.rs":"ca2fc54bbe5187fcdbbeff2b13cf7d0df67d369c4b9b9a83ace5626c93f9f839","src/normalize/inline/mod.rs":"c2ce84a9fdfe77e8ddb6c2a0497a2da1c6165264dccf142c8885352eb8242a7f","src/normalize/inline/test.rs":"69b1c44e297c177efd0d929ff626583aab02ffcdf51b8772a629d3ce2b178e0e","src/normalize/lower/mod.rs":"1cf4dc078f4cc72be239ef84fa2f8054bf7c4f08b18eedca2fd2a2ad6c3594c7","src/normalize/macro_expand/mod.rs":"5ffe55674045d8b7be8036e2f36a87d7d5b74f76f4bad5c040b3a546b1a5ec5b","src/normalize/macro_expand/test.rs":"9745129ddfa458bc15923606904ca698b377c570776725b9b80e9969cb2ae87e","src/normalize/mod.rs":"5bf1a73ae9148cbac1c662520b56c7904a49ab367cd78909926253372c9642ab","src/normalize/norm_util.rs":"f1bbf8c58fc56670e5dd88d3f1fac7951fb79b5809dc6e734d2063405aa74930","src/normalize/prevalidate/mod.rs":"3abc85becedf6ba1fc499390ff2130bb8afa706dd0e00b17b8198504cf48481c","src/normalize/prevalidate/test.rs":"95bfc751eeb49b741ac0037628452e2db1637f17394fdffbc31fef7c7383c2bd","src/normalize/resolve/mod.rs":"8fae0ab78e3ca4ee1c8e1b2e84729316ec3c1d62f452fe48f59e83287156bb88","src/normalize/resolve/test.rs":"39007967a516be901f59a9f6b0846df2cd28233f77d0c7813b20318166db9c04","src/normalize/token_check/mod.rs":"f25cc20b45a68c185ec652b123190b2546fc903980e436bc88b96f02d0c2cbc7","src/normalize/token_check/test.rs":"51eefaf7f860ffb611206b7e591e3aef38984e5d530a3637eae55089eb401f3d","src/normalize/tyinfer/mod.rs":"57501d7cc07b3567f8e3925f7f30a4226e2680e59581f98cd8f4013fa5e1f5ee","src/normalize/tyinfer/test.rs":"825816aa6ee96c64ffb38403cdfbf527ca86bb3b6a4517239f6e142e081eb956","src/parser/lrgrammar.rs":"a1b1482b0e3ab9b71b511dd3b3ac5c09bc19aa8284f2c7c2411b3caa19672684","src/parser/mod.rs":"ec25dcd0ca5a624f0394583a9fb7239ed904ecbaacf4e2622f69e1ae7bde23c0","src/parser/test.rs":"016dcd9d7bf443c427688f288d764a2149f8c8ae5f47a237c7260ed235a949c7","src/rust/mod.rs":"bb3687b7332731ab1c2ac36dd5cd4833293fa8a2b4503cce9f5cc2dc6ca43f93","src/session.rs":"409ab312e9ed87bac43544cd5e63f282e2fa343871305bf789612139906637c1","src/test_util.rs":"5aa61b5051c1f5930ef80dbd0e88d19cff2477824cd40069b9735ba279e58da2","src/tls/mod.rs":"35463d95c5d0476da7ac94cc633d4ccff28d890c2e88401c54fe95314c9a5839","src/tok/mod.rs":"3373dcd94bd08d1fdc2ad3d5bb5d2729d4ddee562dd08fb97ae897d48ced4229","src/tok/test.rs":"9818d57f6c70a3bc1f2e41a80fb3e0760bc70ff2739e2e61f628587a76adac8e","src/util.rs":"228ef527b92dedbe3caa9b16d906254d7b3e6fe8bbb32b312b613640d5cf18a1"},"package":"5f244285324e4e33d486910b66fd3b7cb37e2072c5bf63319f506fe99ed72650"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/Cargo.toml
@@ -0,0 +1,68 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "lalrpop-snap"
+version = "0.15.1"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
+description = "convenient LR(1) parser generator"
+readme = "../README.md"
+keywords = ["parser", "generator", "LR", "yacc", "grammar"]
+categories = ["parsing"]
+license = "Apache-2.0/MIT"
+repository = "https://github.com/lalrpop/lalrpop"
+
+[lib]
+doctest = false
+[dependencies.ascii-canvas]
+version = "1.0"
+
+[dependencies.atty]
+version = "0.1.2"
+
+[dependencies.bit-set]
+version = "0.4.0"
+
+[dependencies.diff]
+version = "0.1.9"
+
+[dependencies.ena]
+version = "0.5"
+
+[dependencies.itertools]
+version = "0.7"
+
+[dependencies.lalrpop-intern]
+version = "0.15.1"
+
+[dependencies.lalrpop-util]
+version = "0.15.1"
+
+[dependencies.petgraph]
+version = "0.4.4"
+
+[dependencies.regex]
+version = "0.2.1"
+
+[dependencies.regex-syntax]
+version = "0.4.0"
+
+[dependencies.string_cache]
+version = "0.7.1"
+
+[dependencies.term]
+version = "0.4.5"
+
+[dependencies.unicode-xid]
+version = "0.1"
+[dev-dependencies.rand]
+version = "0.4"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/api/mod.rs
@@ -0,0 +1,182 @@
+use build;
+use log::Level;
+use session::{ColorConfig, Session};
+use std::default::Default;
+use std::env;
+use std::env::current_dir;
+use std::error::Error;
+use std::path::{Path, PathBuf};
+use std::rc::Rc;
+
+/// Configure various aspects of how LALRPOP works.
+/// Intended for use within a `build.rs` script.
+/// To get the default configuration, use `Configuration::new`.
+#[derive(Clone, Default)]
+pub struct Configuration {
+    session: Session,
+}
+
+impl Configuration {
+    /// Creates the default configuration; equivalent to `Configuration::default`.
+    pub fn new() -> Configuration {
+        Configuration::default()
+    }
+
+    /// Always use ANSI colors in output, even if output does not appear to be a TTY.
+    pub fn always_use_colors(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::Yes;
+        self
+    }
+
+    /// Never use ANSI colors in output, even if output appears to be a TTY.
+    pub fn never_use_colors(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::No;
+        self
+    }
+
+    /// Use ANSI colors in output if output appears to be a TTY, but
+    /// not otherwise. This is the default.
+    pub fn use_colors_if_tty(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::IfTty;
+        self
+    }
+
+    /// Specify a custom directory to search for input files.  This
+    /// directory is recursively searched for `.lalrpop` files to be
+    /// considered as input files.  This configuration setting also
+    /// impacts where output files are placed; paths are made relative
+    /// to the input path before being resolved relative to the output
+    /// path.  By default, the input directory is the current working
+    /// directory.
+    pub fn set_in_dir<P>(&mut self, dir: P) -> &mut Self
+    where
+        P: Into<PathBuf>,
+    {
+        self.session.in_dir = Some(dir.into());
+        self
+    }
+
+    /// Specify a custom directory to use when writing output files.
+    /// By default, the output directory is the same as the input
+    /// directory.
+    pub fn set_out_dir<P>(&mut self, dir: P) -> &mut Self
+    where
+        P: Into<PathBuf>,
+    {
+        self.session.out_dir = Some(dir.into());
+        self
+    }
+
+    /// Apply `cargo` directory location conventions, by setting the
+    /// input directory to `src` and the output directory to
+    /// `$OUT_DIR`.
+    pub fn use_cargo_dir_conventions(&mut self) -> &mut Self {
+        self.set_in_dir("src")
+            .set_out_dir(env::var("OUT_DIR").unwrap());
+        self
+    }
+
+    /// If true, always convert `.lalrpop` files into `.rs` files, even if the
+    /// `.rs` file is newer. Default is false.
+    pub fn force_build(&mut self, val: bool) -> &mut Configuration {
+        self.session.force_build = val;
+        self
+    }
+
+    /// If true, emit comments into the generated code. This makes the
+    /// generated code significantly larger. Default is false.
+    pub fn emit_comments(&mut self, val: bool) -> &mut Configuration {
+        self.session.emit_comments = val;
+        self
+    }
+
+    /// If true, emit report file about generated code.
+    pub fn emit_report(&mut self, val: bool) -> &mut Configuration {
+        self.session.emit_report = val;
+        self
+    }
+
+    /// Minimal logs: only for errors that halt progress.
+    pub fn log_quiet(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Taciturn);
+        self
+    }
+
+    /// Informative logs: give some high-level indications of
+    /// progress (default).
+    pub fn log_info(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Informative);
+        self
+    }
+
+    /// Verbose logs: more than info, but still not overwhelming.
+    pub fn log_verbose(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Verbose);
+        self
+    }
+
+    /// Debug logs: better redirect this to a file. Intended for
+    /// debugging LALRPOP itself.
+    pub fn log_debug(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Debug);
+        self
+    }
+
+    /// Enables "unit-testing" configuration. This is only for
+    /// lalrpop-test.
+    #[doc(hidden)]
+    pub fn unit_test(&mut self) -> &mut Configuration {
+        self.session.unit_test = true;
+        self
+    }
+
+    /// Process all files according to the `set_in_dir` and
+    /// `set_out_dir` configuration.
+    pub fn process(&self) -> Result<(), Box<Error>> {
+        let root = if let Some(ref d) = self.session.in_dir {
+            d.as_path()
+        } else {
+            Path::new(".")
+        };
+        self.process_dir(root)
+    }
+
+    /// Process all files in the current directory, which -- unless you
+    /// have changed it -- is typically the root of the crate being compiled.
+    pub fn process_current_dir(&self) -> Result<(), Box<Error>> {
+        self.process_dir(try!(current_dir()))
+    }
+
+    /// Process all `.lalrpop` files in `path`.
+    pub fn process_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), Box<Error>> {
+        let session = Rc::new(self.session.clone());
+        try!(build::process_dir(session, path));
+        Ok(())
+    }
+
+    /// Process the given `.lalrpop` file.
+    pub fn process_file<P: AsRef<Path>>(&self, path: P) -> Result<(), Box<Error>> {
+        let session = Rc::new(self.session.clone());
+        try!(build::process_file(session, path));
+        Ok(())
+    }
+}
+
+/// Process all files in the current directory, which -- unless you
+/// have changed it -- is typically the root of the crate being compiled.
+///
+/// Equivalent to `Configuration::new().process_current_dir()`.
+pub fn process_root() -> Result<(), Box<Error>> {
+    Configuration::new().process_current_dir()
+}
+
+/// Deprecated in favor of `Configuration`. Try:
+///
+/// ```rust
+/// Configuration::new().force_build(true).process_current_dir()
+/// ```
+///
+/// instead.
+pub fn process_root_unconditionally() -> Result<(), Box<Error>> {
+    Configuration::new().force_build(true).process_current_dir()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/build/action.rs
@@ -0,0 +1,422 @@
+//! Code for generating action code.
+//!
+//! From the outside, action fns have one of two forms. If they take
+//! symbols as input, e.g. from a production like `X = Y Z => ...`
+//! (which takes Y and Z as input), they have this form:
+//!
+//! ```
+//! fn __action17<
+//!     'input,                       // user-declared type parameters (*)
+//! >(
+//!     input: &'input str,           // user-declared parameters
+//!     __0: (usize, usize, usize),   // symbols being reduced, if any
+//!     ...
+//!     __N: (usize, Foo, usize),     // each has a type (L, T, L)
+//! ) -> Box<Expr<'input>>
+//! ```
+//!
+//! Otherwise, they have this form:
+//!
+//! ```
+//! fn __action17<
+//!     'input,                       // user-declared type parameters (*)
+//! >(
+//!     input: &'input str,           // user-declared parameters
+//!    __lookbehind: &usize,          // value for @R -- "end of previous token"
+//!    __lookahead: &usize,           // value for @L -- "start of next token"
+//! ) -> Box<Expr<'input>>
+//! ```
+//!
+//! * -- in this case, those "user-declared" parameters are inserted by
+//! the "internal tokenizer".
+
+use grammar::repr as r;
+use rust::RustWrite;
+use std::io::{self, Write};
+
+pub fn emit_action_code<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    for (i, defn) in grammar.action_fn_defns.iter().enumerate() {
+        rust!(rust, "");
+
+        // we always thread the parameters through to the action code,
+        // even if they are not used, and hence we need to disable the
+        // unused variables lint, which otherwise gets very excited.
+        if !grammar.parameters.is_empty() {
+            rust!(rust, "#[allow(unused_variables)]");
+        }
+
+        match defn.kind {
+            r::ActionFnDefnKind::User(ref data) => {
+                try!(emit_user_action_code(grammar, rust, i, defn, data))
+            }
+            r::ActionFnDefnKind::Lookaround(ref variant) => {
+                try!(emit_lookaround_action_code(grammar, rust, i, defn, variant))
+            }
+            r::ActionFnDefnKind::Inline(ref data) => {
+                try!(emit_inline_action_code(grammar, rust, i, defn, data))
+            }
+        }
+    }
+
+    Ok(())
+}
+
+fn ret_type_string(grammar: &r::Grammar, defn: &r::ActionFnDefn) -> String {
+    if defn.fallible {
+        format!(
+            "Result<{},{}lalrpop_util::ParseError<{},{},{}>>",
+            defn.ret_type,
+            grammar.prefix,
+            grammar.types.terminal_loc_type(),
+            grammar.types.terminal_token_type(),
+            grammar.types.error_type()
+        )
+    } else {
+        format!("{}", defn.ret_type)
+    }
+}
+
+fn emit_user_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    defn: &r::ActionFnDefn,
+    data: &r::UserActionFnDefn,
+) -> io::Result<()> {
+    let ret_type = ret_type_string(grammar, defn);
+
+    // For each symbol to be reduced, we will receive
+    // a (L, T, L) triple where the Ls are locations and
+    // the T is the data. Ignore the locations and bind
+    // the data to the name the user gave.
+    let mut arguments: Vec<String> = data.arg_patterns
+        .iter()
+        .zip(
+            data.arg_types
+                .iter()
+                .cloned()
+                .map(|t| grammar.types.spanned_type(t)),
+        )
+        .map(|(p, t)| format!("(_, {}, _): {}", p, t))
+        .collect();
+
+    // If this is a reduce of an empty production, we will
+    // automatically add position information in the form of
+    // lookbehind/lookahead values. Otherwise, those values would be
+    // determined from the arguments themselves.
+    if data.arg_patterns.is_empty() {
+        arguments.extend(vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ]);
+    }
+
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        arguments,
+        ret_type,
+        vec![]
+    ));
+    rust!(rust, "{{");
+    rust!(rust, "{}", data.code);
+    rust!(rust, "}}");
+    Ok(())
+}
+
+fn emit_lookaround_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    _defn: &r::ActionFnDefn,
+    data: &r::LookaroundActionFnDefn,
+) -> io::Result<()> {
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ],
+        format!("{}", grammar.types.terminal_loc_type()),
+        vec![]
+    ));
+
+    rust!(rust, "{{");
+    match *data {
+        r::LookaroundActionFnDefn::Lookahead => {
+            // take the lookahead, if any; otherwise, we are
+            // at EOF, so taker the lookbehind (end of last
+            // pushed token); if that is missing too, then
+            // supply default.
+            rust!(rust, "{}lookahead.clone()", grammar.prefix);
+        }
+        r::LookaroundActionFnDefn::Lookbehind => {
+            // take lookbehind or supply default
+            rust!(rust, "{}lookbehind.clone()", grammar.prefix);
+        }
+    }
+    rust!(rust, "}}");
+    Ok(())
+}
+
+fn emit_inline_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    defn: &r::ActionFnDefn,
+    data: &r::InlineActionFnDefn,
+) -> io::Result<()> {
+    let ret_type = ret_type_string(grammar, defn);
+
+    let arg_types: Vec<_> = data.symbols
+        .iter()
+        .flat_map(|sym| match *sym {
+            r::InlinedSymbol::Original(ref s) => vec![s.clone()],
+            r::InlinedSymbol::Inlined(_, ref syms) => syms.clone(),
+        })
+        .map(|s| s.ty(&grammar.types))
+        .collect();
+
+    // this is the number of symbols we expect to be passed in; it is
+    // distinct from data.symbols.len(), because sometimes we have
+    // inlined actions with no input symbols
+    let num_flat_args = arg_types.len();
+
+    let mut arguments: Vec<_> = arg_types
+        .iter()
+        .map(|&t| grammar.types.spanned_type(t.clone()))
+        .enumerate()
+        .map(|(i, t)| format!("{}{}: {}", grammar.prefix, i, t))
+        .collect();
+
+    // If no symbols are being reduced, add in the
+    // lookbehind/lookahead.
+    if arguments.len() == 0 {
+        arguments.extend(vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ]);
+    }
+
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        arguments,
+        ret_type,
+        vec![]
+    ));
+    rust!(rust, "{{");
+
+    // For each inlined thing, compute the start/end locations.
+    // Do this first so that none of the arguments have been moved
+    // yet and we can easily access their locations.
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(_, ref syms) => {
+                if syms.len() > 0 {
+                    // If we are reducing symbols, then start and end
+                    // can be the start/end location of the first/last
+                    // symbol respectively. Easy peezy.
+
+                    rust!(
+                        rust,
+                        "let {}start{} = {}{}.0.clone();",
+                        grammar.prefix,
+                        temp_counter,
+                        grammar.prefix,
+                        arg_counter
+                    );
+
+                    let last_arg_index = arg_counter + syms.len() - 1;
+                    rust!(
+                        rust,
+                        "let {}end{} = {}{}.2.clone();",
+                        grammar.prefix,
+                        temp_counter,
+                        grammar.prefix,
+                        last_arg_index
+                    );
+                } else {
+                    // If we have no symbols, then `arg_counter`
+                    // represents index of the first symbol after this
+                    // inlined item (if any), and `arg_counter-1`
+                    // represents index of the symbol before this
+                    // item.
+
+                    if arg_counter > 0 {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}{}.2.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter - 1
+                        );
+                    } else if num_flat_args > 0 {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}{}.0.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter
+                        );
+                    } else {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}lookbehind.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix
+                        );
+                    }
+
+                    if arg_counter < num_flat_args {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}{}.0.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter
+                        );
+                    } else if num_flat_args > 0 {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}{}.2.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            num_flat_args - 1
+                        );
+                    } else {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}lookahead.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix
+                        );
+                    }
+                }
+
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+
+    // Now create temporaries for the inlined things
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(inlined_action, ref syms) => {
+                // execute the inlined reduce action
+                rust!(
+                    rust,
+                    "let {}temp{} = {}action{}(",
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    inlined_action.index()
+                );
+                for parameter in &grammar.parameters {
+                    rust!(rust, "{},", parameter.name);
+                }
+                for i in 0..syms.len() {
+                    rust!(rust, "{}{},", grammar.prefix, arg_counter + i);
+                }
+                if syms.len() == 0 {
+                    rust!(rust, "&{}start{},", grammar.prefix, temp_counter);
+                    rust!(rust, "&{}end{},", grammar.prefix, temp_counter);
+                }
+                rust!(rust, ");");
+
+                // wrap up the inlined value along with its span
+                rust!(
+                    rust,
+                    "let {}temp{} = ({}start{}, {}temp{}, {}end{});",
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter
+                );
+
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+
+    rust!(rust, "{}action{}(", grammar.prefix, data.action.index());
+    for parameter in &grammar.parameters {
+        rust!(rust, "{},", parameter.name);
+    }
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                rust!(rust, "{}{},", grammar.prefix, arg_counter);
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(_, ref syms) => {
+                rust!(rust, "{}temp{},", grammar.prefix, temp_counter);
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+    assert!(data.symbols.len() > 0);
+    rust!(rust, ")");
+
+    rust!(rust, "}}");
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/build/fake_term.rs
@@ -0,0 +1,84 @@
+use std::io::{self, Write};
+use term::{self, Attr, Terminal};
+use term::color::Color;
+
+/// A `Terminal` that just ignores all attempts at formatting. Used
+/// to report errors when no ANSI terminfo is available.
+pub struct FakeTerminal<W: Write> {
+    write: W,
+}
+
+impl<W: Write> FakeTerminal<W> {
+    pub fn new(write: W) -> FakeTerminal<W> {
+        FakeTerminal { write: write }
+    }
+}
+
+impl<W: Write> Write for FakeTerminal<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.write.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.write.flush()
+    }
+}
+
+impl<W: Write> Terminal for FakeTerminal<W> {
+    type Output = W;
+
+    fn fg(&mut self, _color: Color) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn bg(&mut self, _color: Color) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn attr(&mut self, _attr: Attr) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn supports_attr(&self, _attr: Attr) -> bool {
+        false
+    }
+
+    fn reset(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn supports_reset(&self) -> bool {
+        false
+    }
+
+    fn supports_color(&self) -> bool {
+        false
+    }
+
+    fn cursor_up(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn delete_line(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn carriage_return(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn get_ref(&self) -> &Self::Output {
+        &self.write
+    }
+
+    fn get_mut(&mut self) -> &mut Self::Output {
+        &mut self.write
+    }
+
+    fn into_inner(self) -> Self::Output
+    where
+        Self: Sized,
+    {
+        self.write
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/build/mod.rs
@@ -0,0 +1,585 @@
+//! Utilies for running in a build script.
+
+use atty;
+use file_text::FileText;
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use lalrpop_util::ParseError;
+use lexer::intern_token;
+use lr1;
+use message::{Content, Message};
+use message::builder::InlineBuilder;
+use normalize;
+use parser;
+use rust::RustWrite;
+use session::{ColorConfig, Session};
+use term;
+use tls::Tls;
+use tok;
+
+use std::fs;
+use std::io::{self, BufRead, Write};
+use std::path::{Path, PathBuf};
+use std::process::exit;
+use std::rc::Rc;
+
+mod action;
+mod fake_term;
+
+use self::fake_term::FakeTerminal;
+
+const LALRPOP_VERSION_HEADER: &'static str = concat!(
+    "// auto-generated: \"",
+    env!("CARGO_PKG_NAME"),
+    " ",
+    env!("CARGO_PKG_VERSION"),
+    "\""
+);
+
+pub fn process_dir<P: AsRef<Path>>(session: Rc<Session>, root_dir: P) -> io::Result<()> {
+    let lalrpop_files = try!(lalrpop_files(root_dir));
+    for lalrpop_file in lalrpop_files {
+        try!(process_file(session.clone(), lalrpop_file));
+    }
+    Ok(())
+}
+
+pub fn process_file<P: AsRef<Path>>(session: Rc<Session>, lalrpop_file: P) -> io::Result<()> {
+    let lalrpop_file = lalrpop_file.as_ref();
+    let rs_file = try!(resolve_rs_file(&session, lalrpop_file));
+    let report_file = try!(resolve_report_file(&session, lalrpop_file));
+    process_file_into(session, lalrpop_file, &rs_file, &report_file)
+}
+
+fn resolve_rs_file(session: &Session, lalrpop_file: &Path) -> io::Result<PathBuf> {
+    gen_resolve_file(session, lalrpop_file, "rs")
+}
+
+fn resolve_report_file(session: &Session, lalrpop_file: &Path) -> io::Result<PathBuf> {
+    gen_resolve_file(session, lalrpop_file, "report")
+}
+
+fn gen_resolve_file(session: &Session, lalrpop_file: &Path, ext: &str) -> io::Result<PathBuf> {
+    let in_dir = if let Some(ref d) = session.in_dir {
+        d.as_path()
+    } else {
+        Path::new(".")
+    };
+    let out_dir = if let Some(ref d) = session.out_dir {
+        d.as_path()
+    } else {
+        in_dir
+    };
+
+    // If the lalrpop file is not in in_dir, the result is that the
+    // .rs file is created in the same directory as the lalrpop file
+    // for compatibility reasons
+    Ok(out_dir
+        .join(lalrpop_file.strip_prefix(&in_dir).unwrap_or(lalrpop_file))
+        .with_extension(ext))
+}
+
+fn process_file_into(
+    session: Rc<Session>,
+    lalrpop_file: &Path,
+    rs_file: &Path,
+    report_file: &Path,
+) -> io::Result<()> {
+    if session.force_build || try!(needs_rebuild(&lalrpop_file, &rs_file)) {
+        log!(
+            session,
+            Informative,
+            "processing file `{}`",
+            lalrpop_file.to_string_lossy()
+        );
+        if let Some(parent) = rs_file.parent() {
+            try!(fs::create_dir_all(parent));
+        }
+        try!(make_read_only(&rs_file, false));
+        try!(remove_old_file(&rs_file));
+
+        // Load the LALRPOP source text for this file:
+        let file_text = Rc::new(try!(FileText::from_path(lalrpop_file.to_path_buf())));
+
+        // Store the session and file-text in TLS -- this is not
+        // intended to be used in this high-level code, but it gives
+        // easy access to this information pervasively in the
+        // low-level LR(1) and grammar normalization code. This is
+        // particularly useful for error-reporting.
+        let _tls = Tls::install(session.clone(), file_text.clone());
+
+        // Do the LALRPOP processing itself and write the resulting
+        // buffer into a file. We use a buffer so that if LR(1)
+        // generation fails at some point, we don't leave a partial
+        // file behind.
+        {
+            let grammar = try!(parse_and_normalize_grammar(&session, &file_text));
+            let buffer = try!(emit_recursive_ascent(&session, &grammar, &report_file));
+            let mut output_file = try!(fs::File::create(&rs_file));
+            try!(writeln!(output_file, "{}", LALRPOP_VERSION_HEADER));
+            try!(output_file.write_all(&buffer));
+        }
+
+        try!(make_read_only(&rs_file, true));
+    }
+    Ok(())
+}
+
+fn remove_old_file(rs_file: &Path) -> io::Result<()> {
+    match fs::remove_file(rs_file) {
+        Ok(()) => Ok(()),
+        Err(e) => {
+            // Unix reports NotFound, Windows PermissionDenied!
+            match e.kind() {
+                io::ErrorKind::NotFound | io::ErrorKind::PermissionDenied => Ok(()),
+                _ => Err(e),
+            }
+        }
+    }
+}
+
+fn needs_rebuild(lalrpop_file: &Path, rs_file: &Path) -> io::Result<bool> {
+    return match fs::metadata(&rs_file) {
+        Ok(rs_metadata) => {
+            let lalrpop_metadata = try!(fs::metadata(&lalrpop_file));
+            if compare_modification_times(&lalrpop_metadata, &rs_metadata) {
+                return Ok(true);
+            }
+
+            compare_lalrpop_version(rs_file)
+        }
+        Err(e) => match e.kind() {
+            io::ErrorKind::NotFound => Ok(true),
+            _ => Err(e),
+        },
+    };
+
+    #[cfg(unix)]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        use std::os::unix::fs::MetadataExt;
+        lalrpop_metadata.mtime() >= rs_metadata.mtime()
+    }
+
+    #[cfg(windows)]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        use std::os::windows::fs::MetadataExt;
+        lalrpop_metadata.last_write_time() >= rs_metadata.last_write_time()
+    }
+
+    #[cfg(not(any(unix, windows)))]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        true
+    }
+
+    fn compare_lalrpop_version(rs_file: &Path) -> io::Result<bool> {
+        let mut input_str = String::new();
+        let mut f = io::BufReader::new(try!(fs::File::open(&rs_file)));
+        try!(f.read_line(&mut input_str));
+
+        Ok(input_str.trim() != LALRPOP_VERSION_HEADER)
+    }
+}
+
+fn make_read_only(rs_file: &Path, ro: bool) -> io::Result<()> {
+    if rs_file.is_file() {
+        let rs_metadata = try!(fs::metadata(&rs_file));
+        let mut rs_permissions = rs_metadata.permissions();
+        rs_permissions.set_readonly(ro);
+        fs::set_permissions(&rs_file, rs_permissions)
+    } else {
+        Ok(())
+    }
+}
+
+fn lalrpop_files<P: AsRef<Path>>(root_dir: P) -> io::Result<Vec<PathBuf>> {
+    let mut result = vec![];
+    for entry in try!(fs::read_dir(root_dir)) {
+        let entry = try!(entry);
+        let file_type = try!(entry.file_type());
+
+        let path = entry.path();
+
+        if file_type.is_dir() {
+            result.extend(try!(lalrpop_files(&path)));
+        }
+
+        if file_type.is_file() && path.extension().is_some()
+            && path.extension().unwrap() == "lalrpop"
+        {
+            result.push(path);
+        }
+    }
+    Ok(result)
+}
+
+fn parse_and_normalize_grammar(session: &Session, file_text: &FileText) -> io::Result<r::Grammar> {
+    let grammar = match parser::parse_grammar(file_text.text()) {
+        Ok(grammar) => grammar,
+
+        Err(ParseError::InvalidToken { location }) => {
+            let ch = file_text.text()[location..].chars().next().unwrap();
+            report_error(
+                &file_text,
+                pt::Span(location, location),
+                &format!("invalid character `{}`", ch),
+            );
+        }
+
+        Err(ParseError::UnrecognizedToken {
+            token: None,
+            expected: _,
+        }) => {
+            let len = file_text.text().len();
+            report_error(
+                &file_text,
+                pt::Span(len, len),
+                &format!("unexpected end of file"),
+            );
+        }
+
+        Err(ParseError::UnrecognizedToken {
+            token: Some((lo, _, hi)),
+            expected,
+        }) => {
+            let _ = expected; // didn't implement this yet :)
+            let text = &file_text.text()[lo..hi];
+            report_error(
+                &file_text,
+                pt::Span(lo, hi),
+                &format!("unexpected token: `{}`", text),
+            );
+        }
+
+        Err(ParseError::ExtraToken { token: (lo, _, hi) }) => {
+            let text = &file_text.text()[lo..hi];
+            report_error(
+                &file_text,
+                pt::Span(lo, hi),
+                &format!("extra token at end of input: `{}`", text),
+            );
+        }
+
+        Err(ParseError::User { error }) => {
+            let string = match error.code {
+                tok::ErrorCode::UnrecognizedToken => "unrecognized token",
+                tok::ErrorCode::UnterminatedEscape => "unterminated escape; missing '`'?",
+                tok::ErrorCode::UnterminatedStringLiteral => {
+                    "unterminated string literal; missing `\"`?"
+                }
+                tok::ErrorCode::UnterminatedCharacterLiteral => {
+                    "unterminated character literal; missing `'`?"
+                }
+                tok::ErrorCode::UnterminatedAttribute => "unterminated #! attribute; missing `]`?",
+                tok::ErrorCode::ExpectedStringLiteral => "expected string literal; missing `\"`?",
+                tok::ErrorCode::UnterminatedCode => {
+                    "unterminated code block; perhaps a missing `;`, `)`, `]` or `}`?"
+                }
+            };
+
+            report_error(
+                &file_text,
+                pt::Span(error.location, error.location + 1),
+                string,
+            )
+        }
+    };
+
+    match normalize::normalize(session, grammar) {
+        Ok(grammar) => Ok(grammar),
+        Err(error) => report_error(&file_text, error.span, &error.message),
+    }
+}
+
+fn report_error(file_text: &FileText, span: pt::Span, message: &str) -> ! {
+    println!("{} error: {}", file_text.span_str(span), message);
+
+    let out = io::stderr();
+    let mut out = out.lock();
+    file_text.highlight(span, &mut out).unwrap();
+
+    exit(1);
+}
+
+fn report_messages(messages: Vec<Message>) -> term::Result<()> {
+    let builder = InlineBuilder::new().begin_paragraphs();
+    let builder = messages
+        .into_iter()
+        .fold(builder, |b, m| b.push(Box::new(m)));
+    let content = builder.end().end();
+    report_content(&*content)
+}
+
+fn report_content(content: &Content) -> term::Result<()> {
+    // FIXME -- can we query the size of the terminal somehow?
+    let canvas = content.emit_to_canvas(80);
+
+    let try_colors = match Tls::session().color_config {
+        ColorConfig::Yes => true,
+        ColorConfig::No => false,
+        ColorConfig::IfTty => atty::is(),
+    };
+
+    if try_colors {
+        if let Some(mut stdout) = term::stdout() {
+            return canvas.write_to(&mut *stdout);
+        }
+    }
+
+    let stdout = io::stdout();
+    let mut stdout = FakeTerminal::new(stdout.lock());
+    canvas.write_to(&mut stdout)
+}
+
+fn emit_module_attributes<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+) -> io::Result<()> {
+    rust.write_module_attributes(grammar)
+}
+
+fn emit_uses<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    rust.write_uses("", grammar)
+}
+
+fn emit_recursive_ascent(
+    session: &Session,
+    grammar: &r::Grammar,
+    report_file: &Path,
+) -> io::Result<Vec<u8>> {
+    let mut rust = RustWrite::new(vec![]);
+
+    // We generate a module structure like this:
+    //
+    // ```
+    // mod <output-file> {
+    //     // For each public symbol:
+    //     pub fn parse_XYZ();
+    //     mod __XYZ { ... }
+    //
+    //     // For each bit of action code:
+    //     <action-code>
+    // }
+    // ```
+    //
+    // Note that the action code goes in the outer module.  This is
+    // intentional because it means that the foo.lalrpop file serves
+    // as a module in the rust hierarchy, so if the action code
+    // includes things like `super::` it will resolve in the natural
+    // way.
+
+    try!(emit_module_attributes(grammar, &mut rust));
+    try!(emit_uses(grammar, &mut rust));
+
+    if grammar.start_nonterminals.is_empty() {
+        println!("Error: no public symbols declared in grammar");
+        exit(1);
+    }
+
+    for (user_nt, start_nt) in &grammar.start_nonterminals {
+        // We generate these, so there should always be exactly 1
+        // production. Otherwise the LR(1) algorithm doesn't know
+        // where to stop!
+        assert_eq!(grammar.productions_for(start_nt).len(), 1);
+
+        log!(
+            session,
+            Verbose,
+            "Building states for public nonterminal `{}`",
+            user_nt
+        );
+
+        let _lr1_tls = lr1::Lr1Tls::install(grammar.terminals.clone());
+
+        let lr1result = lr1::build_states(&grammar, start_nt.clone());
+        if session.emit_report {
+            let mut output_report_file = try!(fs::File::create(&report_file));
+            try!(lr1::generate_report(&mut output_report_file, &lr1result));
+        }
+
+        let states = match lr1result {
+            Ok(states) => states,
+            Err(error) => {
+                let messages = lr1::report_error(&grammar, &error);
+                let _ = report_messages(messages);
+                exit(1) // FIXME -- propagate up instead of calling `exit`
+            }
+        };
+
+        match grammar.algorithm.codegen {
+            r::LrCodeGeneration::RecursiveAscent => try!(lr1::codegen::ascent::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                "super",
+                &mut rust,
+            )),
+            r::LrCodeGeneration::TableDriven => try!(lr1::codegen::parse_table::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                "super",
+                &mut rust,
+            )),
+
+            r::LrCodeGeneration::TestAll => try!(lr1::codegen::test_all::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                &mut rust,
+            )),
+        }
+
+        rust!(
+            rust,
+            "{}use self::{}parse{}::{}Parser;",
+            grammar.nonterminals[&user_nt].visibility,
+            grammar.prefix,
+            start_nt,
+            user_nt
+        );
+    }
+
+    if let Some(ref intern_token) = grammar.intern_token {
+        try!(intern_token::compile(&grammar, intern_token, &mut rust));
+        rust!(rust, "pub use self::{}intern_token::Token;", grammar.prefix);
+    }
+
+    try!(action::emit_action_code(grammar, &mut rust));
+
+    try!(emit_to_triple_trait(grammar, &mut rust));
+
+    Ok(rust.into_inner())
+}
+
+fn emit_to_triple_trait<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    #![allow(non_snake_case)]
+
+    let L = grammar.types.terminal_loc_type();
+    let T = grammar.types.terminal_token_type();
+    let E = grammar.types.error_type();
+
+    let mut user_type_parameters = String::new();
+    for type_parameter in &grammar.type_parameters {
+        user_type_parameters.push_str(&format!("{}, ", type_parameter));
+    }
+
+    rust!(rust, "");
+    rust!(
+        rust,
+        "pub trait {}ToTriple<{}> {{",
+        grammar.prefix,
+        user_type_parameters,
+    );
+    rust!(rust, "type Error;");
+    rust!(
+        rust,
+        "fn to_triple(value: Self) -> Result<({},{},{}),Self::Error>;",
+        L,
+        T,
+        L,
+    );
+    rust!(rust, "}}");
+
+    rust!(rust, "");
+    if grammar.types.opt_terminal_loc_type().is_some() {
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for ({}, {}, {}) {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            L,
+            T,
+            L,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<({},{},{}),{}> {{",
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "Ok(value)");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for Result<({}, {}, {}),{}> {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<({},{},{}),{}> {{",
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "value");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+    } else {
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for {} {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            T,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<((),{},()),{}> {{",
+            T,
+            E,
+        );
+        rust!(rust, "Ok(((), value, ()))");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for Result<({}),{}> {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            T,
+            E,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<((),{},()),{}> {{",
+            T,
+            E,
+        );
+        rust!(rust, "value.map(|v| ((), v, ()))");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+    }
+
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/collections/map.rs
@@ -0,0 +1,15 @@
+use std::collections::BTreeMap;
+
+pub use std::collections::btree_map::Entry;
+
+/// In general, we avoid coding directly against any particular map,
+/// but rather build against `util::Map` (and `util::map` to construct
+/// an instance). This should be a deterministic map, such that two
+/// runs of LALRPOP produce the same output, but otherwise it doesn't
+/// matter much. I'd probably prefer to use `HashMap` with an
+/// alternative hasher, but that's not stable.
+pub type Map<K, V> = BTreeMap<K, V>;
+
+pub fn map<K: Ord, V>() -> Map<K, V> {
+    Map::<K, V>::default()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/collections/mod.rs
@@ -0,0 +1,7 @@
+mod map;
+mod multimap;
+mod set;
+
+pub use self::map::{map, Entry, Map};
+pub use self::multimap::{Collection, Multimap};
+pub use self::set::{set, Set};
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/collections/multimap.rs
@@ -0,0 +1,140 @@
+use std::collections::btree_map;
+use std::default::Default;
+use std::iter::FromIterator;
+
+use super::map::{map, Map};
+use super::set::Set;
+
+pub struct Multimap<K, C: Collection> {
+    map: Map<K, C>,
+}
+
+pub trait Collection: Default {
+    type Item;
+
+    /// Push `item` into the collection and return `true` if
+    /// collection changed.
+    fn push(&mut self, item: Self::Item) -> bool;
+}
+
+impl<K: Ord, C: Collection> Multimap<K, C> {
+    pub fn new() -> Multimap<K, C> {
+        Multimap { map: map() }
+    }
+
+    pub fn is_empty(&self) -> bool {
+        self.map.is_empty()
+    }
+
+    /// Push `value` to the collection associated with `key`. Returns
+    /// true if the collection was changed from the default.
+    pub fn push(&mut self, key: K, value: C::Item) -> bool {
+        let mut inserted = false;
+        let pushed = self.map
+            .entry(key)
+            .or_insert_with(|| {
+                inserted = true;
+                C::default()
+            })
+            .push(value);
+        inserted || pushed
+    }
+
+    pub fn get(&self, key: &K) -> Option<&C> {
+        self.map.get(key)
+    }
+
+    pub fn iter(&self) -> btree_map::Iter<K, C> {
+        self.map.iter()
+    }
+
+    pub fn into_iter(self) -> btree_map::IntoIter<K, C> {
+        self.map.into_iter()
+    }
+}
+
+impl<K: Ord, C: Collection> IntoIterator for Multimap<K, C> {
+    type Item = (K, C);
+    type IntoIter = btree_map::IntoIter<K, C>;
+    fn into_iter(self) -> btree_map::IntoIter<K, C> {
+        self.into_iter()
+    }
+}
+
+impl<'iter, K: Ord, C: Collection> IntoIterator for &'iter Multimap<K, C> {
+    type Item = (&'iter K, &'iter C);
+    type IntoIter = btree_map::Iter<'iter, K, C>;
+    fn into_iter(self) -> btree_map::Iter<'iter, K, C> {
+        self.iter()
+    }
+}
+
+impl<K: Ord, C: Collection> FromIterator<(K, C::Item)> for Multimap<K, C> {
+    fn from_iter<T>(iterator: T) -> Self
+    where
+        T: IntoIterator<Item = (K, C::Item)>,
+    {
+        let mut map = Multimap::new();
+        for (key, value) in iterator {
+            map.push(key, value);
+        }
+        map
+    }
+}
+
+impl Collection for () {
+    type Item = ();
+    fn push(&mut self, _item: ()) -> bool {
+        false
+    }
+}
+
+impl<T> Collection for Vec<T> {
+    type Item = T;
+
+    fn push(&mut self, item: T) -> bool {
+        self.push(item);
+        true // always changes
+    }
+}
+
+impl<T: Ord> Collection for Set<T> {
+    type Item = T;
+
+    fn push(&mut self, item: T) -> bool {
+        self.insert(item)
+    }
+}
+
+impl<K: Ord, C: Collection> Default for Multimap<K, C> {
+    fn default() -> Self {
+        Multimap::new()
+    }
+}
+
+impl<K: Ord, C: Collection<Item = I>, I> Collection for Multimap<K, C> {
+    type Item = (K, I);
+
+    fn push(&mut self, item: (K, I)) -> bool {
+        let (key, value) = item;
+        self.push(key, value)
+    }
+}
+
+#[test]
+fn push() {
+    let mut m: Multimap<u32, Set<char>> = Multimap::new();
+    assert!(m.push(0, 'a'));
+    assert!(m.push(0, 'b'));
+    assert!(!m.push(0, 'b'));
+    assert!(m.push(1, 'a'));
+}
+
+#[test]
+fn push_nil() {
+    let mut m: Multimap<u32, ()> = Multimap::new();
+    assert!(m.push(0, ()));
+    assert!(!m.push(0, ()));
+    assert!(m.push(1, ()));
+    assert!(!m.push(0, ()));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/collections/set.rs
@@ -0,0 +1,8 @@
+use std::collections::BTreeSet;
+
+/// As `Map`, but for sets.
+pub type Set<K> = BTreeSet<K>;
+
+pub fn set<K: Ord>() -> Set<K> {
+    Set::<K>::default()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/file_text.rs
@@ -0,0 +1,144 @@
+use grammar::parse_tree as pt;
+use std::fmt::{Display, Error, Formatter};
+use std::fs::File;
+use std::path::PathBuf;
+use std::io::{self, Read, Write};
+
+pub struct FileText {
+    path: PathBuf,
+    input_str: String,
+    newlines: Vec<usize>,
+}
+
+impl FileText {
+    pub fn from_path(path: PathBuf) -> io::Result<FileText> {
+        let mut input_str = String::new();
+        let mut f = try!(File::open(&path));
+        try!(f.read_to_string(&mut input_str));
+        Ok(FileText::new(path, input_str))
+    }
+
+    pub fn new(path: PathBuf, input_str: String) -> FileText {
+        let newline_indices: Vec<usize> = {
+            let input_indices = input_str
+                .as_bytes()
+                .iter()
+                .enumerate()
+                .filter(|&(_, &b)| b == ('\n' as u8))
+                .map(|(i, _)| i + 1); // index of first char in the line
+            Some(0).into_iter().chain(input_indices).collect()
+        };
+
+        FileText {
+            path: path,
+            input_str: input_str,
+            newlines: newline_indices,
+        }
+    }
+
+    #[cfg(test)]
+    pub fn test() -> FileText {
+        Self::new(PathBuf::from("test.lalrpop"), String::from(""))
+    }
+
+    pub fn text(&self) -> &String {
+        &self.input_str
+    }
+
+    pub fn span_str(&self, span: pt::Span) -> String {
+        let (start_line, start_col) = self.line_col(span.0);
+        let (end_line, end_col) = self.line_col(span.1);
+        format!(
+            "{}:{}:{}: {}:{}",
+            self.path.display(),
+            start_line + 1,
+            start_col + 1,
+            end_line + 1,
+            end_col
+        )
+    }
+
+    fn line_col(&self, pos: usize) -> (usize, usize) {
+        let num_lines = self.newlines.len();
+        let line = (0..num_lines)
+            .filter(|&i| self.newlines[i] > pos)
+            .map(|i| i - 1)
+            .next()
+            .unwrap_or(num_lines - 1);
+
+        // offset of the first character in `line`
+        let line_offset = self.newlines[line];
+
+        // find the column; use `saturating_sub` in case `pos` is the
+        // newline itself, which we'll call column 0
+        let col = pos - line_offset;
+
+        (line, col)
+    }
+
+    fn line_text(&self, line_num: usize) -> &str {
+        let start_offset = self.newlines[line_num];
+        if line_num == self.newlines.len() - 1 {
+            &self.input_str[start_offset..]
+        } else {
+            let end_offset = self.newlines[line_num + 1];
+            &self.input_str[start_offset..end_offset - 1]
+        }
+    }
+
+    pub fn highlight(&self, span: pt::Span, out: &mut Write) -> io::Result<()> {
+        let (start_line, start_col) = self.line_col(span.0);
+        let (end_line, end_col) = self.line_col(span.1);
+
+        // (*) use `saturating_sub` since the start line could be the newline
+        // itself, in which case we'll call it column zero
+
+        // span is within one line:
+        if start_line == end_line {
+            let text = self.line_text(start_line);
+            try!(writeln!(out, "  {}", text));
+
+            if end_col - start_col <= 1 {
+                try!(writeln!(out, "  {}^", Repeat(' ', start_col)));
+            } else {
+                let width = end_col - start_col;
+                try!(writeln!(
+                    out,
+                    "  {}~{}~",
+                    Repeat(' ', start_col),
+                    Repeat('~', width.saturating_sub(2))
+                ));
+            }
+        } else {
+            // span is across many lines, find the maximal width of any of those
+            let line_strs: Vec<_> = (start_line..end_line + 1)
+                .map(|i| self.line_text(i))
+                .collect();
+            let max_len = line_strs.iter().map(|l| l.len()).max().unwrap();
+            try!(writeln!(
+                out,
+                "  {}{}~+",
+                Repeat(' ', start_col),
+                Repeat('~', max_len - start_col)
+            ));
+            for line in &line_strs[..line_strs.len() - 1] {
+                try!(writeln!(out, "| {0:<1$} |", line, max_len));
+            }
+            try!(writeln!(out, "| {}", line_strs[line_strs.len() - 1]));
+            try!(writeln!(out, "+~{}", Repeat('~', end_col)));
+        }
+
+        Ok(())
+    }
+}
+
+struct Repeat(char, usize);
+
+impl Display for Repeat {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        for _ in 0..self.1 {
+            try!(write!(fmt, "{}", self.0));
+        }
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/generate.rs
@@ -0,0 +1,78 @@
+//! Generate valid parse trees.
+
+use grammar::repr::*;
+use rand::{self, Rng};
+use std::iter::Iterator;
+
+#[derive(PartialEq, Eq)]
+pub enum ParseTree {
+    Nonterminal(NonterminalString, Vec<ParseTree>),
+    Terminal(TerminalString),
+}
+
+pub fn random_parse_tree(grammar: &Grammar, symbol: NonterminalString) -> ParseTree {
+    let mut gen = Generator {
+        grammar: grammar,
+        rng: rand::thread_rng(),
+        depth: 0,
+    };
+    loop {
+        // sometimes, the random walk overflows the stack, so we have a max, and if
+        // it is exceeded, we just try again
+        if let Some(result) = gen.nonterminal(symbol.clone()) {
+            return result;
+        }
+        gen.depth = 0;
+    }
+}
+
+struct Generator<'grammar> {
+    grammar: &'grammar Grammar,
+    rng: rand::ThreadRng,
+    depth: u32,
+}
+
+const MAX_DEPTH: u32 = 10000;
+
+impl<'grammar> Generator<'grammar> {
+    fn nonterminal(&mut self, nt: NonterminalString) -> Option<ParseTree> {
+        if self.depth > MAX_DEPTH {
+            return None;
+        }
+
+        self.depth += 1;
+        let productions = self.grammar.productions_for(&nt);
+        let index: usize = self.rng.gen_range(0, productions.len());
+        let production = &productions[index];
+        let trees: Option<Vec<_>> = production
+            .symbols
+            .iter()
+            .map(|sym| self.symbol(sym.clone()))
+            .collect();
+        trees.map(|trees| ParseTree::Nonterminal(nt, trees))
+    }
+
+    fn symbol(&mut self, symbol: Symbol) -> Option<ParseTree> {
+        match symbol {
+            Symbol::Nonterminal(nt) => self.nonterminal(nt),
+            Symbol::Terminal(t) => Some(ParseTree::Terminal(t)),
+        }
+    }
+}
+
+impl ParseTree {
+    pub fn terminals(&self) -> Vec<TerminalString> {
+        let mut vec = vec![];
+        self.push_terminals(&mut vec);
+        vec
+    }
+
+    fn push_terminals(&self, vec: &mut Vec<TerminalString>) {
+        match *self {
+            ParseTree::Terminal(ref s) => vec.push(s.clone()),
+            ParseTree::Nonterminal(_, ref trees) => for tree in trees {
+                tree.push_terminals(vec);
+            },
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/consts.rs
@@ -0,0 +1,26 @@
+/// Recognized associated type for the token location
+pub const LOCATION: &'static str = "Location";
+
+/// Recognized associated type for custom errors
+pub const ERROR: &'static str = "Error";
+
+/// The lifetime parameter injected when we do not have an external token enum
+pub const INPUT_LIFETIME: &'static str = "'input";
+
+/// The parameter injected when we do not have an external token enum
+pub const INPUT_PARAMETER: &'static str = "input";
+
+/// The annotation to request inlining.
+pub const INLINE: &'static str = "inline";
+
+/// Annotation to request LALR.
+pub const LALR: &'static str = "LALR";
+
+/// Annotation to request recursive-ascent-style code generation.
+pub const TABLE_DRIVEN: &'static str = "table_driven";
+
+/// Annotation to request recursive-ascent-style code generation.
+pub const RECURSIVE_ASCENT: &'static str = "recursive_ascent";
+
+/// Annotation to request test-all-style code generation.
+pub const TEST_ALL: &'static str = "test_all";
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/mod.rs
@@ -0,0 +1,7 @@
+//! The grammar definition.
+
+pub mod consts;
+pub mod parse_tree;
+pub mod pattern;
+pub mod repr;
+// pub mod token;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/parse_tree.rs
@@ -0,0 +1,1103 @@
+//! The "parse-tree" is what is produced by the parser. We use it do
+//! some pre-expansion and so forth before creating the proper AST.
+
+use string_cache::DefaultAtom as Atom;
+use lexer::dfa::DFA;
+use grammar::consts::{LALR, RECURSIVE_ASCENT, TABLE_DRIVEN, TEST_ALL};
+use grammar::repr::{self as r, NominalTypeRepr, TypeRepr};
+use grammar::pattern::Pattern;
+use message::Content;
+use message::builder::InlineBuilder;
+use std::fmt::{Debug, Display, Error, Formatter};
+use tls::Tls;
+use util::Sep;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Grammar {
+    // see field `prefix` in `grammar::repr::Grammar`
+    pub prefix: String,
+    pub span: Span,
+    pub type_parameters: Vec<TypeParameter>,
+    pub parameters: Vec<Parameter>,
+    pub where_clauses: Vec<WhereClause<TypeRef>>,
+    pub items: Vec<GrammarItem>,
+    pub annotations: Vec<Annotation>,
+    pub module_attributes: Vec<String>,
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Span(pub usize, pub usize);
+
+impl Into<Box<Content>> for Span {
+    fn into(self) -> Box<Content> {
+        let file_text = Tls::file_text();
+        let string = file_text.span_str(self);
+
+        // Insert an Adjacent block to prevent wrapping inside this
+        // string:
+        InlineBuilder::new()
+            .begin_adjacent()
+            .text(string)
+            .end()
+            .end()
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum GrammarItem {
+    MatchToken(MatchToken),
+    ExternToken(ExternToken),
+    InternToken(InternToken),
+    Nonterminal(NonterminalData),
+    Use(String),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MatchToken {
+    pub contents: Vec<MatchContents>,
+    pub span: Span,
+}
+
+impl MatchToken {
+    pub fn new(contents: MatchContents, span: Span) -> MatchToken {
+        MatchToken {
+            contents: vec![contents],
+            span: span,
+        }
+    }
+
+    // Not really sure if this is the best way to do it
+    pub fn add(self, contents: MatchContents) -> MatchToken {
+        let mut new_contents = self.contents.clone();
+        new_contents.push(contents);
+        MatchToken {
+            contents: new_contents,
+            span: self.span,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MatchContents {
+    pub items: Vec<MatchItem>,
+}
+
+// FIXME: Validate that MatchSymbol is actually a TerminalString::Literal
+//          and that MatchMapping is an Id or String
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum MatchItem {
+    CatchAll(Span),
+    Unmapped(MatchSymbol, Span),
+    Mapped(MatchSymbol, MatchMapping, Span),
+}
+
+impl MatchItem {
+    pub fn is_catch_all(&self) -> bool {
+        match *self {
+            MatchItem::CatchAll(_) => true,
+            _ => false,
+        }
+    }
+
+    pub fn span(&self) -> Span {
+        match *self {
+            MatchItem::CatchAll(span) => span,
+            MatchItem::Unmapped(_, span) => span,
+            MatchItem::Mapped(_, _, span) => span,
+        }
+    }
+}
+
+pub type MatchSymbol = TerminalLiteral;
+pub type MatchMapping = TerminalString;
+
+/// Intern tokens are not typed by the user: they are synthesized in
+/// the absence of an "extern" declaration with information about the
+/// string literals etc that appear in the grammar.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct InternToken {
+    /// Set of `r"foo"` and `"foo"` literals extracted from the
+    /// grammar. Sorted by order of increasing precedence.
+    pub match_entries: Vec<MatchEntry>,
+    pub dfa: DFA,
+}
+
+/// In `token_check`, as we prepare to generate a tokenizer, we
+/// combine any `match` declaration the user may have given with the
+/// set of literals (e.g. `"foo"` or `r"[a-z]"`) that appear elsewhere
+/// in their in the grammar to produce a series of `MatchEntry`. Each
+/// `MatchEntry` roughly corresponds to one line in a `match` declaration.
+///
+/// So e.g. if you had
+///
+/// ```
+/// match {
+///    r"(?i)BEGIN" => "BEGIN",
+///    "+" => "+",
+/// } else {
+///    _
+/// }
+///
+/// ID = r"[a-zA-Z]+"
+/// ```
+///
+/// This would correspond to three match entries:
+/// - `MatchEntry { match_literal: r"(?i)BEGIN", user_name: "BEGIN", precedence: 2 }`
+/// - `MatchEntry { match_literal: "+", user_name: "+", precedence: 3 }`
+/// - `MatchEntry { match_literal: "r[a-zA-Z]+"", user_name: r"[a-zA-Z]+", precedence: 0 }`
+///
+/// A couple of things to note:
+///
+/// - Literals appearing in the grammar are converting into an "identity" mapping
+/// - Each match group G is combined with the implicit priority IP of 1 for literals and 0 for
+///   regex to yield the final precedence; the formula is `G*2 + IP`.
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct MatchEntry {
+    /// The precedence of this match entry.
+    ///
+    /// NB: This field must go first, so that `PartialOrd` sorts by precedence first!
+    pub precedence: usize,
+    pub match_literal: TerminalLiteral,
+    pub user_name: TerminalString,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ExternToken {
+    pub span: Span,
+    pub associated_types: Vec<AssociatedType>,
+    pub enum_token: Option<EnumToken>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct AssociatedType {
+    pub type_span: Span,
+    pub type_name: Atom,
+    pub type_ref: TypeRef,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct EnumToken {
+    pub type_name: TypeRef,
+    pub type_span: Span,
+    pub conversions: Vec<Conversion>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Conversion {
+    pub span: Span,
+    pub from: TerminalString,
+    pub to: Pattern<TypeRef>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Path {
+    pub absolute: bool,
+    pub ids: Vec<Atom>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum TypeRef {
+    // (T1, T2)
+    Tuple(Vec<TypeRef>),
+
+    // Foo<'a, 'b, T1, T2>, Foo::Bar, etc
+    Nominal {
+        path: Path,
+        types: Vec<TypeRef>,
+    },
+
+    Ref {
+        lifetime: Option<Atom>,
+        mutable: bool,
+        referent: Box<TypeRef>,
+    },
+
+    // 'x ==> only should appear within nominal types, but what do we care
+    Lifetime(Atom),
+
+    // Foo or Bar ==> treated specially since macros may care
+    Id(Atom),
+
+    // <N> ==> type of a nonterminal, emitted by macro expansion
+    OfSymbol(SymbolKind),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum WhereClause<T> {
+    // 'a: 'b + 'c
+    Lifetime {
+        lifetime: Atom,
+        bounds: Vec<Atom>,
+    },
+    // where for<'a> &'a T: Debug + Into<usize>
+    Type {
+        forall: Option<Vec<Atom>>,
+        ty: T,
+        bounds: Vec<TypeBound<T>>,
+    },
+}
+
+impl<T> WhereClause<T> {
+    pub fn map<F, U>(&self, mut f: F) -> WhereClause<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            WhereClause::Lifetime {
+                ref lifetime,
+                ref bounds,
+            } => WhereClause::Lifetime {
+                lifetime: lifetime.clone(),
+                bounds: bounds.clone(),
+            },
+            WhereClause::Type {
+                ref forall,
+                ref ty,
+                ref bounds,
+            } => WhereClause::Type {
+                forall: forall.clone(),
+                ty: f(ty),
+                bounds: bounds.iter().map(|b| b.map(&mut f)).collect(),
+            },
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeBound<T> {
+    // The `'a` in `T: 'a`.
+    Lifetime(Atom),
+    // `for<'a> FnMut(&'a usize)`
+    Fn {
+        forall: Option<Vec<Atom>>,
+        path: Path,
+        parameters: Vec<T>,
+        ret: Option<T>,
+    },
+    // `some::Trait` or `some::Trait<Param, ...>` or `some::Trait<Item = Assoc>`
+    // or `for<'a> Trait<'a, T>`
+    Trait {
+        forall: Option<Vec<Atom>>,
+        path: Path,
+        parameters: Vec<TypeBoundParameter<T>>,
+    },
+}
+
+impl<T> TypeBound<T> {
+    pub fn map<F, U>(&self, mut f: F) -> TypeBound<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            TypeBound::Lifetime(ref l) => TypeBound::Lifetime(l.clone()),
+            TypeBound::Fn {
+                ref forall,
+                ref path,
+                ref parameters,
+                ref ret,
+            } => TypeBound::Fn {
+                forall: forall.clone(),
+                path: path.clone(),
+                parameters: parameters.iter().map(&mut f).collect(),
+                ret: ret.as_ref().map(f),
+            },
+            TypeBound::Trait {
+                ref forall,
+                ref path,
+                ref parameters,
+            } => TypeBound::Trait {
+                forall: forall.clone(),
+                path: path.clone(),
+                parameters: parameters.iter().map(|p| p.map(&mut f)).collect(),
+            },
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeBoundParameter<T> {
+    // 'a
+    Lifetime(Atom),
+    // `T` or `'a`
+    TypeParameter(T),
+    // `Item = T`
+    Associated(Atom, T),
+}
+
+impl<T> TypeBoundParameter<T> {
+    pub fn map<F, U>(&self, mut f: F) -> TypeBoundParameter<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            TypeBoundParameter::Lifetime(ref l) => TypeBoundParameter::Lifetime(l.clone()),
+            TypeBoundParameter::TypeParameter(ref t) => TypeBoundParameter::TypeParameter(f(t)),
+            TypeBoundParameter::Associated(ref id, ref t) => {
+                TypeBoundParameter::Associated(id.clone(), f(t))
+            }
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub enum TypeParameter {
+    Lifetime(Atom),
+    Id(Atom),
+}
+
+impl TypeParameter {
+    pub fn is_lifetime(&self) -> bool {
+        match *self {
+            TypeParameter::Lifetime(_) => true,
+            _ => false,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Parameter {
+    pub name: Atom,
+    pub ty: TypeRef,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Visibility {
+    Pub(Option<Path>),
+    Priv,
+}
+
+impl Visibility {
+    pub fn is_pub(&self) -> bool {
+        match *self {
+            Visibility::Pub(_) => true,
+            Visibility::Priv => false,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct NonterminalData {
+    pub visibility: Visibility,
+    pub name: NonterminalString,
+    pub annotations: Vec<Annotation>,
+    pub span: Span,
+    pub args: Vec<NonterminalString>, // macro arguments
+    pub type_decl: Option<TypeRef>,
+    pub alternatives: Vec<Alternative>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Annotation {
+    pub id_span: Span,
+    pub id: Atom,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Alternative {
+    pub span: Span,
+
+    pub expr: ExprSymbol,
+
+    // if C, only legal in macros
+    pub condition: Option<Condition>,
+
+    // => { code }
+    pub action: Option<ActionKind>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ActionKind {
+    User(String),
+    Fallible(String),
+    Lookahead,
+    Lookbehind,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Condition {
+    pub span: Span,
+    pub lhs: NonterminalString, // X
+    pub rhs: Atom,              // "Foo"
+    pub op: ConditionOp,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ConditionOp {
+    // X == "Foo", equality
+    Equals,
+
+    // X != "Foo", inequality
+    NotEquals,
+
+    // X ~~ "Foo", regexp match
+    Match,
+
+    // X !~ "Foo", regexp non-match
+    NotMatch,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Symbol {
+    pub span: Span,
+    pub kind: SymbolKind,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum SymbolKind {
+    // (X Y)
+    Expr(ExprSymbol),
+
+    // foo, before name resolution
+    AmbiguousId(Atom),
+
+    // "foo" and foo (after name resolution)
+    Terminal(TerminalString),
+
+    // foo, after name resolution
+    Nonterminal(NonterminalString),
+
+    // foo<..>
+    Macro(MacroSymbol),
+
+    // X+, X?, X*
+    Repeat(Box<RepeatSymbol>),
+
+    // <X>
+    Choose(Box<Symbol>),
+
+    // x:X
+    Name(Atom, Box<Symbol>),
+
+    // @L
+    Lookahead,
+
+    // @R
+    Lookbehind,
+
+    Error,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TerminalString {
+    Literal(TerminalLiteral),
+    Bare(Atom),
+    Error,
+}
+
+impl TerminalString {
+    pub fn as_literal(&self) -> Option<TerminalLiteral> {
+        match *self {
+            TerminalString::Literal(ref l) => Some(l.clone()),
+            _ => None,
+        }
+    }
+
+    pub fn display_len(&self) -> usize {
+        match *self {
+            TerminalString::Literal(ref x) => x.display_len(),
+            TerminalString::Bare(ref x) => x.len(),
+            TerminalString::Error => "error".len(),
+        }
+    }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TerminalLiteral {
+    Quoted(Atom),
+    Regex(Atom),
+}
+
+impl TerminalLiteral {
+    /// The *base precedence* is the precedence within a `match { }`
+    /// block level. It indicates that quoted things like `"foo"` get
+    /// precedence over regex matches.
+    pub fn base_precedence(&self) -> usize {
+        match *self {
+            TerminalLiteral::Quoted(_) => 1,
+            TerminalLiteral::Regex(_) => 0,
+        }
+    }
+
+    pub fn display_len(&self) -> usize {
+        match *self {
+            TerminalLiteral::Quoted(ref x) => x.len(),
+            TerminalLiteral::Regex(ref x) => x.len() + "####r".len(),
+        }
+    }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NonterminalString(pub Atom);
+
+impl NonterminalString {
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+}
+
+impl Into<Box<Content>> for NonterminalString {
+    fn into(self) -> Box<Content> {
+        let session = Tls::session();
+
+        InlineBuilder::new()
+            .text(self)
+            .styled(session.nonterminal_symbol)
+            .end()
+    }
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum RepeatOp {
+    Star,
+    Plus,
+    Question,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct RepeatSymbol {
+    pub op: RepeatOp,
+    pub symbol: Symbol,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ExprSymbol {
+    pub symbols: Vec<Symbol>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MacroSymbol {
+    pub name: NonterminalString,
+    pub args: Vec<Symbol>,
+}
+
+impl TerminalString {
+    pub fn quoted(i: Atom) -> TerminalString {
+        TerminalString::Literal(TerminalLiteral::Quoted(i))
+    }
+
+    pub fn regex(i: Atom) -> TerminalString {
+        TerminalString::Literal(TerminalLiteral::Regex(i))
+    }
+}
+
+impl Into<Box<Content>> for TerminalString {
+    fn into(self) -> Box<Content> {
+        let session = Tls::session();
+        InlineBuilder::new()
+            .text(self)
+            .styled(session.terminal_symbol)
+            .end()
+    }
+}
+
+impl Grammar {
+    pub fn extern_token(&self) -> Option<&ExternToken> {
+        self.items.iter().flat_map(|i| i.as_extern_token()).next()
+    }
+
+    pub fn enum_token(&self) -> Option<&EnumToken> {
+        self.items
+            .iter()
+            .flat_map(|i| i.as_extern_token())
+            .flat_map(|et| et.enum_token.as_ref())
+            .next()
+    }
+
+    pub fn intern_token(&self) -> Option<&InternToken> {
+        self.items.iter().flat_map(|i| i.as_intern_token()).next()
+    }
+
+    pub fn match_token(&self) -> Option<&MatchToken> {
+        self.items.iter().flat_map(|i| i.as_match_token()).next()
+    }
+}
+
+impl GrammarItem {
+    pub fn is_macro_def(&self) -> bool {
+        match *self {
+            GrammarItem::Nonterminal(ref d) => d.is_macro_def(),
+            _ => false,
+        }
+    }
+
+    pub fn as_nonterminal(&self) -> Option<&NonterminalData> {
+        match *self {
+            GrammarItem::Nonterminal(ref d) => Some(d),
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_match_token(&self) -> Option<&MatchToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(ref d) => Some(d),
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_extern_token(&self) -> Option<&ExternToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(ref d) => Some(d),
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_intern_token(&self) -> Option<&InternToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(ref d) => Some(d),
+        }
+    }
+}
+
+impl NonterminalData {
+    pub fn is_macro_def(&self) -> bool {
+        !self.args.is_empty()
+    }
+}
+
+impl Symbol {
+    pub fn new(span: Span, kind: SymbolKind) -> Symbol {
+        Symbol {
+            span: span,
+            kind: kind,
+        }
+    }
+
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl Display for Visibility {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Visibility::Pub(Some(ref path)) => write!(fmt, "pub({}) ", path),
+            Visibility::Pub(None) => write!(fmt, "pub "),
+            Visibility::Priv => Ok(()),
+        }
+    }
+}
+
+impl<T: Display> Display for WhereClause<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            WhereClause::Lifetime {
+                ref lifetime,
+                ref bounds,
+            } => {
+                write!(fmt, "{}:", lifetime)?;
+                for (i, b) in bounds.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, " +")?;
+                    }
+                    write!(fmt, " {}", b)?;
+                }
+                Ok(())
+            }
+            WhereClause::Type {
+                ref forall,
+                ref ty,
+                ref bounds,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}: ", ty)?;
+                for (i, b) in bounds.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, " +")?;
+                    }
+                    write!(fmt, " {}", b)?;
+                }
+                Ok(())
+            }
+        }
+    }
+}
+
+impl<T: Display> Display for TypeBound<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeBound::Lifetime(ref l) => write!(fmt, "{}", l),
+            TypeBound::Fn {
+                ref forall,
+                ref path,
+                ref parameters,
+                ref ret,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}(", path)?;
+                for (i, p) in parameters.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, ", ")?;
+                    }
+                    write!(fmt, "{}", p)?;
+                }
+                write!(fmt, ")")?;
+
+                if let Some(ref ret) = *ret {
+                    write!(fmt, " -> {}", ret)?;
+                }
+
+                Ok(())
+            }
+            TypeBound::Trait {
+                ref forall,
+                ref path,
+                ref parameters,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}", path)?;
+                if parameters.is_empty() {
+                    return Ok(());
+                }
+
+                write!(fmt, "<")?;
+                for (i, p) in parameters.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, ", ")?;
+                    }
+                    write!(fmt, "{}", p)?;
+                }
+                write!(fmt, ">")
+            }
+        }
+    }
+}
+
+impl<T: Display> Display for TypeBoundParameter<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeBoundParameter::Lifetime(ref l) => write!(fmt, "{}", l),
+            TypeBoundParameter::TypeParameter(ref t) => write!(fmt, "{}", t),
+            TypeBoundParameter::Associated(ref id, ref t) => write!(fmt, "{} = {}", id, t),
+        }
+    }
+}
+
+impl Display for TerminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TerminalString::Literal(ref s) => write!(fmt, "{}", s),
+            TerminalString::Bare(ref s) => write!(fmt, "{}", s),
+            TerminalString::Error => write!(fmt, "error"),
+        }
+    }
+}
+
+impl Debug for TerminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for TerminalLiteral {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TerminalLiteral::Quoted(ref s) => write!(fmt, "{:?}", s.as_ref()), // the Debug impl adds the `"` and escaping
+            TerminalLiteral::Regex(ref s) => write!(fmt, "r#{:?}#", s.as_ref()), // FIXME -- need to determine proper number of #
+        }
+    }
+}
+
+impl Debug for TerminalLiteral {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self)
+    }
+}
+
+impl Display for Path {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(
+            fmt,
+            "{}{}",
+            if self.absolute { "::" } else { "" },
+            Sep("::", &self.ids),
+        )
+    }
+}
+
+impl Display for NonterminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+impl Debug for NonterminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(&self.kind, fmt)
+    }
+}
+
+impl Display for SymbolKind {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            SymbolKind::Expr(ref expr) => write!(fmt, "{}", expr),
+            SymbolKind::Terminal(ref s) => write!(fmt, "{}", s),
+            SymbolKind::Nonterminal(ref s) => write!(fmt, "{}", s),
+            SymbolKind::AmbiguousId(ref s) => write!(fmt, "{}", s),
+            SymbolKind::Macro(ref m) => write!(fmt, "{}", m),
+            SymbolKind::Repeat(ref r) => write!(fmt, "{}", r),
+            SymbolKind::Choose(ref s) => write!(fmt, "<{}>", s),
+            SymbolKind::Name(ref n, ref s) => write!(fmt, "{}:{}", n, s),
+            SymbolKind::Lookahead => write!(fmt, "@L"),
+            SymbolKind::Lookbehind => write!(fmt, "@R"),
+            SymbolKind::Error => write!(fmt, "error"),
+        }
+    }
+}
+
+impl Display for RepeatSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}{}", self.symbol, self.op)
+    }
+}
+
+impl Display for RepeatOp {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            RepeatOp::Plus => write!(fmt, "+"),
+            RepeatOp::Star => write!(fmt, "*"),
+            RepeatOp::Question => write!(fmt, "?"),
+        }
+    }
+}
+
+impl Display for ExprSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({})", Sep(" ", &self.symbols))
+    }
+}
+
+impl ExternToken {
+    pub fn associated_type(&self, name: Atom) -> Option<&AssociatedType> {
+        self.associated_types
+            .iter()
+            .filter(|a| a.type_name == name)
+            .next()
+    }
+}
+
+impl ExprSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl MacroSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl RepeatSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl Display for MacroSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}<{}>", self.name, Sep(", ", &self.args))
+    }
+}
+
+impl Display for TypeParameter {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeParameter::Lifetime(ref s) => write!(fmt, "{}", s),
+            TypeParameter::Id(ref s) => write!(fmt, "{}", s),
+        }
+    }
+}
+
+impl Display for TypeRef {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeRef::Tuple(ref types) => write!(fmt, "({})", Sep(", ", types)),
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } if types.len() == 0 =>
+            {
+                write!(fmt, "{}", path)
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => write!(fmt, "{}<{}>", path, Sep(", ", types)),
+            TypeRef::Lifetime(ref s) => write!(fmt, "{}", s),
+            TypeRef::Id(ref s) => write!(fmt, "{}", s),
+            TypeRef::OfSymbol(ref s) => write!(fmt, "`{}`", s),
+            TypeRef::Ref {
+                lifetime: None,
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{}", referent),
+            TypeRef::Ref {
+                lifetime: Some(ref l),
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{} {}", l, referent),
+            TypeRef::Ref {
+                lifetime: None,
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&mut {}", referent),
+            TypeRef::Ref {
+                lifetime: Some(ref l),
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&{} mut {}", l, referent),
+        }
+    }
+}
+
+impl TypeRef {
+    // Converts a TypeRef to a TypeRepr, assuming no inference is
+    // required etc. This is safe for all types a user can directly
+    // type, but not safe for the result of expanding macros.
+    pub fn type_repr(&self) -> TypeRepr {
+        match *self {
+            TypeRef::Tuple(ref types) => {
+                TypeRepr::Tuple(types.iter().map(TypeRef::type_repr).collect())
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => TypeRepr::Nominal(NominalTypeRepr {
+                path: path.clone(),
+                types: types.iter().map(TypeRef::type_repr).collect(),
+            }),
+            TypeRef::Lifetime(ref id) => TypeRepr::Lifetime(id.clone()),
+            TypeRef::Id(ref id) => TypeRepr::Nominal(NominalTypeRepr {
+                path: Path::from_id(id.clone()),
+                types: vec![],
+            }),
+            TypeRef::OfSymbol(_) => unreachable!("OfSymbol produced by parser"),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => TypeRepr::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(referent.type_repr()),
+            },
+        }
+    }
+}
+
+impl Path {
+    pub fn from_id(id: Atom) -> Path {
+        Path {
+            absolute: false,
+            ids: vec![id],
+        }
+    }
+
+    pub fn usize() -> Path {
+        Path {
+            absolute: false,
+            ids: vec![Atom::from("usize")],
+        }
+    }
+
+    pub fn str() -> Path {
+        Path {
+            absolute: false,
+            ids: vec![Atom::from("str")],
+        }
+    }
+
+    pub fn vec() -> Path {
+        Path {
+            absolute: true,
+            ids: vec![Atom::from("std"), Atom::from("vec"), Atom::from("Vec")],
+        }
+    }
+
+    pub fn option() -> Path {
+        Path {
+            absolute: true,
+            ids: vec![
+                Atom::from("std"),
+                Atom::from("option"),
+                Atom::from("Option"),
+            ],
+        }
+    }
+
+    pub fn as_id(&self) -> Option<Atom> {
+        if !self.absolute && self.ids.len() == 1 {
+            Some(self.ids[0].clone())
+        } else {
+            None
+        }
+    }
+}
+
+pub fn read_algorithm(annotations: &[Annotation], algorithm: &mut r::Algorithm) {
+    for annotation in annotations {
+        if annotation.id == Atom::from(LALR) {
+            algorithm.lalr = true;
+        } else if annotation.id == Atom::from(TABLE_DRIVEN) {
+            algorithm.codegen = r::LrCodeGeneration::TableDriven;
+        } else if annotation.id == Atom::from(RECURSIVE_ASCENT) {
+            algorithm.codegen = r::LrCodeGeneration::RecursiveAscent;
+        } else if annotation.id == Atom::from(TEST_ALL) {
+            algorithm.codegen = r::LrCodeGeneration::TestAll;
+        } else {
+            panic!(
+                "validation permitted unknown annotation: {:?}",
+                annotation.id,
+            );
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/pattern.rs
@@ -0,0 +1,129 @@
+/*!
+
+The definition of patterns is shared between the parse-tree and the
+repr, but customized by a type T that represents the different type
+representations.
+
+*/
+
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::{Path, Span};
+use std::fmt::{Display, Error, Formatter};
+use util::Sep;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Pattern<T> {
+    pub span: Span,
+    pub kind: PatternKind<T>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct FieldPattern<T> {
+    pub field_span: Span,
+    pub field_name: Atom,
+    pub pattern: Pattern<T>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum PatternKind<T> {
+    Enum(Path, Vec<Pattern<T>>),
+    Struct(Path, Vec<FieldPattern<T>>, /* trailing ..? */ bool),
+    Path(Path),
+    Tuple(Vec<Pattern<T>>),
+    TupleStruct(Path, Vec<Pattern<T>>),
+    Usize(usize),
+    Underscore,
+    DotDot,
+    Choose(T),
+    CharLiteral(Atom),
+}
+
+impl<T> Pattern<T> {
+    pub fn for_each_binding<U>(&self, map_fn: &mut FnMut(&T) -> U) {
+        self.map(map_fn);
+    }
+
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> Pattern<U> {
+        Pattern {
+            span: self.span,
+            kind: self.kind.map(map_fn),
+        }
+    }
+}
+
+impl<T> PatternKind<T> {
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> PatternKind<U> {
+        match *self {
+            PatternKind::Path(ref path) => PatternKind::Path(path.clone()),
+            PatternKind::Enum(ref path, ref pats) => PatternKind::Enum(
+                path.clone(),
+                pats.iter().map(|pat| pat.map(map_fn)).collect(),
+            ),
+            PatternKind::Struct(ref path, ref fields, dotdot) => PatternKind::Struct(
+                path.clone(),
+                fields.iter().map(|pat| pat.map(map_fn)).collect(),
+                dotdot,
+            ),
+            PatternKind::Tuple(ref pats) => {
+                PatternKind::Tuple(pats.iter().map(|p| p.map(map_fn)).collect())
+            }
+            PatternKind::TupleStruct(ref path, ref pats) => {
+                PatternKind::TupleStruct(path.clone(), pats.iter().map(|p| p.map(map_fn)).collect())
+            }
+            PatternKind::Underscore => PatternKind::Underscore,
+            PatternKind::DotDot => PatternKind::DotDot,
+            PatternKind::Usize(n) => PatternKind::Usize(n),
+            PatternKind::Choose(ref ty) => PatternKind::Choose(map_fn(ty)),
+            PatternKind::CharLiteral(ref c) => PatternKind::CharLiteral(c.clone()),
+        }
+    }
+}
+
+impl<T> FieldPattern<T> {
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> FieldPattern<U> {
+        FieldPattern {
+            field_name: self.field_name.clone(),
+            field_span: self.field_span,
+            pattern: self.pattern.map(map_fn),
+        }
+    }
+}
+
+impl<T: Display> Display for Pattern<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.kind)
+    }
+}
+
+impl<T: Display> Display for PatternKind<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            PatternKind::Path(ref path) => write!(fmt, "{}", path),
+            PatternKind::Enum(ref path, ref pats) => write!(fmt, "{}({})", path, Sep(", ", pats)),
+            PatternKind::Struct(ref path, ref fields, false) => {
+                write!(fmt, "{} {{ {} }}", path, Sep(", ", fields))
+            }
+            PatternKind::Struct(ref path, ref fields, true) if fields.len() == 0 => {
+                write!(fmt, "{} {{ .. }}", path)
+            }
+            PatternKind::Struct(ref path, ref fields, true) => {
+                write!(fmt, "{} {{ {}, .. }}", path, Sep(", ", fields))
+            }
+            PatternKind::Tuple(ref paths) => write!(fmt, "({})", Sep(", ", paths)),
+            PatternKind::TupleStruct(ref path, ref paths) => {
+                write!(fmt, "{}({})", path, Sep(", ", paths))
+            }
+            PatternKind::Underscore => write!(fmt, "_"),
+            PatternKind::DotDot => write!(fmt, ".."),
+            PatternKind::Usize(n) => write!(fmt, "{}", n),
+            PatternKind::Choose(ref ty) => write!(fmt, "{}", ty),
+            PatternKind::CharLiteral(ref c) => write!(fmt, "'{}'", c),
+        }
+    }
+}
+
+impl<T: Display> Display for FieldPattern<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}: {}", self.field_name, self.pattern)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/repr.rs
@@ -0,0 +1,596 @@
+/*!
+ * Compiled representation of a grammar. Simplified, normalized
+ * version of `parse_tree`. The normalization passes produce this
+ * representation incrementally.
+ */
+
+use string_cache::DefaultAtom as Atom;
+use grammar::pattern::Pattern;
+use message::Content;
+use std::fmt::{Debug, Display, Error, Formatter};
+use collections::{map, Map};
+use util::Sep;
+
+// These concepts we re-use wholesale
+pub use grammar::parse_tree::{Annotation, InternToken, NonterminalString, Path, Span,
+                              TerminalLiteral, TerminalString, TypeParameter, Visibility,
+                              WhereClause};
+
+#[derive(Clone, Debug)]
+pub struct Grammar {
+    // a unique prefix that can be appended to identifiers to ensure
+    // that they do not conflict with any action strings
+    pub prefix: String,
+
+    // algorithm user requested for this parser
+    pub algorithm: Algorithm,
+
+    // true if the grammar mentions the `!` terminal anywhere
+    pub uses_error_recovery: bool,
+
+    // these are the nonterminals that were declared to be public; the
+    // key is the user's name for the symbol, the value is the
+    // artificial symbol we introduce, which will always have a single
+    // production like `Foo' = Foo`.
+    pub start_nonterminals: Map<NonterminalString, NonterminalString>,
+
+    // the "use foo;" statements that the user declared
+    pub uses: Vec<String>,
+
+    // type parameters declared on the grammar, like `grammar<T>;`
+    pub type_parameters: Vec<TypeParameter>,
+
+    // actual parameters declared on the grammar, like the `x: u32` in `grammar(x: u32);`
+    pub parameters: Vec<Parameter>,
+
+    // where clauses declared on the grammar, like `grammar<T> where T: Sized`
+    pub where_clauses: Vec<WhereClause<TypeRepr>>,
+
+    // optional tokenizer DFA; this is only needed if the user did not supply
+    // an extern token declaration
+    pub intern_token: Option<InternToken>,
+
+    // the grammar proper:
+    pub action_fn_defns: Vec<ActionFnDefn>,
+    pub terminals: TerminalSet,
+    pub nonterminals: Map<NonterminalString, NonterminalData>,
+    pub token_span: Span,
+    pub conversions: Map<TerminalString, Pattern<TypeRepr>>,
+    pub types: Types,
+    pub module_attributes: Vec<String>,
+}
+
+/// For each terminal, we map it to a small integer from 0 to N.
+/// This struct contains the mappings to go back and forth.
+#[derive(Clone, Debug)]
+pub struct TerminalSet {
+    pub all: Vec<TerminalString>,
+    pub bits: Map<TerminalString, usize>,
+}
+
+#[derive(Clone, Debug)]
+pub struct NonterminalData {
+    pub name: NonterminalString,
+    pub visibility: Visibility,
+    pub span: Span,
+    pub annotations: Vec<Annotation>,
+    pub productions: Vec<Production>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Algorithm {
+    pub lalr: bool,
+    pub codegen: LrCodeGeneration,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum LrCodeGeneration {
+    TableDriven,
+    RecursiveAscent,
+    TestAll,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Parameter {
+    pub name: Atom,
+    pub ty: TypeRepr,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Production {
+    // this overlaps with the key in the hashmap, obviously, but it's
+    // handy to have it
+    pub nonterminal: NonterminalString,
+    pub symbols: Vec<Symbol>,
+    pub action: ActionFn,
+    pub span: Span,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Symbol {
+    Nonterminal(NonterminalString),
+    Terminal(TerminalString),
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub struct ActionFnDefn {
+    pub fallible: bool,
+    pub ret_type: TypeRepr,
+    pub kind: ActionFnDefnKind,
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub enum ActionFnDefnKind {
+    User(UserActionFnDefn),
+    Inline(InlineActionFnDefn),
+    Lookaround(LookaroundActionFnDefn),
+}
+
+/// An action fn written by a user.
+#[derive(Clone, PartialEq, Eq)]
+pub struct UserActionFnDefn {
+    pub arg_patterns: Vec<Atom>,
+    pub arg_types: Vec<TypeRepr>,
+    pub code: String,
+}
+
+/// An action fn generated by the inlining pass.  If we were
+/// inlining `A = B C D` (with action 44) into `X = Y A Z` (with
+/// action 22), this would look something like:
+///
+/// ```
+/// fn __action66(__0: Y, __1: B, __2: C, __3: D, __4: Z) {
+///     __action22(__0, __action44(__1, __2, __3), __4)
+/// }
+/// ```
+#[derive(Clone, PartialEq, Eq)]
+pub struct InlineActionFnDefn {
+    /// in the example above, this would be `action22`
+    pub action: ActionFn,
+
+    /// in the example above, this would be `Y, {action44: B, C, D}, Z`
+    pub symbols: Vec<InlinedSymbol>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum LookaroundActionFnDefn {
+    Lookahead,
+    Lookbehind,
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub enum InlinedSymbol {
+    Original(Symbol),
+    Inlined(ActionFn, Vec<Symbol>),
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeRepr {
+    Tuple(Vec<TypeRepr>),
+    Nominal(NominalTypeRepr),
+    Associated {
+        type_parameter: Atom,
+        id: Atom,
+    },
+    Lifetime(Atom),
+    Ref {
+        lifetime: Option<Atom>,
+        mutable: bool,
+        referent: Box<TypeRepr>,
+    },
+}
+
+impl TypeRepr {
+    pub fn is_unit(&self) -> bool {
+        match *self {
+            TypeRepr::Tuple(ref v) => v.is_empty(),
+            _ => false,
+        }
+    }
+
+    pub fn usize() -> TypeRepr {
+        TypeRepr::Nominal(NominalTypeRepr {
+            path: Path::usize(),
+            types: vec![],
+        })
+    }
+
+    pub fn str() -> TypeRepr {
+        TypeRepr::Nominal(NominalTypeRepr {
+            path: Path::str(),
+            types: vec![],
+        })
+    }
+
+    /// Returns the type parameters (or potential type parameters)
+    /// referenced by this type. e.g., for the type `&'x X`, would
+    /// return `[TypeParameter::Lifetime('x), TypeParameter::Id(X)]`.
+    /// This is later used to prune the type parameters list so that
+    /// only those that are actually used are included.
+    pub fn referenced(&self) -> Vec<TypeParameter> {
+        match *self {
+            TypeRepr::Tuple(ref tys) => tys.iter().flat_map(|t| t.referenced()).collect(),
+            TypeRepr::Nominal(ref data) => data.types
+                .iter()
+                .flat_map(|t| t.referenced())
+                .chain(match data.path.as_id() {
+                    Some(id) => vec![TypeParameter::Id(id)],
+                    None => vec![],
+                })
+                .collect(),
+            TypeRepr::Associated {
+                ref type_parameter, ..
+            } => vec![TypeParameter::Id(type_parameter.clone())],
+            TypeRepr::Lifetime(ref l) => vec![TypeParameter::Lifetime(l.clone())],
+            TypeRepr::Ref {
+                ref lifetime,
+                mutable: _,
+                ref referent,
+            } => lifetime
+                .iter()
+                .map(|id| TypeParameter::Lifetime(id.clone()))
+                .chain(referent.referenced())
+                .collect(),
+        }
+    }
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NominalTypeRepr {
+    pub path: Path,
+    pub types: Vec<TypeRepr>,
+}
+
+#[derive(Clone, Debug)]
+pub struct Types {
+    terminal_token_type: TypeRepr,
+    terminal_loc_type: Option<TypeRepr>,
+    error_type: Option<TypeRepr>,
+    terminal_types: Map<TerminalString, TypeRepr>,
+    nonterminal_types: Map<NonterminalString, TypeRepr>,
+    parse_error_type: TypeRepr,
+    error_recovery_type: TypeRepr,
+}
+
+impl Types {
+    pub fn new(
+        prefix: &str,
+        terminal_loc_type: Option<TypeRepr>,
+        error_type: Option<TypeRepr>,
+        terminal_token_type: TypeRepr,
+    ) -> Types {
+        let mut types = Types {
+            terminal_loc_type: terminal_loc_type,
+            error_type: error_type,
+            terminal_token_type: terminal_token_type,
+            terminal_types: map(),
+            nonterminal_types: map(),
+            // the following two will be overwritten later
+            parse_error_type: TypeRepr::Tuple(vec![]),
+            error_recovery_type: TypeRepr::Tuple(vec![]),
+        };
+
+        let args = vec![
+            types.terminal_loc_type().clone(),
+            types.terminal_token_type().clone(),
+            types.error_type(),
+        ];
+        types.parse_error_type = TypeRepr::Nominal(NominalTypeRepr {
+            path: Path {
+                absolute: false,
+                ids: vec![
+                    Atom::from(format!("{}lalrpop_util", prefix)),
+                    Atom::from("ParseError"),
+                ],
+            },
+            types: args.clone(),
+        });
+        types.error_recovery_type = TypeRepr::Nominal(NominalTypeRepr {
+            path: Path {
+                absolute: false,
+                ids: vec![
+                    Atom::from(format!("{}lalrpop_util", prefix)),
+                    Atom::from("ErrorRecovery"),
+                ],
+            },
+            types: args,
+        });
+        types
+            .terminal_types
+            .insert(TerminalString::Error, types.error_recovery_type.clone());
+        types
+    }
+
+    pub fn add_type(&mut self, nt_id: NonterminalString, ty: TypeRepr) {
+        assert!(self.nonterminal_types.insert(nt_id, ty).is_none());
+    }
+
+    pub fn add_term_type(&mut self, term: TerminalString, ty: TypeRepr) {
+        assert!(self.terminal_types.insert(term, ty).is_none());
+    }
+
+    pub fn terminal_token_type(&self) -> &TypeRepr {
+        &self.terminal_token_type
+    }
+
+    pub fn opt_terminal_loc_type(&self) -> Option<&TypeRepr> {
+        self.terminal_loc_type.as_ref()
+    }
+
+    pub fn terminal_loc_type(&self) -> TypeRepr {
+        self.terminal_loc_type
+            .clone()
+            .unwrap_or_else(|| TypeRepr::Tuple(vec![]))
+    }
+
+    pub fn error_type(&self) -> TypeRepr {
+        self.error_type.clone().unwrap_or_else(|| TypeRepr::Ref {
+            lifetime: Some(Atom::from("'static")),
+            mutable: false,
+            referent: Box::new(TypeRepr::str()),
+        })
+    }
+
+    pub fn terminal_type(&self, id: &TerminalString) -> &TypeRepr {
+        self.terminal_types
+            .get(&id)
+            .unwrap_or(&self.terminal_token_type)
+    }
+
+    pub fn terminal_types(&self) -> Vec<TypeRepr> {
+        self.terminal_types.values().cloned().collect()
+    }
+
+    pub fn lookup_nonterminal_type(&self, id: &NonterminalString) -> Option<&TypeRepr> {
+        self.nonterminal_types.get(&id)
+    }
+
+    pub fn nonterminal_type(&self, id: &NonterminalString) -> &TypeRepr {
+        &self.nonterminal_types[&id]
+    }
+
+    pub fn nonterminal_types(&self) -> Vec<TypeRepr> {
+        self.nonterminal_types.values().cloned().collect()
+    }
+
+    pub fn parse_error_type(&self) -> &TypeRepr {
+        &self.parse_error_type
+    }
+
+    /// Returns a type `(L, T, L)` where L is the location type and T
+    /// is the token type.
+    pub fn triple_type(&self) -> TypeRepr {
+        self.spanned_type(self.terminal_token_type().clone())
+    }
+
+    /// Returns a type `(L, T, L)` where L is the location type and T
+    /// is the argument.
+    pub fn spanned_type(&self, ty: TypeRepr) -> TypeRepr {
+        let location_type = self.terminal_loc_type();
+        TypeRepr::Tuple(vec![location_type.clone(), ty, location_type])
+    }
+}
+
+impl Display for Parameter {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}: {}", self.name, self.ty)
+    }
+}
+
+impl Display for TypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeRepr::Tuple(ref types) => write!(fmt, "({})", Sep(", ", types)),
+            TypeRepr::Nominal(ref data) => write!(fmt, "{}", data),
+            TypeRepr::Associated {
+                ref type_parameter,
+                ref id,
+            } => write!(fmt, "{}::{}", type_parameter, id),
+            TypeRepr::Lifetime(ref id) => write!(fmt, "{}", id),
+            TypeRepr::Ref {
+                lifetime: None,
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{}", referent),
+            TypeRepr::Ref {
+                lifetime: Some(ref l),
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{} {}", l, referent),
+            TypeRepr::Ref {
+                lifetime: None,
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&mut {}", referent),
+            TypeRepr::Ref {
+                lifetime: Some(ref l),
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&{} mut {}", l, referent),
+        }
+    }
+}
+
+impl Debug for TypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for NominalTypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        if self.types.len() == 0 {
+            write!(fmt, "{}", self.path)
+        } else {
+            write!(fmt, "{}<{}>", self.path, Sep(", ", &self.types))
+        }
+    }
+}
+
+impl Debug for NominalTypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
+pub struct ActionFn(u32);
+
+impl ActionFn {
+    pub fn new(x: usize) -> ActionFn {
+        ActionFn(x as u32)
+    }
+
+    pub fn index(&self) -> usize {
+        self.0 as usize
+    }
+}
+
+impl Symbol {
+    pub fn is_terminal(&self) -> bool {
+        match *self {
+            Symbol::Terminal(..) => true,
+            Symbol::Nonterminal(..) => false,
+        }
+    }
+
+    pub fn ty<'ty>(&self, t: &'ty Types) -> &'ty TypeRepr {
+        match *self {
+            Symbol::Terminal(ref id) => t.terminal_type(id),
+            Symbol::Nonterminal(ref id) => t.nonterminal_type(id),
+        }
+    }
+}
+
+impl Display for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Symbol::Nonterminal(ref id) => write!(fmt, "{}", id.clone()),
+            Symbol::Terminal(ref id) => write!(fmt, "{}", id.clone()),
+        }
+    }
+}
+
+impl Debug for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Into<Box<Content>> for Symbol {
+    fn into(self) -> Box<Content> {
+        match self {
+            Symbol::Nonterminal(nt) => nt.into(),
+            Symbol::Terminal(term) => term.into(),
+        }
+    }
+}
+
+impl Debug for Production {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(
+            fmt,
+            "{} = {} => {:?};",
+            self.nonterminal,
+            Sep(", ", &self.symbols),
+            self.action,
+        )
+    }
+}
+
+impl Debug for ActionFnDefn {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.to_fn_string("_"))
+    }
+}
+
+impl ActionFnDefn {
+    fn to_fn_string(&self, name: &str) -> String {
+        match self.kind {
+            ActionFnDefnKind::User(ref data) => data.to_fn_string(self, name),
+            ActionFnDefnKind::Inline(ref data) => data.to_fn_string(name),
+            ActionFnDefnKind::Lookaround(ref data) => format!("{:?}", data),
+        }
+    }
+}
+
+impl UserActionFnDefn {
+    fn to_fn_string(&self, defn: &ActionFnDefn, name: &str) -> String {
+        let arg_strings: Vec<String> = self.arg_patterns
+            .iter()
+            .zip(self.arg_types.iter())
+            .map(|(p, t)| format!("{}: {}", p, t))
+            .collect();
+
+        format!(
+            "fn {}({}) -> {} {{ {} }}",
+            name,
+            Sep(", ", &arg_strings),
+            defn.ret_type,
+            self.code,
+        )
+    }
+}
+
+impl InlineActionFnDefn {
+    fn to_fn_string(&self, name: &str) -> String {
+        let arg_strings: Vec<String> = self.symbols
+            .iter()
+            .map(|inline_sym| match *inline_sym {
+                InlinedSymbol::Original(ref s) => format!("{}", s),
+                InlinedSymbol::Inlined(a, ref s) => format!("{:?}({})", a, Sep(", ", s)),
+            })
+            .collect();
+
+        format!(
+            "fn {}(..) {{ {:?}({}) }}",
+            name,
+            self.action,
+            Sep(", ", &arg_strings),
+        )
+    }
+}
+
+impl Grammar {
+    pub fn pattern(&self, t: &TerminalString) -> &Pattern<TypeRepr> {
+        &self.conversions[t]
+    }
+
+    pub fn productions_for(&self, nonterminal: &NonterminalString) -> &[Production] {
+        match self.nonterminals.get(nonterminal) {
+            Some(v) => &v.productions[..],
+            None => &[], // this...probably shouldn't happen actually?
+        }
+    }
+
+    pub fn user_parameter_refs(&self) -> String {
+        let mut result = String::new();
+        for parameter in &self.parameters {
+            result.push_str(&format!("{}, ", parameter.name));
+        }
+        result
+    }
+
+    pub fn action_is_fallible(&self, f: ActionFn) -> bool {
+        self.action_fn_defns[f.index()].fallible
+    }
+
+    pub fn non_lifetime_type_parameters(&self) -> Vec<&TypeParameter> {
+        self.type_parameters
+            .iter()
+            .filter(|&tp| match *tp {
+                TypeParameter::Lifetime(_) => false,
+                TypeParameter::Id(_) => true,
+            })
+            .collect()
+    }
+}
+
+impl Default for Algorithm {
+    fn default() -> Self {
+        Algorithm {
+            lalr: false,
+            codegen: LrCodeGeneration::TableDriven,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/token/mod.rs
@@ -0,0 +1,28 @@
+use std::collections::HashMap;
+
+use grammar::parse_tree::TypeRef;
+use string_cache::DefaultAtom as Atom;
+
+#[cfg(test)]
+mod test;
+
+pub struct TokenDefinition {
+    // if the enum type is `foo::bar::baz<X,Y>` then:
+    enum_type: TypeRef,
+
+    // map from a custom string, like `"("` to a variant name like LPAREN
+    token_map: HashMap<Atom, Atom>,
+}
+
+impl TokenDefinition {
+    pub fn new(enum_type: TypeRef, token_map: Vec<(Atom, Atom)>) -> TokenDefinition {
+        TokenDefinition {
+            enum_type: enum_type,
+            token_map: token_map.into_iter().collect(),
+        }
+    }
+
+    pub fn enum_type(&self) -> &TypeRef {
+        &self.enum_type
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/grammar/token/test.rs
@@ -0,0 +1,1 @@
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/kernel_set.rs
@@ -0,0 +1,41 @@
+use std::collections::VecDeque;
+use std::fmt::Debug;
+use std::hash::Hash;
+use collections::{map, Map};
+
+pub struct KernelSet<K: Kernel> {
+    counter: usize,
+    kernels: VecDeque<K>,
+    map: Map<K, K::Index>,
+}
+
+pub trait Kernel: Clone + Debug + Hash + Eq + PartialOrd + Ord {
+    type Index: Copy + Debug;
+
+    fn index(c: usize) -> Self::Index;
+}
+
+impl<K: Kernel> KernelSet<K> {
+    pub fn new() -> KernelSet<K> {
+        KernelSet {
+            kernels: VecDeque::new(),
+            map: map(),
+            counter: 0,
+        }
+    }
+
+    pub fn add_state(&mut self, kernel: K) -> K::Index {
+        let kernels = &mut self.kernels;
+        let counter = &mut self.counter;
+        *self.map.entry(kernel.clone()).or_insert_with(|| {
+            let index = *counter;
+            *counter += 1;
+            kernels.push_back(kernel);
+            K::index(index)
+        })
+    }
+
+    pub fn next(&mut self) -> Option<K> {
+        self.kernels.pop_front()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/dfa/interpret.rs
@@ -0,0 +1,40 @@
+use lexer::dfa::{Kind, NFAIndex, DFA, START};
+
+pub fn interpret<'text>(dfa: &DFA, input: &'text str) -> Option<(NFAIndex, &'text str)> {
+    let mut longest: Option<(NFAIndex, usize)> = None;
+    let mut state_index = START;
+
+    for (offset, ch) in input.char_indices() {
+        let state = &dfa.states[state_index.0];
+
+        let target = dfa.state(state_index)
+            .test_edges
+            .iter()
+            .filter_map(|&(test, target)| {
+                if test.contains_char(ch) {
+                    Some(target)
+                } else {
+                    None
+                }
+            })
+            .next();
+
+        if let Some(target) = target {
+            state_index = target;
+        } else {
+            state_index = state.other_edge;
+        }
+
+        match dfa.state(state_index).kind {
+            Kind::Accepts(nfa) => {
+                longest = Some((nfa, offset + ch.len_utf8()));
+            }
+            Kind::Reject => {
+                break;
+            }
+            Kind::Neither => {}
+        }
+    }
+
+    longest.map(|(index, offset)| (index, &input[..offset]))
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/dfa/mod.rs
@@ -0,0 +1,326 @@
+//! Constructs a DFA which picks the longest matching regular
+//! expression from the input.
+
+use collections::Set;
+use kernel_set::{Kernel, KernelSet};
+use std::fmt::{Debug, Display, Error, Formatter};
+use std::rc::Rc;
+use lexer::re;
+use lexer::nfa::{self, NFAConstructionError, NFAStateIndex, Test, NFA};
+
+#[cfg(test)]
+mod test;
+
+#[cfg(test)]
+pub mod interpret;
+
+mod overlap;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct DFA {
+    pub states: Vec<State>,
+}
+
+#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub struct Precedence(pub usize);
+
+#[derive(Debug)]
+pub enum DFAConstructionError {
+    NFAConstructionError {
+        index: NFAIndex,
+        error: NFAConstructionError,
+    },
+
+    /// Either of the two regexs listed could match, and they have equal
+    /// priority.
+    Ambiguity { match0: NFAIndex, match1: NFAIndex },
+}
+
+pub fn build_dfa(
+    regexs: &[re::Regex],
+    precedences: &[Precedence],
+) -> Result<DFA, DFAConstructionError> {
+    assert_eq!(regexs.len(), precedences.len());
+    let nfas: Vec<_> = try! {
+        regexs.iter()
+              .enumerate()
+              .map(|(i, r)| match NFA::from_re(r) {
+                  Ok(nfa) => Ok(nfa),
+                  Err(e) => Err(DFAConstructionError::NFAConstructionError {
+                      index: NFAIndex(i),
+                      error: e
+                  }),
+              })
+              .collect()
+    };
+    let builder = DFABuilder {
+        nfas: &nfas,
+        precedences: precedences.to_vec(),
+    };
+    let dfa = try!(builder.build());
+    Ok(dfa)
+}
+
+struct DFABuilder<'nfa> {
+    nfas: &'nfa [NFA],
+    precedences: Vec<Precedence>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct State {
+    item_set: DFAItemSet,
+    pub kind: Kind,
+    pub test_edges: Vec<(Test, DFAStateIndex)>,
+    pub other_edge: DFAStateIndex,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Kind {
+    Accepts(NFAIndex),
+    Reject,
+    Neither,
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NFAIndex(usize);
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct DFAStateIndex(usize);
+
+type DFAKernelSet = KernelSet<DFAItemSet>;
+
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct DFAItemSet {
+    items: Rc<Vec<Item>>,
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct Item {
+    // which regular expression?
+    nfa_index: NFAIndex,
+
+    // what state within the NFA are we at?
+    nfa_state: NFAStateIndex,
+}
+
+const START: DFAStateIndex = DFAStateIndex(0);
+
+impl<'nfa> DFABuilder<'nfa> {
+    fn build(&self) -> Result<DFA, DFAConstructionError> {
+        let mut kernel_set = KernelSet::new();
+        let mut states = vec![];
+
+        let start_state_index = self.start_state(&mut kernel_set);
+        assert_eq!(start_state_index, START);
+
+        while let Some(item_set) = kernel_set.next() {
+            // collect all the specific tests we expect from any of
+            // the items in this state
+            let tests: Set<Test> = item_set
+                .items
+                .iter()
+                .flat_map(|&item| {
+                    self.nfa(item)
+                        .edges::<Test>(item.nfa_state)
+                        .map(|edge| edge.label)
+                })
+                .collect();
+            let tests = overlap::remove_overlap(&tests);
+
+            // if any NFA is in an accepting state, that makes this
+            // DFA state an accepting state
+            let mut all_accepts: Vec<(Precedence, NFAIndex)> = item_set
+                .items
+                .iter()
+                .cloned()
+                .filter(|&item| self.nfa(item).is_accepting_state(item.nfa_state))
+                .map(|item| (self.precedences[item.nfa_index.0], item.nfa_index))
+                .collect();
+
+            // if all NFAs are in a rejecting state, that makes this
+            // DFA a rejecting state
+            let all_rejects: bool = item_set
+                .items
+                .iter()
+                .all(|&item| self.nfa(item).is_rejecting_state(item.nfa_state));
+
+            let kind = if all_rejects || item_set.items.is_empty() {
+                Kind::Reject
+            } else if all_accepts.len() == 0 {
+                Kind::Neither
+            } else if all_accepts.len() == 1 {
+                // accepts just one NFA, easy case
+                Kind::Accepts(all_accepts[0].1)
+            } else {
+                all_accepts.sort(); // sort regex with higher precedence, well, higher
+                let (best_priority, best_nfa) = all_accepts[all_accepts.len() - 1];
+                let (next_priority, next_nfa) = all_accepts[all_accepts.len() - 2];
+                if best_priority == next_priority {
+                    return Err(DFAConstructionError::Ambiguity {
+                        match0: best_nfa,
+                        match1: next_nfa,
+                    });
+                }
+                Kind::Accepts(best_nfa)
+            };
+
+            // for each specific test, find what happens if we see a
+            // character matching that test
+            let mut test_edges: Vec<(Test, DFAStateIndex)> = tests
+                .iter()
+                .map(|&test| {
+                    let items: Vec<_> = item_set
+                        .items
+                        .iter()
+                        .filter_map(|&item| self.accept_test(item, test))
+                        .collect();
+
+                    // at least one of those items should accept this test
+                    assert!(!items.is_empty());
+
+                    (test, kernel_set.add_state(self.transitive_closure(items)))
+                })
+                .collect();
+
+            test_edges.sort();
+
+            // Consider what there is some character that doesn't meet
+            // any of the tests. In this case, we can just ignore all
+            // the test edges for each of the items and just union all
+            // the "other" edges -- because if it were one of those
+            // test edges, then that transition is represented above.
+            let other_transitions: Vec<_> = item_set
+                .items
+                .iter()
+                .filter_map(|&item| self.accept_other(item))
+                .collect();
+
+            // we never know the full set
+            assert!(item_set.items.is_empty() || !other_transitions.is_empty());
+
+            let other_edge = kernel_set.add_state(self.transitive_closure(other_transitions));
+
+            let state = State {
+                item_set: item_set,
+                kind: kind,
+                test_edges: test_edges,
+                other_edge: other_edge,
+            };
+
+            states.push(state);
+        }
+
+        Ok(DFA { states: states })
+    }
+
+    fn start_state(&self, kernel_set: &mut DFAKernelSet) -> DFAStateIndex {
+        // starting state is at the beginning of all regular expressions
+        let items: Vec<_> = (0..self.nfas.len())
+            .map(|i| Item {
+                nfa_index: NFAIndex(i),
+                nfa_state: nfa::START,
+            })
+            .collect();
+        let item_set = self.transitive_closure(items);
+        kernel_set.add_state(item_set)
+    }
+
+    fn accept_test(&self, item: Item, test: Test) -> Option<Item> {
+        let nfa = self.nfa(item);
+
+        let matching_test = nfa.edges::<Test>(item.nfa_state)
+            .filter(|edge| edge.label.intersects(test))
+            .map(|edge| item.to(edge.to));
+
+        let matching_other = nfa.edges::<nfa::Other>(item.nfa_state)
+            .map(|edge| item.to(edge.to));
+
+        matching_test.chain(matching_other).next()
+    }
+
+    fn accept_other(&self, item: Item) -> Option<Item> {
+        let nfa = self.nfa(item);
+        nfa.edges::<nfa::Other>(item.nfa_state)
+            .map(|edge| item.to(edge.to))
+            .next()
+    }
+
+    fn transitive_closure(&self, mut items: Vec<Item>) -> DFAItemSet {
+        let mut observed: Set<Item> = items.iter().cloned().collect();
+
+        let mut counter = 0;
+        while counter < items.len() {
+            let item = items[counter];
+            let derived_states = self.nfa(item)
+                .edges::<nfa::Noop>(item.nfa_state)
+                .map(|edge| item.to(edge.to))
+                .filter(|&item| observed.insert(item));
+            items.extend(derived_states);
+            counter += 1;
+        }
+
+        items.sort();
+        items.dedup();
+
+        DFAItemSet {
+            items: Rc::new(items),
+        }
+    }
+
+    fn nfa(&self, item: Item) -> &NFA {
+        &self.nfas[item.nfa_index.0]
+    }
+}
+
+impl Kernel for DFAItemSet {
+    type Index = DFAStateIndex;
+
+    fn index(c: usize) -> DFAStateIndex {
+        DFAStateIndex(c)
+    }
+}
+
+impl DFA {
+    fn state(&self, index: DFAStateIndex) -> &State {
+        &self.states[index.0]
+    }
+}
+
+impl Item {
+    fn to(&self, s: NFAStateIndex) -> Item {
+        Item {
+            nfa_index: self.nfa_index,
+            nfa_state: s,
+        }
+    }
+}
+
+impl Debug for DFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "DFA{}", self.0)
+    }
+}
+
+impl Display for DFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Debug::fmt(self, fmt)
+    }
+}
+
+impl NFAIndex {
+    pub fn index(&self) -> usize {
+        self.0
+    }
+}
+
+impl DFAStateIndex {
+    pub fn index(&self) -> usize {
+        self.0
+    }
+}
+
+impl Debug for Item {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({:?}:{:?})", self.nfa_index, self.nfa_state)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/dfa/overlap.rs
@@ -0,0 +1,149 @@
+//! When we are combining two NFAs, we will grab all the outgoing
+//! edges from a set of nodes and wind up with a bunch of potentially
+//! overlapping character ranges like:
+//!
+//!     a-z
+//!     c-l
+//!     0-9
+//!
+//! This module contains code to turn those into non-overlapping ranges like:
+//!
+//!     a-b
+//!     c-l
+//!     m-z
+//!     0-9
+//!
+//! Specifically, we want to ensure that the same set of characters is
+//! covered when we started, and that each of the input ranges is
+//! covered precisely by some set of ranges in the output.
+
+use collections::Set;
+use lexer::nfa::Test;
+use std::cmp;
+
+pub fn remove_overlap(ranges: &Set<Test>) -> Vec<Test> {
+    // We will do this in the dumbest possible way to start. :)
+    // Maintain a result vector that contains disjoint ranges.  To
+    // insert a new range, we walk over this vector and split things
+    // up as we go. This algorithm is so naive as to be exponential, I
+    // think. Sue me.
+
+    let mut disjoint_ranges = vec![];
+
+    for &range in ranges {
+        add_range(range, 0, &mut disjoint_ranges);
+    }
+
+    // the algorithm above leaves some empty ranges in for simplicity;
+    // prune them out.
+    disjoint_ranges.retain(|r| !r.is_empty());
+
+    disjoint_ranges
+}
+
+fn add_range(range: Test, start_index: usize, disjoint_ranges: &mut Vec<Test>) {
+    if range.is_empty() {
+        return;
+    }
+
+    // Find first overlapping range in `disjoint_ranges`, if any.
+    match disjoint_ranges[start_index..]
+        .iter()
+        .position(|r| r.intersects(range))
+    {
+        Some(index) => {
+            let index = index + start_index;
+            let overlapping_range = disjoint_ranges[index];
+
+            // If the range we are trying to add already exists, we're all done.
+            if overlapping_range == range {
+                return;
+            }
+
+            // Otherwise, we want to create three ranges (some of which may
+            // be empty). e.g. imagine one range is `a-z` and the other
+            // is `c-l`, we want `a-b`, `c-l`, and `m-z`.
+            let min_min = cmp::min(range.start, overlapping_range.start);
+            let mid_min = cmp::max(range.start, overlapping_range.start);
+            let mid_max = cmp::min(range.end, overlapping_range.end);
+            let max_max = cmp::max(range.end, overlapping_range.end);
+            let low_range = Test {
+                start: min_min,
+                end: mid_min,
+            };
+            let mid_range = Test {
+                start: mid_min,
+                end: mid_max,
+            };
+            let max_range = Test {
+                start: mid_max,
+                end: max_max,
+            };
+
+            assert!(low_range.is_disjoint(mid_range));
+            assert!(low_range.is_disjoint(max_range));
+            assert!(mid_range.is_disjoint(max_range));
+
+            // Replace the existing range with the low range, and then
+            // add the mid and max ranges in. (The low range may be
+            // empty, but we'll prune that out later.)
+            disjoint_ranges[index] = low_range;
+            add_range(mid_range, index + 1, disjoint_ranges);
+            add_range(max_range, index + 1, disjoint_ranges);
+        }
+
+        None => {
+            // no overlap -- easy case.
+            disjoint_ranges.push(range);
+        }
+    }
+}
+
+#[cfg(test)]
+macro_rules! test {
+    ($($range:expr,)*) => {
+        {
+            use collections::set;
+            use lexer::nfa::Test;
+            use std::char;
+            let mut s = set();
+            $({ let r = $range; s.insert(Test::exclusive_range(r.start, r.end)); })*
+            remove_overlap(&s).into_iter()
+                              .map(|r|
+                                   char::from_u32(r.start).unwrap() ..
+                                   char::from_u32(r.end).unwrap())
+                              .collect::<Vec<_>>()
+        }
+    }
+}
+
+#[test]
+fn alphabet() {
+    let result = test! {
+        'a' .. 'z',
+        'c' .. 'l',
+        '0' .. '9',
+    };
+    assert_eq!(result, vec!['0'..'9', 'a'..'c', 'c'..'l', 'l'..'z']);
+}
+
+#[test]
+fn repeat() {
+    let result = test! {
+        'a' .. 'z',
+        'c' .. 'l',
+        'l' .. 'z',
+        '0' .. '9',
+    };
+    assert_eq!(result, vec!['0'..'9', 'a'..'c', 'c'..'l', 'l'..'z']);
+}
+
+#[test]
+fn stagger() {
+    let result = test! {
+        '0' .. '3',
+        '2' .. '4',
+        '3' .. '5',
+    };
+    assert_eq!(result, vec!['0'..'2', '2'..'3', '3'..'4', '4'..'5']);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/dfa/test.rs
@@ -0,0 +1,76 @@
+use lexer::dfa::{self, DFAConstructionError, NFAIndex, Precedence, DFA};
+use lexer::dfa::interpret::interpret;
+use lexer::re;
+
+pub fn dfa(inputs: &[(&str, Precedence)]) -> Result<DFA, DFAConstructionError> {
+    let regexs: Result<Vec<_>, _> = inputs.iter().map(|&(s, _)| re::parse_regex(s)).collect();
+    let regexs = match regexs {
+        Ok(rs) => rs,
+        Err(_) => panic!("unexpected parse error"),
+    };
+    let precedences: Vec<_> = inputs.iter().map(|&(_, p)| p).collect();
+    dfa::build_dfa(&regexs, &precedences)
+}
+
+const P1: Precedence = Precedence(1);
+const P0: Precedence = Precedence(0);
+
+#[test]
+fn tokenizer() {
+    let dfa = dfa(&[
+        /* 0 */ (r#"class"#, P1),
+        /* 1 */ (r#"[a-zA-Z_][a-zA-Z0-9_]*"#, P0),
+        /* 2 */ (r#"[0-9]+"#, P0),
+        /* 3 */ (r#" +"#, P0),
+        /* 4 */ (r#">>"#, P0),
+        /* 5 */ (r#">"#, P0),
+    ]).unwrap();
+
+    assert_eq!(interpret(&dfa, "class Foo"), Some((NFAIndex(0), "class")));
+    assert_eq!(interpret(&dfa, "classz Foo"), Some((NFAIndex(1), "classz")));
+    assert_eq!(interpret(&dfa, "123"), Some((NFAIndex(2), "123")));
+    assert_eq!(interpret(&dfa, "  classz Foo"), Some((NFAIndex(3), "  ")));
+    assert_eq!(interpret(&dfa, ">"), Some((NFAIndex(5), ">")));
+    assert_eq!(interpret(&dfa, ">>"), Some((NFAIndex(4), ">>")));
+}
+
+#[test]
+fn ambiguous_regex() {
+    // here the keyword and the regex have same precedence, so we have
+    // an ambiguity
+    assert!(dfa(&[(r#"class"#, P0), (r#"[a-zA-Z_][a-zA-Z0-9_]*"#, P0)]).is_err());
+}
+
+#[test]
+fn issue_32() {
+    assert!(dfa(&[(r#"."#, P0)]).is_ok());
+}
+
+#[test]
+fn issue_35() {
+    assert!(dfa(&[(r#".*"#, P0), (r"[-+]?[0-9]*\.?[0-9]+", P0)]).is_err());
+}
+
+#[test]
+fn alternatives() {
+    let dfa = dfa(&[(r#"abc|abd"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abd"), Some((NFAIndex(0), "abd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
+
+#[test]
+fn alternatives_extension() {
+    let dfa = dfa(&[(r#"abc|abcd"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abcd"), Some((NFAIndex(0), "abcd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
+
+#[test]
+fn alternatives_contraction() {
+    let dfa = dfa(&[(r#"abcd|abc"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abcd"), Some((NFAIndex(0), "abcd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/intern_token/mod.rs
@@ -0,0 +1,292 @@
+/*!
+
+Generates an iterator type `Matcher` that looks roughly like
+
+```ignore
+mod intern_token {
+    extern crate regex as regex;
+
+    #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+    pub struct Token<'input>(pub usize, pub &'input str);
+    //                           ~~~~~~     ~~~~~~~~~~~
+    //                           token      token
+    //                           index      text
+    //                           (type)
+
+    impl<'a> fmt::Display for Token<'a> { ... }
+
+    pub struct MatcherBuilder {
+        regex_set: regex::RegexSet,
+        regex_vec: Vec<regex::Regex>,
+    }
+
+    impl MatcherBuilder {
+        fn new() -> MatchBuilder { ... }
+        fn matcher<'input, 'builder>(&'builder self, s: &'input str) -> Matcher<'input, 'builder> { ... }
+    }
+
+    pub struct Matcher<'input, 'builder> {
+        text: &'input str,
+        consumed: usize,
+        regex_set: &'builder regex::RegexSet,
+        regex_vec: &'builder Vec<regex::Regex>,
+    }
+
+    impl Matcher<'input> {
+        fn tokenize(&self, text: &str) -> Option<(usize, usize)> { ... }
+    }
+
+    impl<'input> Iterator for Matcher<'input> {
+        type Item = Result<(usize, Token<'input>, usize), ParseError>;
+        //                  ~~~~~  ~~~~~~~~~~~~~  ~~~~~
+        //                  start  token          end
+    }
+}
+```
+
+ */
+
+use lexer::re;
+use grammar::parse_tree::InternToken;
+use grammar::repr::{Grammar, TerminalLiteral};
+use rust::RustWrite;
+use std::io::{self, Write};
+
+pub fn compile<W: Write>(
+    grammar: &Grammar,
+    intern_token: &InternToken,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let prefix = &grammar.prefix;
+
+    rust!(out, "mod {}intern_token {{", prefix);
+    rust!(out, "#![allow(unused_imports)]");
+    try!(out.write_uses("", &grammar));
+    rust!(out, "extern crate regex as {}regex;", prefix);
+    rust!(out, "use std::fmt as {}fmt;", prefix);
+    rust!(out, "");
+    rust!(
+        out,
+        "#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]"
+    );
+    rust!(out, "pub struct Token<'input>(pub usize, pub &'input str);");
+    rust!(out, "impl<'a> {}fmt::Display for Token<'a> {{", prefix);
+    rust!(
+        out,
+        "fn fmt(&self, formatter: &mut {}fmt::Formatter) -> Result<(), {}fmt::Error> {{",
+        prefix,
+        prefix
+    );
+    rust!(out, "{}fmt::Display::fmt(self.1, formatter)", prefix);
+    rust!(out, "}}");
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(out, "pub struct {}MatcherBuilder {{", prefix);
+    rust!(out, "regex_set: {}regex::RegexSet,", prefix);
+    rust!(out, "regex_vec: Vec<{}regex::Regex>,", prefix);
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(out, "impl {}MatcherBuilder {{", prefix);
+    rust!(out, "pub fn new() -> {}MatcherBuilder {{", prefix);
+
+    // create a vector of rust string literals with the text of each
+    // regular expression
+    let regex_strings: Vec<String> = {
+        intern_token
+            .match_entries
+            .iter()
+            .map(|match_entry| match match_entry.match_literal {
+                TerminalLiteral::Quoted(ref s) => re::parse_literal(&s),
+                TerminalLiteral::Regex(ref s) => re::parse_regex(&s).unwrap(),
+            })
+            .map(|regex| {
+                // make sure all regex are anchored at the beginning of the input
+                format!("^{}", regex)
+            })
+            .map(|regex_str| {
+                // create a rust string with text of the regex; the Debug impl
+                // will add quotes and escape
+                format!("{:?}", regex_str)
+            })
+            .collect()
+    };
+
+    rust!(out, "let {}strs: &[&str] = &[", prefix);
+    for literal in &regex_strings {
+        rust!(out, "{},", literal);
+    }
+    rust!(out, "];");
+    rust!(
+        out,
+        "let {}regex_set = {}regex::RegexSet::new({}strs).unwrap();",
+        prefix,
+        prefix,
+        prefix
+    );
+
+    rust!(out, "let {}regex_vec = vec![", prefix);
+    for literal in &regex_strings {
+        rust!(out, "{}regex::Regex::new({}).unwrap(),", prefix, literal);
+    }
+    rust!(out, "];");
+
+    rust!(
+        out,
+        "{0}MatcherBuilder {{ regex_set: {0}regex_set, regex_vec: {0}regex_vec }}",
+        prefix
+    );
+    rust!(out, "}}"); // fn new()
+    rust!(
+        out,
+        "pub fn matcher<'input, 'builder>(&'builder self, s: &'input str) \
+         -> {}Matcher<'input, 'builder> {{",
+        prefix
+    );
+    rust!(out, "{}Matcher {{", prefix);
+    rust!(out, "text: s,");
+    rust!(out, "consumed: 0,");
+    rust!(out, "regex_set: &self.regex_set,");
+    rust!(out, "regex_vec: &self.regex_vec,");
+    rust!(out, "}}"); // struct literal
+    rust!(out, "}}"); // fn matcher()
+    rust!(out, "}}"); // impl MatcherBuilder
+    rust!(out, "");
+    rust!(out, "pub struct {}Matcher<'input, 'builder> {{", prefix);
+    rust!(out, "text: &'input str,"); // remaining input
+    rust!(out, "consumed: usize,"); // number of chars consumed thus far
+    rust!(out, "regex_set: &'builder {}regex::RegexSet,", prefix);
+    rust!(out, "regex_vec: &'builder Vec<{}regex::Regex>,", prefix);
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(
+        out,
+        "impl<'input, 'builder> Iterator for {}Matcher<'input, 'builder> {{",
+        prefix
+    );
+    rust!(
+        out,
+        "type Item = Result<(usize, Token<'input>, usize), \
+         {}lalrpop_util::ParseError<usize,Token<'input>,{}>>;",
+        prefix,
+        grammar.types.error_type()
+    );
+    rust!(out, "");
+    rust!(out, "fn next(&mut self) -> Option<Self::Item> {{");
+
+    // start by trimming whitespace from left
+    rust!(out, "let {}text = self.text.trim_left();", prefix);
+    rust!(
+        out,
+        "let {}whitespace = self.text.len() - {}text.len();",
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}start_offset = self.consumed + {}whitespace;",
+        prefix,
+        prefix
+    );
+
+    // if nothing left, return None
+    rust!(out, "if {}text.is_empty() {{", prefix);
+    rust!(out, "self.text = {}text;", prefix);
+    rust!(out, "self.consumed = {}start_offset;", prefix);
+    rust!(out, "None");
+    rust!(out, "}} else {{");
+
+    // otherwise, use regex-set to find list of matching tokens
+    rust!(
+        out,
+        "let {}matches = self.regex_set.matches({}text);",
+        prefix,
+        prefix
+    );
+
+    // if nothing matched, return an error
+    rust!(out, "if !{}matches.matched_any() {{", prefix);
+    rust!(
+        out,
+        "Some(Err({}lalrpop_util::ParseError::InvalidToken {{",
+        prefix
+    );
+    rust!(out, "location: {}start_offset,", prefix);
+    rust!(out, "}}))");
+    rust!(out, "}} else {{");
+
+    // otherwise, have to find longest, highest-priority match. We have the literals
+    // sorted in order of increasing precedence, so we'll iterate over them one by one,
+    // checking if each one matches, and remembering the longest one.
+    rust!(out, "let mut {}longest_match = 0;", prefix); // length of longest match
+    rust!(out, "let mut {}index = 0;", prefix); // index of longest match
+    rust!(
+        out,
+        "for {}i in 0 .. {} {{",
+        prefix,
+        intern_token.match_entries.len()
+    );
+    rust!(out, "if {}matches.matched({}i) {{", prefix, prefix);
+
+    // re-run the regex to find out how long this particular match
+    // was, then compare that against the longest-match so far. Note
+    // that the order of the tuple is carefully constructed to ensure
+    // that (a) we get the longest-match but (b) if two matches are
+    // equal, we get the largest index. This is because the indices
+    // are sorted in order of increasing priority, and because we know
+    // that indices of equal priority cannot both match (because of
+    // the DFA check).
+    rust!(
+        out,
+        "let {}match = self.regex_vec[{}i].find({}text).unwrap();",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(out, "let {}len = {}match.end();", prefix, prefix);
+    rust!(out, "if {}len >= {}longest_match {{", prefix, prefix);
+    rust!(out, "{}longest_match = {}len;", prefix, prefix);
+    rust!(out, "{}index = {}i;", prefix, prefix);
+    rust!(out, "}}"); // if is longest match
+    rust!(out, "}}"); // if matches.matched(i)
+    rust!(out, "}}"); // for loop
+
+    // transform the result into the expected return value
+    rust!(
+        out,
+        "let {}result = &{}text[..{}longest_match];",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}remaining = &{}text[{}longest_match..];",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}end_offset = {}start_offset + {}longest_match;",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(out, "self.text = {}remaining;", prefix);
+    rust!(out, "self.consumed = {}end_offset;", prefix);
+    rust!(
+        out,
+        "Some(Ok(({}start_offset, Token({}index, {}result), {}end_offset)))",
+        prefix,
+        prefix,
+        prefix,
+        prefix
+    );
+
+    rust!(out, "}}"); // else
+    rust!(out, "}}"); // else
+    rust!(out, "}}"); // fn
+    rust!(out, "}}"); // impl
+    rust!(out, "}}"); // mod
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/mod.rs
@@ -0,0 +1,8 @@
+//! Code related to generating tokenizers.
+
+#![allow(dead_code)] // not yet fully activated
+
+pub mod dfa;
+pub mod intern_token;
+pub mod re;
+pub mod nfa;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/nfa/interpret.rs
@@ -0,0 +1,72 @@
+//! A depth-first interpreter for NFAs.
+
+use lexer::nfa::{NFAStateIndex, Noop, Other, StateKind, Test, NFA, START};
+use std::cmp::max;
+
+/// Interpret `nfa` applied to `test`, returning the longest matching
+/// string that we can find (if any).
+pub fn interpret<'text>(nfa: &NFA, text: &'text str) -> Option<&'text str> {
+    let mut longest: Option<usize> = None;
+    let mut stack: Vec<(NFAStateIndex, usize)> = vec![(START, 0)];
+
+    while let Some((state, offset)) = stack.pop() {
+        match nfa.kind(state) {
+            StateKind::Accept => match longest {
+                None => longest = Some(offset),
+                Some(o) => longest = Some(max(o, offset)),
+            },
+            StateKind::Reject => {
+                // the rejection state is a dead-end
+                continue;
+            }
+            StateKind::Neither => {}
+        }
+
+        // transition the no-op edges, to start
+        for edge in nfa.edges::<Noop>(state) {
+            push(&mut stack, (edge.to, offset));
+        }
+
+        // check whether there is another character
+        let ch = match text[offset..].chars().next() {
+            Some(ch) => ch, // yep
+            None => {
+                continue;
+            } // nope
+        };
+
+        let offset1 = offset + ch.len_utf8();
+
+        // transition test edges
+        let mut tests = 0;
+        for edge in nfa.edges::<Test>(state) {
+            if edge.label.contains_char(ch) {
+                push(&mut stack, (edge.to, offset1));
+                tests += 1;
+            }
+        }
+
+        // should *never* match more than one test, because tests
+        // ought to be disjoint
+        assert!(tests <= 1);
+
+        // if no tests passed, use the "Other" edge
+        if tests == 0 {
+            for edge in nfa.edges::<Other>(state) {
+                push(&mut stack, (edge.to, offset1));
+                tests += 1;
+            }
+
+            // should *never* have more than one "otherwise" edge
+            assert!(tests <= 1);
+        }
+    }
+
+    longest.map(|offset| &text[..offset])
+}
+
+fn push<T: Eq>(v: &mut Vec<T>, t: T) {
+    if !v.contains(&t) {
+        v.push(t);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/nfa/mod.rs
@@ -0,0 +1,637 @@
+//! The NFA we construct for each regex. Since the states are not
+//! really of interest, we represent this just as a vector of labeled
+//! edges.
+
+use lexer::re::Regex;
+use regex_syntax::{ClassRange, Expr, Repeater};
+use std::char;
+use std::fmt::{Debug, Error as FmtError, Formatter};
+use std::usize;
+
+#[cfg(test)]
+mod interpret;
+
+#[cfg(test)]
+mod test;
+
+#[derive(Debug)]
+pub struct NFA {
+    states: Vec<State>,
+    edges: Edges,
+}
+
+/// An edge label representing a range of characters, inclusive. Note
+/// that this range may contain some endpoints that are not valid
+/// unicode, hence we store u32.
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Test {
+    pub start: u32,
+    pub end: u32,
+}
+
+/// An "epsilon" edge -- no input
+#[derive(Debug, PartialEq, Eq)]
+pub struct Noop;
+
+/// An "other" edge -- fallback if no other edges apply
+#[derive(Debug, PartialEq, Eq)]
+pub struct Other;
+
+/// For each state, we just store the indices of the first char and
+/// test edges, or usize::MAX if no such edge. You can then find all
+/// edges by enumerating subsequent edges in the vectors until you
+/// find one with a different `from` value.
+#[derive(Debug)]
+pub struct State {
+    kind: StateKind,
+    first_noop_edge: usize,
+    first_test_edge: usize,
+    first_other_edge: usize,
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum StateKind {
+    Accept,
+    Reject,
+    Neither,
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NFAStateIndex(usize);
+
+/// A set of edges for the state machine. Edges are kept sorted by the
+/// type of label they have. Within a vector, all edges with the same
+/// `from` are grouped together so they can be enumerated later (for
+/// now we just ensure this during construction, but one could easily
+/// sort).
+#[derive(Debug)]
+pub struct Edges {
+    noop_edges: Vec<Edge<Noop>>,
+
+    // edges where we are testing the character in some way; for any
+    // given state, there should not be multiple edges with the same
+    // test
+    test_edges: Vec<Edge<Test>>,
+
+    // fallback rules if no test_edge applies
+    other_edges: Vec<Edge<Other>>,
+}
+
+#[derive(PartialEq, Eq)]
+pub struct Edge<L> {
+    pub from: NFAStateIndex,
+    pub label: L,
+    pub to: NFAStateIndex,
+}
+
+pub const ACCEPT: NFAStateIndex = NFAStateIndex(0);
+pub const REJECT: NFAStateIndex = NFAStateIndex(1);
+pub const START: NFAStateIndex = NFAStateIndex(2);
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum NFAConstructionError {
+    NamedCaptures,
+    NonGreedy,
+    WordBoundary,
+    LineBoundary,
+    TextBoundary,
+    ByteRegex,
+}
+
+impl NFA {
+    pub fn from_re(regex: &Regex) -> Result<NFA, NFAConstructionError> {
+        let mut nfa = NFA::new();
+        let s0 = try!(nfa.expr(regex, ACCEPT, REJECT));
+        nfa.push_edge(START, Noop, s0);
+        Ok(nfa)
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Public methods for querying an NFA
+
+    pub fn edges<L: EdgeLabel>(&self, from: NFAStateIndex) -> EdgeIterator<L> {
+        let vec = L::vec(&self.edges);
+        let first = *L::first(&self.states[from.0]);
+        EdgeIterator {
+            edges: vec,
+            from: from,
+            index: first,
+        }
+    }
+
+    pub fn kind(&self, from: NFAStateIndex) -> StateKind {
+        self.states[from.0].kind
+    }
+
+    pub fn is_accepting_state(&self, from: NFAStateIndex) -> bool {
+        self.states[from.0].kind == StateKind::Accept
+    }
+
+    pub fn is_rejecting_state(&self, from: NFAStateIndex) -> bool {
+        self.states[from.0].kind == StateKind::Reject
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Private methods for building an NFA
+
+    fn new() -> NFA {
+        let mut nfa = NFA {
+            states: vec![],
+            edges: Edges {
+                noop_edges: vec![],
+                test_edges: vec![],
+                other_edges: vec![],
+            },
+        };
+
+        // reserve the ACCEPT, REJECT, and START states ahead of time
+        assert!(nfa.new_state(StateKind::Accept) == ACCEPT);
+        assert!(nfa.new_state(StateKind::Reject) == REJECT);
+        assert!(nfa.new_state(StateKind::Neither) == START);
+
+        // the ACCEPT state, given another token, becomes a REJECT
+        nfa.push_edge(ACCEPT, Other, REJECT);
+
+        // the REJECT state loops back to itself no matter what
+        nfa.push_edge(REJECT, Other, REJECT);
+
+        nfa
+    }
+
+    fn new_state(&mut self, kind: StateKind) -> NFAStateIndex {
+        let index = self.states.len();
+
+        // these edge indices will be patched later by patch_edges()
+        self.states.push(State {
+            kind: kind,
+            first_noop_edge: usize::MAX,
+            first_test_edge: usize::MAX,
+            first_other_edge: usize::MAX,
+        });
+
+        NFAStateIndex(index)
+    }
+
+    // pushes an edge: note that all outgoing edges from a particular
+    // state should be pushed together, so that the edge vectors are
+    // suitably sorted
+    fn push_edge<L: EdgeLabel>(&mut self, from: NFAStateIndex, label: L, to: NFAStateIndex) {
+        let edge_vec = L::vec_mut(&mut self.edges);
+        let edge_index = edge_vec.len();
+        edge_vec.push(Edge {
+            from: from,
+            label: label,
+            to: to,
+        });
+
+        // if this is the first edge from the `from` state, set the
+        // index
+        let first_index = L::first_mut(&mut self.states[from.0]);
+        if *first_index == usize::MAX {
+            *first_index = edge_index;
+        } else {
+            // otherwise, check that all edges are continuous
+            assert_eq!(edge_vec[edge_index - 1].from, from);
+        }
+    }
+
+    fn expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        match *expr {
+            Expr::Empty => Ok(accept),
+
+            Expr::Literal { ref chars, casei } => {
+                // for e.g. "abc":
+                // [s0] -a-> [ ] -b-> [ ] -c-> [accept]
+                //   |        |        |
+                //   +--------+--------+--otherwise-> [reject]
+
+                Ok(if casei {
+                    chars.iter().rev().fold(accept, |s, &ch| {
+                        let s1 = self.new_state(StateKind::Neither);
+                        for ch1 in ch.to_lowercase().chain(ch.to_uppercase()) {
+                            self.push_edge(s1, Test::char(ch1), s);
+                        }
+                        self.push_edge(s1, Other, reject);
+                        s1
+                    })
+                } else {
+                    chars.iter().rev().fold(accept, |s, &ch| {
+                        let s1 = self.new_state(StateKind::Neither);
+                        self.push_edge(s1, Test::char(ch), s);
+                        self.push_edge(s1, Other, reject);
+                        s1
+                    })
+                })
+            }
+
+            Expr::AnyCharNoNL => {
+                // [s0] -otherwise-> [accept]
+                //   |
+                // '\n' etc
+                //   |
+                //   v
+                // [reject]
+
+                let s0 = self.new_state(StateKind::Neither);
+                for nl_char in "\n\r".chars() {
+                    self.push_edge(s0, Test::char(nl_char), reject);
+                }
+                self.push_edge(s0, Other, accept);
+                Ok(s0)
+            }
+
+            Expr::AnyChar => {
+                // [s0] -otherwise-> [accept]
+
+                let s0 = self.new_state(StateKind::Neither);
+                self.push_edge(s0, Other, accept);
+                Ok(s0)
+            }
+
+            Expr::Class(ref class) => {
+                // [s0] --c0--> [accept]
+                //  | |            ^
+                //  | |   ...      |
+                //  | |            |
+                //  | +---cn-------+
+                //  +---------------> [reject]
+
+                let s0 = self.new_state(StateKind::Neither);
+                for &range in class {
+                    let test: Test = range.into();
+                    self.push_edge(s0, test, accept);
+                }
+                self.push_edge(s0, Other, reject);
+                Ok(s0)
+            }
+
+            // currently we don't support any boundaries because
+            // I was too lazy to code them up or think about them
+            Expr::StartLine | Expr::EndLine => Err(NFAConstructionError::LineBoundary),
+
+            Expr::StartText | Expr::EndText => Err(NFAConstructionError::TextBoundary),
+
+            Expr::WordBoundaryAscii
+            | Expr::NotWordBoundaryAscii
+            | Expr::WordBoundary
+            | Expr::NotWordBoundary => Err(NFAConstructionError::WordBoundary),
+
+            // currently we treat all groups the same, whether they
+            // capture or not; but we don't permit named groups,
+            // in case we want to give them significance in the future
+            Expr::Group {
+                ref e,
+                i: _,
+                name: None,
+            } => self.expr(e, accept, reject),
+            Expr::Group { name: Some(_), .. } => Err(NFAConstructionError::NamedCaptures),
+
+            // currently we always report the longest match possible
+            Expr::Repeat { greedy: false, .. } => Err(NFAConstructionError::NonGreedy),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::ZeroOrOne,
+                greedy: true,
+            } => self.optional_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::ZeroOrMore,
+                greedy: true,
+            } => self.star_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::OneOrMore,
+                greedy: true,
+            } => self.plus_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::Range { min, max: None },
+                greedy: true,
+            } => {
+                // +---min times----+
+                // |                |
+                //
+                // [s0] --..e..-- [s1] --..e*..--> [accept]
+                //          |      |
+                //          |      v
+                //          +-> [reject]
+
+                let mut s = try!(self.star_expr(e, accept, reject));
+                for _ in 0..min {
+                    s = try!(self.expr(e, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Repeat {
+                ref e,
+                r:
+                    Repeater::Range {
+                        min,
+                        max: Some(max),
+                    },
+                greedy: true,
+            } => {
+                let mut s = accept;
+                for _ in min..max {
+                    s = try!(self.optional_expr(e, s, reject));
+                }
+                for _ in 0..min {
+                    s = try!(self.expr(e, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Concat(ref exprs) => {
+                let mut s = accept;
+                for expr in exprs.iter().rev() {
+                    s = try!(self.expr(expr, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Alternate(ref exprs) => {
+                // [s0] --exprs[0]--> [accept/reject]
+                //   |                   ^
+                //   |                   |
+                //   +----exprs[..]------+
+                //   |                   |
+                //   |                   |
+                //   +----exprs[n-1]-----+
+
+                let s0 = self.new_state(StateKind::Neither);
+                let targets: Vec<_> = try!(
+                    exprs
+                        .iter()
+                        .map(|expr| self.expr(expr, accept, reject))
+                        .collect()
+                );
+
+                // push edges from s0 all together so they are
+                // adjacant in the edge array
+                for target in targets {
+                    self.push_edge(s0, Noop, target);
+                }
+                Ok(s0)
+            }
+
+            // If we ever support byte regexs, these
+            // can be merged in with the cases above.
+            Expr::AnyByte | Expr::AnyByteNoNL | Expr::ClassBytes(_) | Expr::LiteralBytes { .. } => {
+                Err(NFAConstructionError::ByteRegex)
+            }
+        }
+    }
+
+    fn optional_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        // [s0] ----> [accept]
+        //   |           ^
+        //   v           |
+        // [s1] --...----+
+        //         |
+        //         v
+        //      [reject]
+
+        let s1 = try!(self.expr(expr, accept, reject));
+
+        let s0 = self.new_state(StateKind::Neither);
+        self.push_edge(s0, Noop, accept); // they might supply nothing
+        self.push_edge(s0, Noop, s1);
+
+        Ok(s0)
+    }
+
+    fn star_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        // [s0] ----> [accept]
+        //  | ^
+        //  | |
+        //  | +----------+
+        //  v            |
+        // [s1] --...----+
+        //         |
+        //         v
+        //      [reject]
+
+        let s0 = self.new_state(StateKind::Neither);
+
+        let s1 = try!(self.expr(expr, s0, reject));
+
+        self.push_edge(s0, Noop, accept);
+        self.push_edge(s0, Noop, s1);
+
+        Ok(s0)
+    }
+
+    fn plus_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        //            [accept]
+        //               ^
+        //               |
+        //    +----------+
+        //    v          |
+        // [s0] --...--[s1]
+        //         |
+        //         v
+        //      [reject]
+
+        let s1 = self.new_state(StateKind::Neither);
+
+        let s0 = try!(self.expr(expr, s1, reject));
+
+        self.push_edge(s1, Noop, accept);
+        self.push_edge(s1, Noop, s0);
+
+        Ok(s0)
+    }
+}
+
+pub trait EdgeLabel: Sized {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Self>>;
+    fn vec(nfa: &Edges) -> &Vec<Edge<Self>>;
+    fn first_mut(state: &mut State) -> &mut usize;
+    fn first(state: &State) -> &usize;
+}
+
+impl EdgeLabel for Noop {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Noop>> {
+        &mut nfa.noop_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_noop_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Noop>> {
+        &nfa.noop_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_noop_edge
+    }
+}
+
+impl EdgeLabel for Other {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Other>> {
+        &mut nfa.other_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_other_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Other>> {
+        &nfa.other_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_other_edge
+    }
+}
+
+impl EdgeLabel for Test {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Test>> {
+        &mut nfa.test_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_test_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Test>> {
+        &nfa.test_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_test_edge
+    }
+}
+
+pub struct EdgeIterator<'nfa, L: EdgeLabel + 'nfa> {
+    edges: &'nfa [Edge<L>],
+    from: NFAStateIndex,
+    index: usize,
+}
+
+impl<'nfa, L: EdgeLabel> Iterator for EdgeIterator<'nfa, L> {
+    type Item = &'nfa Edge<L>;
+
+    fn next(&mut self) -> Option<&'nfa Edge<L>> {
+        let index = self.index;
+        if index == usize::MAX {
+            return None;
+        }
+
+        let next_index = index + 1;
+        if next_index >= self.edges.len() || self.edges[next_index].from != self.from {
+            self.index = usize::MAX;
+        } else {
+            self.index = next_index;
+        }
+
+        Some(&self.edges[index])
+    }
+}
+
+impl Test {
+    pub fn char(c: char) -> Test {
+        let c = c as u32;
+        Test {
+            start: c,
+            end: c + 1,
+        }
+    }
+
+    pub fn inclusive_range(s: char, e: char) -> Test {
+        Test {
+            start: s as u32,
+            end: e as u32 + 1,
+        }
+    }
+
+    pub fn exclusive_range(s: char, e: char) -> Test {
+        Test {
+            start: s as u32,
+            end: e as u32,
+        }
+    }
+
+    pub fn is_char(self) -> bool {
+        self.len() == 1
+    }
+
+    pub fn len(self) -> u32 {
+        self.end - self.start
+    }
+
+    pub fn contains_u32(self, c: u32) -> bool {
+        c >= self.start && c < self.end
+    }
+
+    pub fn contains_char(self, c: char) -> bool {
+        self.contains_u32(c as u32)
+    }
+
+    pub fn intersects(self, r: Test) -> bool {
+        !self.is_empty() && !r.is_empty()
+            && (self.contains_u32(r.start) || r.contains_u32(self.start))
+    }
+
+    pub fn is_disjoint(self, r: Test) -> bool {
+        !self.intersects(r)
+    }
+
+    pub fn is_empty(self) -> bool {
+        self.start == self.end
+    }
+}
+
+impl From<ClassRange> for Test {
+    fn from(range: ClassRange) -> Test {
+        Test::inclusive_range(range.start, range.end)
+    }
+}
+
+impl Debug for Test {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        match (char::from_u32(self.start), char::from_u32(self.end)) {
+            (Some(start), Some(end)) => {
+                if self.is_char() {
+                    if ".[]()?+*!".contains(start) {
+                        write!(fmt, "\\{}", start)
+                    } else {
+                        write!(fmt, "{}", start)
+                    }
+                } else {
+                    write!(fmt, "[{:?}..{:?}]", start, end)
+                }
+            }
+            _ => write!(fmt, "[{:?}..{:?}]", self.start, self.end),
+        }
+    }
+}
+
+impl Debug for NFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        write!(fmt, "NFA{}", self.0)
+    }
+}
+
+impl<L: Debug> Debug for Edge<L> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        write!(fmt, "{:?} -{:?}-> {:?}", self.from, self.label, self.to)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/nfa/test.rs
@@ -0,0 +1,159 @@
+use lexer::nfa::{NFAConstructionError, Noop, Other, StateKind, Test, NFA};
+use lexer::nfa::interpret::interpret;
+use lexer::re;
+
+#[test]
+fn edge_iter() {
+    let mut nfa = NFA::new();
+    let s0 = nfa.new_state(StateKind::Neither);
+    let s1 = nfa.new_state(StateKind::Neither);
+    let s2 = nfa.new_state(StateKind::Neither);
+    let s3 = nfa.new_state(StateKind::Neither);
+
+    nfa.push_edge(s2, Noop, s3);
+    nfa.push_edge(s0, Noop, s1);
+    nfa.push_edge(s0, Noop, s3);
+    nfa.push_edge(s1, Noop, s2);
+
+    // check that if we mixed up the indies between Noop/Other, we'd get wrong thing here
+    nfa.push_edge(s0, Other, s2);
+
+    let s0_edges: Vec<_> = nfa.edges::<Noop>(s0).map(|e| e.to).collect();
+    let s1_edges: Vec<_> = nfa.edges::<Noop>(s1).map(|e| e.to).collect();
+    let s2_edges: Vec<_> = nfa.edges::<Noop>(s2).map(|e| e.to).collect();
+    let s3_edges: Vec<_> = nfa.edges::<Noop>(s3).map(|e| e.to).collect();
+
+    let s0_other_edges: Vec<_> = nfa.edges::<Other>(s0).map(|e| e.to).collect();
+    let s0_test_edges: Vec<_> = nfa.edges::<Test>(s0).map(|e| e.to).collect();
+
+    assert_eq!(s0_edges, &[s1, s3]);
+    assert_eq!(s1_edges, &[s2]);
+    assert_eq!(s2_edges, &[s3]);
+    assert_eq!(s3_edges, &[]);
+
+    assert_eq!(s0_other_edges, &[s2]);
+    assert_eq!(s0_test_edges, &[]);
+}
+
+#[test]
+fn identifier_regex() {
+    let ident = re::parse_regex(r#"[a-zA-Z_][a-zA-Z0-9_]*"#).unwrap();
+    println!("{:#?}", ident);
+    let nfa = NFA::from_re(&ident).unwrap();
+    println!("{:#?}", nfa);
+    assert_eq!(interpret(&nfa, "0123"), None);
+    assert_eq!(interpret(&nfa, "hello0123"), Some("hello0123"));
+    assert_eq!(interpret(&nfa, "hello0123 abc"), Some("hello0123"));
+    assert_eq!(interpret(&nfa, "_0123 abc"), Some("_0123"));
+}
+
+#[test]
+fn regex_star_group() {
+    let ident = re::parse_regex(r#"(abc)*"#).unwrap();
+    let nfa = NFA::from_re(&ident).unwrap();
+    assert_eq!(interpret(&nfa, "abcabcabcab"), Some("abcabcabc"));
+}
+
+#[test]
+fn regex_number() {
+    let num = re::parse_regex(r#"[0-9]+"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "123"), Some("123"));
+}
+
+#[test]
+fn dot_newline() {
+    let num = re::parse_regex(r#"."#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "\n"), None);
+}
+
+#[test]
+fn max_range() {
+    let num = re::parse_regex(r#"ab{2,4}"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "a"), None);
+    assert_eq!(interpret(&nfa, "ab"), None);
+    assert_eq!(interpret(&nfa, "abb"), Some("abb"));
+    assert_eq!(interpret(&nfa, "abbb"), Some("abbb"));
+    assert_eq!(interpret(&nfa, "abbbb"), Some("abbbb"));
+    assert_eq!(interpret(&nfa, "abbbbb"), Some("abbbb"));
+    assert_eq!(interpret(&nfa, "ac"), None);
+}
+
+#[test]
+fn literal() {
+    let num = re::parse_regex(r#"(?i:aBCdeF)"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "abcdef"), Some("abcdef"));
+    assert_eq!(interpret(&nfa, "AbcDEf"), Some("AbcDEf"));
+}
+
+// Test that uses of disallowed features trigger errors
+// during NFA construction:
+
+#[test]
+fn captures() {
+    let num = re::parse_regex(r#"(aBCdeF)"#).unwrap();
+    NFA::from_re(&num).unwrap(); // captures are ok
+
+    let num = re::parse_regex(r#"(?:aBCdeF)"#).unwrap();
+    NFA::from_re(&num).unwrap(); // non-captures are ok
+
+    let num = re::parse_regex(r#"(?P<foo>aBCdeF)"#).unwrap(); // named captures are not
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::NamedCaptures
+    );
+}
+
+#[test]
+fn line_boundaries() {
+    let num = re::parse_regex(r#"^aBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::TextBoundary
+    );
+
+    let num = re::parse_regex(r#"aBCdeF$"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::TextBoundary
+    );
+}
+
+#[test]
+fn text_boundaries() {
+    let num = re::parse_regex(r#"(?m)^aBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::LineBoundary
+    );
+
+    let num = re::parse_regex(r#"(?m)aBCdeF$"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::LineBoundary
+    );
+}
+
+#[test]
+fn word_boundaries() {
+    let num = re::parse_regex(r#"\baBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::WordBoundary
+    );
+
+    let num = re::parse_regex(r#"aBCdeF\B"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::WordBoundary
+    );
+}
+
+#[test]
+fn issue_101() {
+    let num = re::parse_regex(r#"(1|0?)"#).unwrap();
+    NFA::from_re(&num).unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/re/mod.rs
@@ -0,0 +1,23 @@
+//! A parser and representation of regular expressions.
+
+use regex_syntax::{self, Error, Expr};
+
+#[cfg(test)]
+mod test;
+
+pub type Regex = Expr;
+pub type RegexError = Error;
+
+/// Convert a string literal into a parsed regular expression.
+pub fn parse_literal(s: &str) -> Regex {
+    match parse_regex(&regex_syntax::escape(s)) {
+        Ok(v) => v,
+        Err(_) => panic!("failed to parse literal regular expression"),
+    }
+}
+
+/// Parse a regular expression like `a+` etc.
+pub fn parse_regex(s: &str) -> Result<Regex, RegexError> {
+    let expr = try!(Expr::parse(s));
+    Ok(expr)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lexer/re/test.rs
@@ -0,0 +1,11 @@
+use super::*;
+
+#[test]
+fn parse_unclosed_group() {
+    parse_regex(r"(123").unwrap_err();
+}
+
+#[test]
+fn alt_oom() {
+    parse_regex(r"(%%|[^%])+").unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lib.rs
@@ -0,0 +1,56 @@
+// Need this for rusty_peg
+#![recursion_limit = "256"]
+// I hate this lint.
+#![allow(unused_parens)]
+// The builtin tests don't cover the CLI and so forth, and it's just
+// too darn annoying to try and make them do so.
+#![cfg_attr(test, allow(dead_code))]
+
+extern crate ascii_canvas;
+extern crate atty;
+extern crate bit_set;
+extern crate diff;
+extern crate ena;
+extern crate itertools;
+extern crate lalrpop_util;
+extern crate petgraph;
+extern crate regex;
+extern crate regex_syntax;
+extern crate string_cache;
+extern crate term;
+extern crate unicode_xid;
+
+#[cfg(test)]
+extern crate rand;
+
+// hoist the modules that define macros up earlier
+#[macro_use]
+mod rust;
+#[macro_use]
+mod log;
+
+mod api;
+mod build;
+mod collections;
+mod file_text;
+mod grammar;
+mod lexer;
+mod lr1;
+mod message;
+mod normalize;
+mod parser;
+mod kernel_set;
+mod session;
+mod tls;
+mod tok;
+mod util;
+
+#[cfg(test)]
+mod generate;
+#[cfg(test)]
+mod test_util;
+
+pub use api::Configuration;
+pub use api::process_root;
+pub use api::process_root_unconditionally;
+use ascii_canvas::style;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/log.rs
@@ -0,0 +1,64 @@
+#[derive(Clone)]
+pub struct Log {
+    level: Level,
+}
+
+#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)]
+pub enum Level {
+    /// No updates unless an error arises.
+    Taciturn,
+
+    /// Timing and minimal progress.
+    Informative,
+
+    /// More details, but still stuff an end-user is likely to understand.
+    Verbose,
+
+    /// Everything you could ever want and then some more.
+    Debug,
+}
+
+impl Log {
+    pub fn new(level: Level) -> Log {
+        Log { level: level }
+    }
+
+    pub fn set_level(&mut self, level: Level) {
+        self.level = level;
+    }
+
+    pub fn log<M>(&self, level: Level, message: M)
+    where
+        M: FnOnce() -> String,
+    {
+        if self.level >= level {
+            println!("{}", message());
+        }
+    }
+}
+
+macro_rules! log {
+    ($session:expr, $level:ident, $($args:expr),*) => {
+        $session.log(::log::Level::$level, || ::std::fmt::format(format_args!($($args),*)))
+    }
+}
+
+macro_rules! debug {
+    ($($args:expr),*) => {
+        log!(::tls::Tls::session(), Debug, $($args),*)
+    }
+}
+
+macro_rules! profile {
+    ($session:expr, $phase_name:expr, $action:expr) => {
+        {
+            log!($session, Verbose, "Phase `{}` begun", $phase_name);
+            let time_stamp = ::std::time::Instant::now();
+            let result = $action;
+            let elapsed = time_stamp.elapsed();
+            log!($session, Verbose, "Phase `{}` completed in {} seconds",
+                 $phase_name, elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1000_000_000.0);
+            result
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/build/mod.rs
@@ -0,0 +1,357 @@
+//! LR(1) state construction algorithm.
+
+use collections::{map, Multimap};
+use kernel_set;
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::first;
+use lr1::lane_table::*;
+use lr1::lookahead::*;
+use std::rc::Rc;
+use std::env;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+fn build_lr1_states_legacy<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    let eof = TokenSet::eof();
+    let mut lr1: LR<'grammar, TokenSet> = LR::new(grammar, start, eof);
+    lr1.set_permit_early_stop(true);
+    lr1.build_states()
+}
+
+type ConstructionFunction<'grammar> =
+    fn(&'grammar Grammar, NonterminalString) -> LR1Result<'grammar>;
+
+pub fn use_lane_table() -> bool {
+    match env::var("LALRPOP_LANE_TABLE") {
+        Ok(ref s) => s != "disabled",
+        _ => true,
+    }
+}
+
+pub fn build_lr1_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    let (method_name, method_fn) = if use_lane_table() {
+        ("lane", build_lane_table_states as ConstructionFunction)
+    } else {
+        ("legacy", build_lr1_states_legacy as ConstructionFunction)
+    };
+
+    profile! {
+        &Tls::session(),
+        format!("LR(1) state construction ({})", method_name),
+        {
+            method_fn(grammar, start)
+        }
+    }
+}
+
+pub fn build_lr0_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> Result<Vec<LR0State<'grammar>>, LR0TableConstructionError<'grammar>> {
+    let lr1 = LR::new(grammar, start, Nil);
+    lr1.build_states()
+}
+
+pub struct LR<'grammar, L: LookaheadBuild> {
+    grammar: &'grammar Grammar,
+    first_sets: first::FirstSets,
+    start_nt: NonterminalString,
+    start_lookahead: L,
+    permit_early_stop: bool,
+}
+
+impl<'grammar, L: LookaheadBuild> LR<'grammar, L> {
+    fn new(grammar: &'grammar Grammar, start_nt: NonterminalString, start_lookahead: L) -> Self {
+        LR {
+            grammar: grammar,
+            first_sets: first::FirstSets::new(grammar),
+            start_nt: start_nt,
+            start_lookahead: start_lookahead,
+            permit_early_stop: false,
+        }
+    }
+
+    fn set_permit_early_stop(&mut self, v: bool) {
+        self.permit_early_stop = v;
+    }
+
+    fn build_states(&self) -> Result<Vec<State<'grammar, L>>, TableConstructionError<'grammar, L>> {
+        let session = Tls::session();
+        let mut kernel_set = kernel_set::KernelSet::new();
+        let mut states = vec![];
+        let mut conflicts = vec![];
+
+        // create the starting state
+        kernel_set.add_state(Kernel::start(self.items(
+            &self.start_nt,
+            0,
+            &self.start_lookahead,
+        )));
+
+        while let Some(Kernel { items: seed_items }) = kernel_set.next() {
+            let items = self.transitive_closure(seed_items);
+            let index = StateIndex(states.len());
+
+            if index.0 % 5000 == 0 && index.0 > 0 {
+                log!(session, Verbose, "{} states created so far.", index.0);
+            }
+
+            let mut this_state = State {
+                index: index,
+                items: items.clone(),
+                shifts: map(),
+                reductions: vec![],
+                gotos: map(),
+            };
+
+            // group the items that we can transition into by shifting
+            // over a term or nonterm
+            let transitions: Multimap<Symbol, Multimap<LR0Item<'grammar>, L>> = items
+                .vec
+                .iter()
+                .filter_map(|item| item.shifted_item())
+                .map(
+                    |(
+                        symbol,
+                        Item {
+                            production,
+                            index,
+                            lookahead,
+                        },
+                    )| { (symbol, (Item::lr0(production, index), lookahead)) },
+                )
+                .collect();
+
+            for (symbol, shifted_items) in transitions.into_iter() {
+                let shifted_items: Vec<Item<'grammar, L>> = shifted_items
+                    .into_iter()
+                    .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+                    .collect();
+
+                // Not entirely obvious: if the original set of items
+                // is sorted to begin with (and it is), then this new
+                // set of shifted items is *also* sorted. This is
+                // because it is produced from the old items by simply
+                // incrementing the index by 1.
+                let next_state = kernel_set.add_state(Kernel::shifted(shifted_items));
+
+                match symbol {
+                    Symbol::Terminal(s) => {
+                        let prev = this_state.shifts.insert(s, next_state);
+                        assert!(prev.is_none()); // cannot have a shift/shift conflict
+                    }
+
+                    Symbol::Nonterminal(s) => {
+                        let prev = this_state.gotos.insert(s, next_state);
+                        assert!(prev.is_none());
+                    }
+                }
+            }
+
+            // finally, consider the reductions
+            for item in items.vec.iter().filter(|i| i.can_reduce()) {
+                this_state
+                    .reductions
+                    .push((item.lookahead.clone(), item.production));
+            }
+
+            // check for shift-reduce conflicts (reduce-reduce detected above)
+            conflicts.extend(L::conflicts(&this_state));
+
+            // extract a new state
+            states.push(this_state);
+
+            if self.permit_early_stop && session.stop_after(conflicts.len()) {
+                log!(
+                    session,
+                    Verbose,
+                    "{} conflicts encountered, stopping.",
+                    conflicts.len()
+                );
+                break;
+            }
+        }
+
+        if !conflicts.is_empty() {
+            Err(TableConstructionError {
+                states: states,
+                conflicts: conflicts,
+            })
+        } else {
+            Ok(states)
+        }
+    }
+
+    fn items(&self, id: &NonterminalString, index: usize, lookahead: &L) -> Vec<Item<'grammar, L>> {
+        self.grammar
+            .productions_for(id)
+            .iter()
+            .map(|production| {
+                debug_assert!(index <= production.symbols.len());
+                Item {
+                    production: production,
+                    index: index,
+                    lookahead: lookahead.clone(),
+                }
+            })
+            .collect()
+    }
+
+    // expands `state` with epsilon moves
+    fn transitive_closure(&self, items: Vec<Item<'grammar, L>>) -> Items<'grammar, L> {
+        let mut stack: Vec<LR0Item<'grammar>> = items.iter().map(|item| item.to_lr0()).collect();
+        let mut map: Multimap<LR0Item<'grammar>, L> = items
+            .into_iter()
+            .map(|item| (item.to_lr0(), item.lookahead))
+            .collect();
+
+        while let Some(item) = stack.pop() {
+            let lookahead = map.get(&item).unwrap().clone();
+
+            let shift_symbol = item.shift_symbol();
+
+            // Check whether this is an item where the cursor
+            // is resting on a non-terminal:
+            //
+            // I = ... (*) X z... [lookahead]
+            //
+            // The `nt` will be X and the `remainder` will be `z...`.
+            let (nt, remainder) = match shift_symbol {
+                None => continue, // requires a reduce
+                Some((Symbol::Terminal(_), _)) => {
+                    continue; // requires a shift
+                }
+                Some((Symbol::Nonterminal(nt), remainder)) => (nt, remainder),
+            };
+
+            // In that case, for each production of `X`, we are also
+            // in a state where the cursor rests at the start of that production:
+            //
+            // X = (*) a... [lookahead']
+            // X = (*) b... [lookahead']
+            //
+            // Here `lookahead'` is computed based on the `remainder` and our
+            // `lookahead`. In LR1 at least, it is the union of:
+            //
+            //   (a) FIRST(remainder)
+            //   (b) if remainder may match epsilon, also our lookahead.
+            for new_item in L::epsilon_moves(self, &nt, remainder, &lookahead) {
+                let new_item0 = new_item.to_lr0();
+                if map.push(new_item0, new_item.lookahead) {
+                    stack.push(new_item0);
+                }
+            }
+        }
+
+        let final_items = map.into_iter()
+            .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+            .collect();
+
+        Items {
+            vec: Rc::new(final_items),
+        }
+    }
+}
+
+/// Except for the initial state, the kernel sets always contain
+/// a set of "seed" items where something has been pushed (that is,
+/// index > 0). In other words, items like this:
+///
+///    A = ...p (*) ...
+///
+/// where ...p is non-empty. We now have to expand to include any
+/// epsilon moves:
+///
+///    A = ... (*) B ...
+///    B = (*) ...        // added by transitive_closure algorithm
+///
+/// But note that the state is completely identified by its
+/// kernel set: the same kernel sets always expand to the
+/// same transitive closures, and different kernel sets
+/// always expand to different transitive closures. The
+/// first point is obvious, but the latter point follows
+/// because the transitive closure algorithm only adds
+/// items where `index == 0`, and hence it can never add an
+/// item found in a kernel set.
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct Kernel<'grammar, L: LookaheadBuild> {
+    items: Vec<Item<'grammar, L>>,
+}
+
+impl<'grammar, L: LookaheadBuild> Kernel<'grammar, L> {
+    pub fn start(items: Vec<Item<'grammar, L>>) -> Kernel<'grammar, L> {
+        // In start state, kernel should have only items with `index == 0`.
+        debug_assert!(items.iter().all(|item| item.index == 0));
+        Kernel { items: items }
+    }
+
+    pub fn shifted(items: Vec<Item<'grammar, L>>) -> Kernel<'grammar, L> {
+        // Assert that this kernel consists only of shifted items
+        // where `index > 0`. This assertion could cost real time to
+        // check so only do it in debug mode.
+        debug_assert!(items.iter().all(|item| item.index > 0));
+        Kernel { items: items }
+    }
+}
+
+impl<'grammar, L: LookaheadBuild> kernel_set::Kernel for Kernel<'grammar, L> {
+    type Index = StateIndex;
+
+    fn index(c: usize) -> StateIndex {
+        StateIndex(c)
+    }
+}
+
+pub trait LookaheadBuild: Lookahead {
+    // Given that there exists an item
+    //
+    //     X = ... (*) Y ...s [L]
+    //
+    // where `nt` is `Y`, `remainder` is `...s`, and `lookahead` is
+    // `L`, computes the new items resulting from epsilon moves (if
+    // any). The technique of doing this will depend on the amount of
+    // lookahead.
+    //
+    // For example, if we have an LR0 item, then for each `Y = ...`
+    // production, we just add an `Y = (*) ...` item. But for LR1
+    // items, we have to add multiple items where we consider the
+    // lookahead from `FIRST(...s, L)`.
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        remainder: &[Symbol],
+        lookahead: &Self,
+    ) -> Vec<Item<'grammar, Self>>;
+}
+
+impl LookaheadBuild for Nil {
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        _remainder: &[Symbol],
+        lookahead: &Nil,
+    ) -> Vec<LR0Item<'grammar>> {
+        lr.items(nt, 0, &lookahead)
+    }
+}
+
+impl LookaheadBuild for TokenSet {
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        remainder: &[Symbol],
+        lookahead: &Self,
+    ) -> Vec<LR1Item<'grammar>> {
+        let first_set = lr.first_sets.first1(remainder, lookahead);
+        lr.items(nt, 0, &first_set)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/build/test.rs
@@ -0,0 +1,354 @@
+use string_cache::DefaultAtom as Atom;
+use generate;
+use grammar::repr::*;
+use test_util::{compare, expect_debug, normalized_grammar};
+use lr1::core::*;
+use lr1::interpret::interpret;
+use lr1::lookahead::Token;
+use lr1::lookahead::Token::EOF;
+use lr1::lookahead::TokenSet;
+use lr1::tls::Lr1Tls;
+use tls::Tls;
+
+use super::{use_lane_table, build_lr0_states, build_lr1_states, LR};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+const ITERATIONS: usize = 22;
+
+fn random_test<'g>(grammar: &Grammar, states: &'g [LR1State<'g>], start_symbol: NonterminalString) {
+    for i in 0..ITERATIONS {
+        let input_tree = generate::random_parse_tree(grammar, start_symbol.clone());
+        let output_tree = interpret(&states, input_tree.terminals()).unwrap();
+
+        println!("test {}", i);
+        println!("input_tree = {}", input_tree);
+        println!("output_tree = {}", output_tree);
+
+        compare(output_tree, input_tree);
+    }
+}
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+fn items<'g>(grammar: &'g Grammar, nonterminal: &str, index: usize, la: Token) -> LR1Items<'g> {
+    let set = TokenSet::from(la);
+    let lr1: LR<TokenSet> = LR::new(&grammar, nt(nonterminal), set.clone());
+    let items = lr1.transitive_closure(lr1.items(&nt(nonterminal), index, &set));
+    items
+}
+
+#[test]
+fn start_state() {
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "C" => .., "D" => .. } }
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        () => None
+    };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let items = items(&grammar, "A", 0, EOF);
+    expect_debug(
+        items.vec,
+        r#"[
+    A = (*) B "C" [EOF],
+    B = (*) ["C"],
+    B = (*) "D" ["C"]
+]"#,
+    );
+}
+
+#[test]
+fn start_state_1() {
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+extern { enum Tok { "B1" => .., "C1" => .. } }
+A = B C;
+B: Option<u32> = {
+    "B1" => Some(1),
+    () => None
+};
+C: Option<u32> = {
+    "C1" => Some(1),
+    () => None
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    expect_debug(
+        items(&grammar, "A", 0, EOF).vec,
+        r#"[
+    A = (*) B C [EOF],
+    B = (*) ["C1", EOF],
+    B = (*) "B1" ["C1", EOF]
+]"#,
+    );
+
+    expect_debug(
+        items(&grammar, "A", 1, EOF).vec,
+        r#"[
+    A = B (*) C [EOF],
+    C = (*) [EOF],
+    C = (*) "C1" [EOF]
+]"#,
+    );
+}
+
+#[test]
+fn expr_grammar1() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "-" => .., "N" => .., "(" => .., ")" => .. } }
+
+    S: () =
+        E => ();
+
+    E: () = {
+        E "-" T => (),
+        T => ()
+    };
+
+    T: () = {
+        "N" => (),
+        "(" E ")" => ()
+    };
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    // for now, just test that process does not result in an error
+    // and yields expected number of states.
+    let states = build_lr1_states(&grammar, nt("S")).unwrap();
+    println!("{:#?}", states);
+    assert_eq!(states.len(), if use_lane_table() { 9 } else { 16 });
+
+    // execute it on some sample inputs.
+    let tree = interpret(&states, tokens!["N", "-", "(", "N", "-", "N", ")"]).unwrap();
+    assert_eq!(
+        &format!("{}", tree)[..],
+        r#"[S: [E: [E: [T: "N"]], "-", [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]]]"#
+    );
+
+    // incomplete:
+    assert!(interpret(&states, tokens!["N", "-", "(", "N", "-", "N"]).is_err());
+
+    // incomplete:
+    assert!(interpret(&states, tokens!["N", "-"]).is_err());
+
+    // unexpected character:
+    assert!(interpret(&states, tokens!["N", "-", ")", "N", "-", "N", "("]).is_err());
+
+    // parens first:
+    let tree = interpret(&states, tokens!["(", "N", "-", "N", ")", "-", "N"]).unwrap();
+    println!("{}", tree);
+    assert_eq!(
+        &format!("{}", tree)[..],
+        r#"[S: [E: [E: [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]], "-", [T: "N"]]]"#
+    );
+
+    // run some random tests
+    random_test(&grammar, &states, nt("S"));
+}
+
+#[test]
+fn shift_reduce_conflict1() {
+    let _tls = Tls::test();
+
+    // This grammar gets a shift-reduce conflict because if the input
+    // is "&" (*) "L", then we see two possibilities, and we must decide
+    // between them:
+    //
+    // "&" (*) "L" E
+    //  |       |  |
+    //  +-------+--|
+    //          |
+    //          E
+    //
+    // or
+    //
+    // "&"      (*) "L"
+    //  |            |
+    //  |  OPT_L     E
+    //  |   |        |
+    //  +---+---+----+
+    //          |
+    //          E
+    //
+    // to some extent this may be a false conflict, in that inlined
+    // rules would address it, but it's an interesting one for
+    // producing a useful error message.
+
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+        extern { enum Tok { "L" => .., "&" => .., } }
+        E: () = {
+            "L",
+            "&" OPT_L E
+        };
+        OPT_L: () = {
+            (),
+            "L"
+        };
+    "#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    assert!(build_lr1_states(&grammar, nt("E")).is_err());
+}
+
+/// One of the few grammars that IS LR(0).
+#[test]
+fn lr0_expr_grammar_with_explicit_eof() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+S: () = E "$";
+
+E: () = {
+    E "-" T,
+    T,
+};
+
+T: () = {
+    "N",
+    "(" E ")",
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    // for now, just test that process does not result in an error
+    // and yields expected number of states.
+    let states = build_lr0_states(&grammar, nt("S")).unwrap();
+    assert_eq!(states.len(), 10);
+}
+
+/// Without the artifical '$', grammar is not LR(0).
+#[test]
+fn lr0_expr_grammar_with_implicit_eof() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+S: () = E;
+
+E: () = {
+    E "-" T,
+    T,
+};
+
+T: () = {
+    "N",
+    "(" E ")",
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    build_lr0_states(&grammar, nt("S")).unwrap_err();
+}
+
+/// When we moved to storing items as (lr0 -> TokenSet) pairs, a bug
+/// in the transitive closure routine could cause us to have `(Foo,
+/// S0)` and `(Foo, S1)` as distinct items instead of `(Foo, S0|S1)`.
+#[test]
+fn issue_144() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub ForeignItem: () = {
+  AttrsAndVis "item_foreign_fn",
+  AttrsAndVis "unsafe" "item_foreign_fn",
+};
+
+AttrsAndVis: () = {
+    MaybeOuterAttrs visibility,
+};
+
+MaybeOuterAttrs: () = {
+    OuterAttrs,
+    (),
+};
+
+visibility: () = {
+  "pub",
+  (),
+};
+
+OuterAttrs: () = {
+    OuterAttr,
+    OuterAttrs OuterAttr,
+};
+
+OuterAttr: () = {
+    "#" "[" "]",
+};
+
+Ident: () = {
+    "IDENT",
+};
+
+ty: () = {
+    "ty"
+};
+"##,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    build_lr1_states(&grammar, nt("ForeignItem")).unwrap();
+}
+
+// Not sure if this is the right spot
+#[test]
+fn match_grammar() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+match {
+    r"(?i)select" => SELECT
+} else {
+    _
+}
+
+pub Query = SELECT r"[a-z]+";
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    let states = build_lr0_states(&grammar, nt("Query")).expect("build states");
+    println!("states: {:?}", states);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/build_lalr/mod.rs
@@ -0,0 +1,163 @@
+//! Mega naive LALR(1) generation algorithm.
+
+use collections::{map, Map, Multimap};
+use itertools::Itertools;
+use lr1::build;
+use lr1::core::*;
+use lr1::lookahead::*;
+use grammar::repr::*;
+use std::rc::Rc;
+use std::mem;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+// Intermediate LALR(1) state. Identical to an LR(1) state, but that
+// the items can be pushed to. We initially create these with an empty
+// set of actions, as well.
+struct LALR1State<'grammar> {
+    pub index: StateIndex,
+    pub items: Vec<LR1Item<'grammar>>,
+    pub shifts: Map<TerminalString, StateIndex>,
+    pub reductions: Multimap<&'grammar Production, TokenSet>,
+    pub gotos: Map<NonterminalString, StateIndex>,
+}
+
+pub fn build_lalr_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    // First build the LR(1) states
+    let lr_states = try!(build::build_lr1_states(grammar, start));
+
+    // With lane table, there is no reason to do state collapse
+    // for LALR. In fact, LALR is pointless!
+    if build::use_lane_table() {
+        println!("Warning: Now that the new lane-table algorithm is the default,");
+        println!("         #[lalr] mode has no effect and can be removed.");
+        return Ok(lr_states);
+    }
+
+    profile! {
+        &Tls::session(),
+        "LALR(1) state collapse",
+        collapse_to_lalr_states(&lr_states)
+    }
+}
+
+pub fn collapse_to_lalr_states<'grammar>(lr_states: &[LR1State<'grammar>]) -> LR1Result<'grammar> {
+    // Now compress them. This vector stores, for each state, the
+    // LALR(1) state to which we will remap it.
+    let mut remap: Vec<_> = (0..lr_states.len()).map(|_| StateIndex(0)).collect();
+    let mut lalr1_map: Map<Vec<LR0Item>, StateIndex> = map();
+    let mut lalr1_states: Vec<LALR1State> = vec![];
+
+    for (lr1_index, lr1_state) in lr_states.iter().enumerate() {
+        let lr0_kernel: Vec<_> = lr1_state
+            .items
+            .vec
+            .iter()
+            .map(|item| item.to_lr0())
+            .dedup()
+            .collect();
+
+        let lalr1_index = *lalr1_map.entry(lr0_kernel).or_insert_with(|| {
+            let index = StateIndex(lalr1_states.len());
+            lalr1_states.push(LALR1State {
+                index: index,
+                items: vec![],
+                shifts: map(),
+                reductions: Multimap::new(),
+                gotos: map(),
+            });
+            index
+        });
+
+        lalr1_states[lalr1_index.0]
+            .items
+            .extend(lr1_state.items.vec.iter().cloned());
+
+        remap[lr1_index] = lalr1_index;
+    }
+
+    // The reduction process can leave us with multiple
+    // overlapping LR(0) items, whose lookaheads must be
+    // unioned. e.g. we may now have:
+    //
+    //     X = "(" (*) ")" ["Foo"]
+    //     X = "(" (*) ")" ["Bar"]
+    //
+    // which we will convert to:
+    //
+    //     X = "(" (*) ")" ["Foo", "Bar"]
+    for lalr1_state in &mut lalr1_states {
+        let items = mem::replace(&mut lalr1_state.items, vec![]);
+
+        let items: Multimap<LR0Item<'grammar>, TokenSet> = items
+            .into_iter()
+            .map(
+                |Item {
+                     production,
+                     index,
+                     lookahead,
+                 }| { (Item::lr0(production, index), lookahead) },
+            )
+            .collect();
+
+        lalr1_state.items = items
+            .into_iter()
+            .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+            .collect();
+    }
+
+    // Now that items are fully built, create the actions
+    for (lr1_index, lr1_state) in lr_states.iter().enumerate() {
+        let lalr1_index = remap[lr1_index];
+        let lalr1_state = &mut lalr1_states[lalr1_index.0];
+
+        for (terminal, &lr1_state) in &lr1_state.shifts {
+            let target_state = remap[lr1_state.0];
+            let prev = lalr1_state.shifts.insert(terminal.clone(), target_state);
+            assert!(prev.unwrap_or(target_state) == target_state);
+        }
+
+        for (nt, lr1_state) in &lr1_state.gotos {
+            let target_state = remap[lr1_state.0];
+            let prev = lalr1_state.gotos.insert(nt.clone(), target_state);
+            assert!(prev.unwrap_or(target_state) == target_state); // as above
+        }
+
+        for &(ref token_set, production) in &lr1_state.reductions {
+            lalr1_state.reductions.push(production, token_set.clone());
+        }
+    }
+
+    // Finally, create the new states and detect conflicts
+    let lr1_states: Vec<_> = lalr1_states
+        .into_iter()
+        .map(|lr| State {
+            index: lr.index,
+            items: Items {
+                vec: Rc::new(lr.items),
+            },
+            shifts: lr.shifts,
+            reductions: lr.reductions.into_iter().map(|(p, ts)| (ts, p)).collect(),
+            gotos: lr.gotos,
+        })
+        .collect();
+
+    let conflicts: Vec<_> = lr1_states
+        .iter()
+        .flat_map(|s| TokenSet::conflicts(s))
+        .collect();
+
+    if !conflicts.is_empty() {
+        Err(TableConstructionError {
+            states: lr1_states,
+            conflicts: conflicts,
+        })
+    } else {
+        Ok(lr1_states)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/build_lalr/test.rs
@@ -0,0 +1,49 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use tls::Tls;
+use super::build_lalr_states;
+use super::super::interpret::interpret;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+#[test]
+fn figure9_23() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+        extern { enum Tok { "-" => .., "N" => .., "(" => .., ")" => .. } }
+        S: () = E       => ();
+        E: () = {
+            E "-" T     => (),
+            T           => ()
+        };
+        T: () = {
+            "N"         => (),
+            "(" E ")"   => ()
+        };
+   "#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    let states = build_lalr_states(&grammar, nt("S")).unwrap();
+    println!("{:#?}", states);
+
+    let tree = interpret(&states, tokens!["N", "-", "(", "N", "-", "N", ")"]).unwrap();
+    assert_eq!(
+        &format!("{:?}", tree)[..],
+        r#"[S: [E: [E: [T: "N"]], "-", [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]]]"#
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/codegen/ascent.rs
@@ -0,0 +1,1019 @@
+//! A compiler from an LR(1) table to a [recursive ascent] parser.
+//!
+//! [recursive ascent]: https://en.wikipedia.org/wiki/Recursive_ascent_parser
+
+use collections::{Multimap, Set};
+use grammar::parse_tree::WhereClause;
+use grammar::repr::{Grammar, NonterminalString, Production, Symbol, TerminalString, TypeParameter,
+                    TypeRepr, Visibility};
+use lr1::core::*;
+use lr1::lookahead::Token;
+use lr1::state_graph::StateGraph;
+use rust::RustWrite;
+use std::io::{self, Write};
+use tls::Tls;
+use util::{Escape, Sep};
+
+use super::base::CodeGenerator;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    action_module: &str,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let graph = StateGraph::new(&states);
+    let mut ascent = CodeGenerator::new_ascent(
+        grammar,
+        user_start_symbol,
+        start_symbol,
+        &graph,
+        states,
+        action_module,
+        out,
+    );
+    ascent.write()
+}
+
+struct RecursiveAscent<'ascent, 'grammar> {
+    graph: &'ascent StateGraph,
+
+    /// for each state, the set of symbols that it will require for
+    /// input
+    state_inputs: Vec<StackSuffix<'grammar>>,
+
+    /// type parameters for the `Nonterminal` type
+    nonterminal_type_params: Vec<TypeParameter>,
+
+    nonterminal_where_clauses: Vec<WhereClause<TypeRepr>>,
+}
+
+/// Tracks the suffix of the stack (that is, top-most elements) that any
+/// particular state is aware of. We break the suffix into two parts:
+/// optional and fixed, which always look like this:
+///
+/// ```
+/// ... A B C X Y Z
+/// ~~~ ~~~~~ ~~~~~
+///  |    |     |
+///  |    |   Fixed (top of the stack)
+///  |    |
+///  |  Optional (will be popped after the fixed portion)
+///  |
+/// Prefix (stuff we don't know about that is also on the stack
+/// ```
+///
+/// The idea of an "optional" member is not that it may or may not be
+/// on the stack. The entire suffix will always be on the stack. An
+/// *optional* member is one that *we* may or may not *consume*. So
+/// the above stack suffix could occur given a state with items like:
+///
+/// ```
+/// NT1 = A B C X Y Z (*) "."
+/// NT2 = X Y Z (*) ","
+/// ```
+///
+/// Depending on what comes next, if we reduce NT1, we will consume
+/// all six symbols, but if we reduce NT2, we will only reduce three.
+#[derive(Copy, Clone, Debug)]
+struct StackSuffix<'grammar> {
+    /// all symbols that are known to be on the stack (optional + fixed).
+    all: &'grammar [Symbol],
+
+    /// optional symbols will be consumed by *some* reductions in this
+    /// state, but not all
+    len_optional: usize,
+}
+
+impl<'grammar> StackSuffix<'grammar> {
+    fn len(&self) -> usize {
+        self.all.len()
+    }
+
+    /// returns the (optional, fixed) -- number of optional
+    /// items in stack prefix and numer of fixed
+    fn optional_fixed_lens(&self) -> (usize, usize) {
+        (self.len_optional, self.len() - self.len_optional)
+    }
+
+    fn is_not_empty(&self) -> bool {
+        self.len() > 0
+    }
+
+    fn optional(&self) -> &'grammar [Symbol] {
+        &self.all[..self.len_optional]
+    }
+
+    fn fixed(&self) -> &'grammar [Symbol] {
+        &self.all[self.len_optional..]
+    }
+}
+
+impl<'ascent, 'grammar, W: Write>
+    CodeGenerator<'ascent, 'grammar, W, RecursiveAscent<'ascent, 'grammar>>
+{
+    fn new_ascent(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        graph: &'ascent StateGraph,
+        states: &'ascent [LR1State<'grammar>],
+        action_module: &str,
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        // The nonterminal type needs to be parameterized by all the
+        // type parameters that actually appear in the types of
+        // nonterminals.  We can't just use *all* type parameters
+        // because that would leave unused lifetime/type parameters in
+        // some cases.
+        let referenced_ty_params: Set<TypeParameter> = grammar
+            .types
+            .nonterminal_types()
+            .into_iter()
+            .flat_map(|t| t.referenced())
+            .collect();
+
+        let nonterminal_type_params: Vec<_> = grammar
+            .type_parameters
+            .iter()
+            .filter(|t| referenced_ty_params.contains(t))
+            .cloned()
+            .collect();
+
+        let mut referenced_where_clauses = Set::new();
+        for wc in &grammar.where_clauses {
+            wc.map(|ty| {
+                if ty.referenced()
+                    .iter()
+                    .any(|p| nonterminal_type_params.contains(p))
+                {
+                    referenced_where_clauses.insert(wc.clone());
+                }
+            });
+        }
+
+        let nonterminal_where_clauses: Vec<_> = grammar
+            .where_clauses
+            .iter()
+            .filter(|wc| referenced_where_clauses.contains(wc))
+            .cloned()
+            .collect();
+
+        let state_inputs = states
+            .iter()
+            .map(|state| Self::state_input_for(state))
+            .collect();
+
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            false,
+            action_module,
+            RecursiveAscent {
+                graph: graph,
+                state_inputs: state_inputs,
+                nonterminal_type_params: nonterminal_type_params,
+                nonterminal_where_clauses: nonterminal_where_clauses,
+            },
+        )
+    }
+
+    /// Compute the stack suffix that the state expects on entry.
+    fn state_input_for(state: &'ascent LR1State<'grammar>) -> StackSuffix<'grammar> {
+        let max_prefix = state.max_prefix();
+        let will_pop = state.will_pop();
+        StackSuffix {
+            all: max_prefix,
+            len_optional: max_prefix.len() - will_pop.len(),
+        }
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_start_fn());
+            rust!(this.out, "");
+            try!(this.write_return_type_defn());
+            for i in 0..this.states.len() {
+                try!(this.write_state_fn(StateIndex(i)));
+            }
+            Ok(())
+        })
+    }
+
+    fn write_return_type_defn(&mut self) -> io::Result<()> {
+        // sometimes some of the variants are not used, particularly
+        // if we are generating multiple parsers from the same file:
+        rust!(self.out, "#[allow(dead_code)]");
+        rust!(
+            self.out,
+            "pub enum {}Nonterminal<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.nonterminal_type_params)
+        );
+
+        if !self.custom.nonterminal_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.nonterminal_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        // make an enum with one variant per nonterminal; I considered
+        // making different enums per state, but this would mean we
+        // have to unwrap and rewrap as we pass up the stack, which
+        // seems silly
+        for ref nt in self.grammar.nonterminals.keys() {
+            let ty = self.types
+                .spanned_type(self.types.nonterminal_type(nt).clone());
+            rust!(self.out, "{}({}),", Escape(nt), ty);
+        }
+
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    // Generates a function `parse_Foo` that will parse an entire
+    // input as `Foo`. An error is reported if the entire input is not
+    // consumed.
+    fn write_start_fn(&mut self) -> io::Result<()> {
+        let phantom_data = self.phantom_data_expr();
+        try!(self.start_parser_fn());
+        try!(self.define_tokens());
+
+        try!(self.next_token("lookahead", "tokens"));
+        rust!(
+            self.out,
+            "match try!({}state0({}&mut {}tokens, {}lookahead, {})) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            phantom_data
+        );
+
+        // extra tokens?
+        rust!(self.out, "(Some({}lookahead), _) => {{", self.prefix);
+        rust!(
+            self.out,
+            "Err({}lalrpop_util::ParseError::ExtraToken {{ token: {}lookahead }})",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}}");
+
+        // otherwise, we expect to see only the goal terminal
+        rust!(
+            self.out,
+            "(None, {}Nonterminal::{}((_, {}nt, _))) => {{",
+            self.prefix,
+            Escape(&self.start_symbol),
+            self.prefix
+        );
+        rust!(self.out, "Ok({}nt)", self.prefix);
+        rust!(self.out, "}}");
+
+        // nothing else should be possible
+        rust!(self.out, "_ => unreachable!(),");
+        rust!(self.out, "}}");
+
+        self.end_parser_fn()
+    }
+
+    /// Writes the function that corresponds to a given state. This
+    /// function takes arguments corresponding to the stack slots of
+    /// the LR(1) machine. It consumes tokens and handles reduces
+    /// etc. It will return once it has popped at least one symbol off
+    /// of the LR stack.
+    ///
+    /// Note that for states which have a custom kind, this function
+    /// emits nothing at all other than a possible comment explaining
+    /// the state.
+    fn write_state_fn(&mut self, this_index: StateIndex) -> io::Result<()> {
+        let this_state = &self.states[this_index.0];
+        let inputs = self.custom.state_inputs[this_index.0];
+
+        rust!(self.out, "");
+
+        // Leave a comment explaining what this state is.
+        if Tls::session().emit_comments {
+            rust!(self.out, "// State {}", this_index.0);
+            rust!(self.out, "//     AllInputs = {:?}", inputs.all);
+            rust!(self.out, "//     OptionalInputs = {:?}", inputs.optional());
+            rust!(self.out, "//     FixedInputs = {:?}", inputs.fixed());
+            rust!(
+                self.out,
+                "//     WillPushLen = {:?}",
+                this_state.will_push().len()
+            );
+            rust!(self.out, "//     WillPush = {:?}", this_state.will_push());
+            rust!(
+                self.out,
+                "//     WillProduce = {:?}",
+                this_state.will_produce()
+            );
+            rust!(self.out, "//");
+            for item in this_state.items.vec.iter() {
+                rust!(self.out, "//     {:?}", item);
+            }
+            rust!(self.out, "//");
+            for (terminal, action) in &this_state.shifts {
+                rust!(self.out, "//   {:?} -> {:?}", terminal, action);
+            }
+            for &(ref tokens, action) in &this_state.reductions {
+                rust!(self.out, "//   {:?} -> {:?}", tokens, action);
+            }
+            rust!(self.out, "//");
+            for (nt, state) in &this_state.gotos {
+                rust!(self.out, "//     {:?} -> {:?}", nt, state);
+            }
+        }
+
+        try!(self.emit_state_fn_header("state", this_index.0, inputs));
+
+        // possibly move some fixed inputs into optional stack slots
+        let stack_suffix = try!(self.adjust_inputs(this_index, inputs));
+
+        // set to true if goto actions are worth generating
+        let mut fallthrough = false;
+
+        rust!(self.out, "match {}lookahead {{", self.prefix);
+
+        // first emit shifts:
+        for (terminal, &next_index) in &this_state.shifts {
+            let sym_name = format!("{}sym{}", self.prefix, inputs.len());
+            try!(self.consume_terminal(terminal, sym_name));
+
+            // transition to the new state
+            if try!(self.transition("result", stack_suffix, next_index, &["tokens"])) {
+                fallthrough = true;
+            }
+
+            rust!(self.out, "}}");
+        }
+
+        // now emit reduces. It frequently happens that many tokens
+        // trigger the same reduction, so group these by the
+        // production that we are going to be reducing.
+        let reductions: Multimap<_, Vec<_>> = this_state
+            .reductions
+            .iter()
+            .flat_map(|&(ref tokens, production)| tokens.iter().map(move |t| (production, t)))
+            .collect();
+        for (production, tokens) in reductions {
+            for (index, token) in tokens.iter().enumerate() {
+                let pattern = match *token {
+                    Token::Terminal(ref s) => format!("Some({})", self.match_terminal_pattern(s)),
+                    Token::Error => {
+                        panic!("Error recovery is not implemented for recursive ascent parsers")
+                    }
+                    Token::EOF => format!("None"),
+                };
+                if index < tokens.len() - 1 {
+                    rust!(self.out, "{} |", pattern);
+                } else {
+                    rust!(self.out, "{} => {{", pattern);
+                }
+            }
+
+            try!(self.emit_reduce_action("result", stack_suffix, production));
+
+            if production.symbols.len() > 0 {
+                // if we popped anything off of the stack, then this frame is done
+                rust!(self.out, "return Ok({}result);", self.prefix);
+            } else {
+                fallthrough = true;
+            }
+
+            rust!(self.out, "}}");
+        }
+
+        // if we hit this, the next token is not recognized, so generate an error
+        rust!(self.out, "_ => {{");
+        // The terminals which would have resulted in a successful parse in this state
+        let successful_terminals = self.grammar.terminals.all.iter().filter(|&terminal| {
+            this_state.shifts.contains_key(terminal)
+                || this_state
+                    .reductions
+                    .iter()
+                    .any(|&(ref t, _)| t.contains(&Token::Terminal(terminal.clone())))
+        });
+        rust!(
+            self.out,
+            "return Err({}lalrpop_util::ParseError::UnrecognizedToken {{",
+            self.prefix
+        );
+        rust!(self.out, "token: {}lookahead,", self.prefix);
+        rust!(self.out, "expected: vec![");
+        for terminal in successful_terminals {
+            rust!(self.out, "r###\"{}\"###.to_string(),", terminal);
+        }
+        rust!(self.out, "]");
+        rust!(self.out, "}});");
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}}"); // match
+
+        // finally, emit gotos (if relevant)
+        if fallthrough && !this_state.gotos.is_empty() {
+            rust!(self.out, "loop {{");
+
+            // In most states, we know precisely when the top stack
+            // slot will be consumed (basically, when we reduce or
+            // when we transition to another state). But in some states,
+            // we may not know. Consider:
+            //
+            //     X = A (*) "0" ["."]
+            //     X = A (*) B ["."]
+            //     B = (*) "0" "1" ["."]
+            //
+            // Now if we see a `"0"` this *could* be the start of a `B
+            // = "0" "1"` or it could be the continuation of `X = A
+            // "0"`. We won't know until we see the *next* character
+            // (which will either be `"0"` or `"."`). If it turns out to be
+            // `X = A "0"`, then the state handling the `"0"` will reduce
+            // and consume the `A` and the `"0"`. But otherwise it will shift
+            // the `"1"` and leave the `A` unprocessed.
+            //
+            // In cases like this, the `adjust_inputs` routine will
+            // have taken the top of the stack ("A") and put it into
+            // an `Option`. After the state processing the `"0"`
+            // returns then, we can check this option to see whether
+            // it has popped the `"A"` (in which case we ought to
+            // return) or not (in which case we ought to shift the `B`
+            // value that it returned to us).
+            let top_slot_optional =
+                { stack_suffix.is_not_empty() && stack_suffix.fixed().is_empty() };
+            if top_slot_optional {
+                rust!(
+                    self.out,
+                    "if {}sym{}.is_none() {{",
+                    self.prefix,
+                    stack_suffix.len() - 1
+                );
+                rust!(self.out, "return Ok({}result);", self.prefix);
+                rust!(self.out, "}}");
+            }
+
+            rust!(
+                self.out,
+                "let ({}lookahead, {}nt) = {}result;",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+
+            rust!(self.out, "match {}nt {{", self.prefix);
+            for (ref nt, &next_index) in &this_state.gotos {
+                // The nonterminal we are shifting becomes symN, where
+                // N is the number of inputs to this state (which are
+                // numbered sym0..sym(N-1)). It is never optional
+                // because we always transition to a state with at
+                // least *one* fixed input.
+                rust!(
+                    self.out,
+                    "{}Nonterminal::{}({}sym{}) => {{",
+                    self.prefix,
+                    Escape(nt),
+                    self.prefix,
+                    stack_suffix.len()
+                );
+                try!(self.transition("result", stack_suffix, next_index, &["tokens", "lookahead"]));
+                rust!(self.out, "}}");
+            }
+
+            // Errors are not possible in the goto phase; a missing entry
+            // indicates parse successfully completed, so just bail out.
+            if this_state.gotos.len() != self.grammar.nonterminals.keys().len() {
+                rust!(self.out, "_ => {{");
+                rust!(
+                    self.out,
+                    "return Ok(({}lookahead, {}nt));",
+                    self.prefix,
+                    self.prefix
+                );
+                rust!(self.out, "}}");
+            }
+
+            rust!(self.out, "}}"); // match
+
+            rust!(self.out, "}}"); // while/loop
+        } else if fallthrough {
+            rust!(self.out, "return Ok({}result);", self.prefix);
+        }
+
+        rust!(self.out, "}}"); // fn
+
+        Ok(())
+    }
+
+    fn emit_state_fn_header(
+        &mut self,
+        fn_kind: &str,   // e.g. "state", "custom"
+        fn_index: usize, // state index, custom kind index, etc
+        suffix: StackSuffix<'grammar>,
+    ) -> io::Result<()> {
+        let optional_prefix = suffix.optional();
+        let fixed_prefix = suffix.fixed();
+
+        let triple_type = self.triple_type();
+        let parse_error_type = self.types.parse_error_type();
+        let error_type = self.types.error_type();
+
+        // If we are generated the tokenizer, it generates ParseError
+        // errors, otherwise they are user errors.
+        let iter_error_type = if self.grammar.intern_token.is_some() {
+            parse_error_type
+        } else {
+            &error_type
+        };
+
+        let (fn_args, starts_with_terminal) = self.fn_args(optional_prefix, fixed_prefix);
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{}{}{}", self.prefix, fn_kind, fn_index),
+            vec![
+                format!(
+                    "{}TOKENS: Iterator<Item=Result<{},{}>>",
+                    self.prefix, triple_type, iter_error_type
+                ),
+            ],
+            None,
+            fn_args,
+            format!(
+                "Result<(Option<{}>, {}Nonterminal<{}>), {}>",
+                triple_type,
+                self.prefix,
+                Sep(", ", &self.custom.nonterminal_type_params),
+                parse_error_type
+            ),
+            vec![]
+        ));
+
+        rust!(self.out, "{{");
+
+        rust!(
+            self.out,
+            "let mut {}result: (Option<{}>, {}Nonterminal<{}>);",
+            self.prefix,
+            triple_type,
+            self.prefix,
+            Sep(", ", &self.custom.nonterminal_type_params)
+        );
+
+        // shift lookahead is necessary; see `starts_with_terminal` above
+        if starts_with_terminal {
+            try!(self.next_token("lookahead", "tokens"));
+        }
+
+        Ok(())
+    }
+
+    // Compute the set of arguments that the function for a state or
+    // custom-kind expects.  The argument `symbols` represents the top
+    // portion of the stack which this function expects to be given.
+    // Each of them will be given an argument like `sym3: &mut
+    // Option<Sym3>` where `Sym3` is the type of the symbol.
+    //
+    // Returns a list of argument names and a flag if this fn resulted
+    // from pushing a terminal (in which case the lookahead must be
+    // computed interally).
+    fn fn_args(
+        &mut self,
+        optional_prefix: &[Symbol],
+        fixed_prefix: &[Symbol],
+    ) -> (Vec<String>, bool) {
+        assert!(
+            // start state:
+            (optional_prefix.is_empty() && fixed_prefix.is_empty()) ||
+            /* any other state: */ !fixed_prefix.is_empty()
+        );
+        let triple_type = self.triple_type();
+
+        // to reduce the size of the generated code, if the state
+        // results from shifting a terminal, then we do not pass the
+        // lookahead in as an argument, but rather we load it as the
+        // first thing in this function; this saves some space because
+        // there are more edges than there are states in the graph.
+        let starts_with_terminal = fixed_prefix
+            .last()
+            .map(|l| l.is_terminal())
+            .unwrap_or(false);
+
+        let mut base_args = vec![format!("{}tokens: &mut {}TOKENS", self.prefix, self.prefix)];
+        if !starts_with_terminal {
+            base_args.push(format!("{}lookahead: Option<{}>", self.prefix, triple_type));
+        }
+
+        // "Optional symbols" may or may not be consumed, so take an
+        // `&mut Option`
+        let optional_args = (0..optional_prefix.len()).map(|i| {
+            format!(
+                "{}sym{}: &mut Option<{}>",
+                self.prefix,
+                i,
+                self.types
+                    .spanned_type(optional_prefix[i].ty(&self.types).clone())
+            )
+        });
+
+        // "Fixed symbols" will be consumed before we return, so take the value itself
+        let fixed_args = (0..fixed_prefix.len()).map(|i| {
+            format!(
+                "{}sym{}: {}",
+                self.prefix,
+                optional_prefix.len() + i,
+                self.types
+                    .spanned_type(fixed_prefix[i].ty(&self.types).clone())
+            )
+        });
+
+        let all_args = base_args
+            .into_iter()
+            .chain(optional_args)
+            .chain(fixed_args)
+            .chain(Some(format!("_: {}", self.phantom_data_type())))
+            .collect();
+
+        (all_args, starts_with_terminal)
+    }
+
+    /// Examine the states that we may transition to. Unless this is
+    /// the start state, we will always take at least 1 fixed input:
+    /// the most recently pushed symbol (let's call it `symX`), and we
+    /// may have others as well. But if this state can transition to
+    /// another state can takes some of those inputs as optional
+    /// parameters, we need to convert them them options. This
+    /// function thus emits code to move each sum `symX` into an
+    /// option, and returns an adjusted stack-suffix that reflects the
+    /// changes made.
+    fn adjust_inputs(
+        &mut self,
+        state_index: StateIndex,
+        inputs: StackSuffix<'grammar>,
+    ) -> io::Result<StackSuffix<'grammar>> {
+        let mut result = inputs;
+
+        let top_opt = self.custom
+            .graph
+            .successors(state_index)
+            .iter()
+            .any(|succ_state| {
+                let succ_inputs = &self.custom.state_inputs[succ_state.0];
+
+                // Check for a successor state with a suffix like:
+                //
+                //     ... OPT_1 ... OPT_N FIXED_1
+                //
+                // (Remember that *every* successor state will have
+                // at least one fixed input.)
+                //
+                // So basically we are looking for states
+                // that, when they return, may *optionally* have consumed
+                // the top of our stack.
+                assert!(succ_inputs.fixed().len() >= 1);
+                succ_inputs.fixed().len() == 1 && succ_inputs.optional().len() > 0
+            });
+
+        // If we find a successor that may optionally consume the top
+        // of our stack, convert our fixed inputs into optional ones.
+        //
+        // (Here we convert *all* fixed inputs. Honestly, I can't
+        // remember if this is necessary, or just for simplicity. I
+        // suspect the latter. --nmatsakis)
+        if top_opt {
+            let start_num = inputs.optional().len();
+            for sym_num in (start_num..start_num + inputs.fixed().len()) {
+                rust!(
+                    self.out,
+                    "let {}sym{} = &mut Some({}sym{});",
+                    self.prefix,
+                    sym_num,
+                    self.prefix,
+                    sym_num
+                );
+            }
+            result.len_optional = result.len();
+        }
+
+        Ok(result)
+    }
+
+    /// Given that we have, locally, `optional` number of optional stack slots
+    /// followed by `fixed` number of fixed stack slots, prepare the inputs
+    /// to be supplied to `inputs`. Returns a string of names for this inputs.
+    fn pop_syms(
+        &mut self,
+        optional: usize,
+        fixed: usize,
+        inputs: StackSuffix<'grammar>,
+    ) -> io::Result<Vec<String>> {
+        let total_have = optional + fixed;
+        let total_need = inputs.len();
+        (total_have - total_need .. total_have) // number relative to us
+            .zip(0 .. total_need) // number relative to them
+            .map(|(h, n)| {
+                let name = format!("{}sym{}", self.prefix, h);
+                let have_optional = h < optional;
+                let need_optional = n < inputs.len_optional;
+
+                // if we have something stored in an `Option`, but the next state
+                // consumes it unconditionally, then "pop" it
+                if have_optional && !need_optional {
+                    rust!(self.out, "let {} = {}.take().unwrap();", name, name);
+                } else {
+                    // we should never have something stored
+                    // unconditionally that the next state only
+                    // "maybe" consumes -- we should have fixed this
+                    // in the `adjust_inputs` phase
+                    assert_eq!(have_optional, need_optional);
+                }
+                Ok(name)
+            })
+            .collect()
+    }
+
+    /// Emit code to shift/goto into the state `next_index`. Returns
+    /// `true` if the current state may be valid after the target
+    /// state returns, or `false` if `transition` will just return
+    /// afterwards.
+    ///
+    /// # Arguments
+    ///
+    /// - `into_result`: name of variable to store result from target state into
+    /// - `stack_suffix`: the suffix of the LR stack that current state is aware of,
+    ///   and how it is distributed into optional/fixed slots
+    /// - `next_index`: target state
+    /// - `other_args`: other arguments we are threading along
+    fn transition(
+        &mut self,
+        into_result: &str,
+        stack_suffix: StackSuffix<'grammar>,
+        next_index: StateIndex,
+        other_args: &[&str],
+    ) -> io::Result<bool> {
+        // the depth of the suffix of the stack that we are aware of
+        // in the current state, including the newly shifted token
+        let (optional, mut fixed) = stack_suffix.optional_fixed_lens();
+        fixed += 1; // we just shifted another symbol
+        let total = optional + fixed;
+        assert!(total == stack_suffix.len() + 1);
+
+        // symbols that the next state expects; will always be include
+        // at least one fixed input
+        let next_inputs = self.custom.state_inputs[next_index.0];
+        assert!(next_inputs.fixed().len() >= 1);
+        assert!(next_inputs.len() <= total);
+
+        let transfer_syms = try!(self.pop_syms(optional, fixed, next_inputs));
+
+        let other_args = other_args
+            .iter()
+            .map(|s| format!("{}{}", self.prefix, s))
+            .collect();
+
+        let fn_name = format!("{}state{}", self.prefix, next_index.0);
+
+        // invoke next state, transferring the top `m` tokens
+        let phantom_data_expr = self.phantom_data_expr();
+        rust!(
+            self.out,
+            "{}{} = try!({}({}{}, {}, {}));",
+            self.prefix,
+            into_result,
+            fn_name,
+            self.grammar.user_parameter_refs(),
+            Sep(", ", &other_args),
+            Sep(", ", &transfer_syms),
+            phantom_data_expr
+        );
+
+        // if the target state takes at least **two** fixed tokens,
+        // then it will have consumed the top of **our** stack frame,
+        // so we should just return
+        if next_inputs.fixed().len() >= 2 {
+            rust!(self.out, "return Ok({}{});", self.prefix, into_result);
+            Ok(false)
+        } else {
+            Ok(true)
+        }
+    }
+
+    /// Executes a reduction of `production`, storing the result into
+    /// the variable `into_var`, which should have type
+    /// `(Option<(L,T,L)>, Nonterminal)`.
+    fn emit_reduce_action(
+        &mut self,
+        into_var: &str,
+        stack_suffix: StackSuffix<'grammar>,
+        production: &'grammar Production,
+    ) -> io::Result<()> {
+        let loc_type = self.types.terminal_loc_type();
+
+        let (optional, fixed) = stack_suffix.optional_fixed_lens();
+        let production_inputs = StackSuffix {
+            all: &production.symbols,
+            len_optional: 0,
+        };
+        let transfer_syms = try!(self.pop_syms(optional, fixed, production_inputs));
+
+        // identify the "start" location for this production; this
+        // is typically the start of the first symbol we are
+        // reducing; but in the case of an empty production, it
+        // will be the last symbol pushed, or at worst `default`.
+        if let Some(first_sym) = transfer_syms.first() {
+            rust!(
+                self.out,
+                "let {}start = {}.0.clone();",
+                self.prefix,
+                first_sym
+            );
+        } else if stack_suffix.len() > 0 {
+            // we pop no symbols, so grab from the top of the stack
+            // (unless we are in the start state)
+            let top = stack_suffix.len() - 1;
+            if !stack_suffix.fixed().is_empty() {
+                rust!(
+                    self.out,
+                    "let {}start = {}sym{}.2.clone();",
+                    self.prefix,
+                    self.prefix,
+                    top
+                );
+            } else {
+                // top of stack is optional; should not have been popped yet tho
+                rust!(
+                    self.out,
+                    "let {}start = {}sym{}.as_ref().unwrap().2.clone();",
+                    self.prefix,
+                    self.prefix,
+                    top
+                );
+            }
+        } else {
+            // this only occurs in the start state
+            rust!(
+                self.out,
+                "let {}start: {} = ::std::default::Default::default();",
+                self.prefix,
+                loc_type
+            );
+        }
+
+        // identify the "end" location for this production;
+        // this is typically the end of the last symbol we are reducing,
+        // but in the case of an empty production it will come from the
+        // lookahead
+        if let Some(last_sym) = transfer_syms.last() {
+            rust!(self.out, "let {}end = {}.2.clone();", self.prefix, last_sym);
+        } else {
+            rust!(
+                self.out,
+                "let {}end = {}lookahead.as_ref().map(|o| o.0.clone()).unwrap_or_else(|| \
+                 {}start.clone());",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        let transfered_syms = transfer_syms.len();
+
+        let mut args = transfer_syms;
+        if transfered_syms == 0 {
+            args.push(format!("&{}start", self.prefix));
+            args.push(format!("&{}end", self.prefix));
+        }
+
+        // invoke the action code
+        let is_fallible = self.grammar.action_is_fallible(production.action);
+        if is_fallible {
+            rust!(
+                self.out,
+                "let {}nt = try!({}::{}action{}::<{}>({}{}));",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            )
+        } else {
+            rust!(
+                self.out,
+                "let {}nt = {}::{}action{}::<{}>({}{});",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            )
+        }
+
+        // wrap up the produced value into `Nonterminal` along with
+        rust!(
+            self.out,
+            "let {}nt = {}Nonterminal::{}((",
+            self.prefix,
+            self.prefix,
+            Escape(&production.nonterminal)
+        );
+        rust!(self.out, "{}start,", self.prefix);
+        rust!(self.out, "{}nt,", self.prefix);
+        rust!(self.out, "{}end,", self.prefix);
+        rust!(self.out, "));");
+
+        // wrap up the result along with the (unused) lookahead
+        rust!(
+            self.out,
+            "{}{} = ({}lookahead, {}nt);",
+            self.prefix,
+            into_var,
+            self.prefix,
+            self.prefix
+        );
+
+        Ok(())
+    }
+
+    /// Emit a pattern that matches `id` but doesn't extract any data.
+    fn match_terminal_pattern(&mut self, id: &TerminalString) -> String {
+        let pattern = self.grammar.pattern(id).map(&mut |_| "_");
+        let pattern = format!("{}", pattern);
+        format!("(_, {}, _)", pattern)
+    }
+
+    /// Emit a pattern that matches `id` and extracts its value, storing
+    /// that value as `let_name`.
+    fn consume_terminal(&mut self, id: &TerminalString, let_name: String) -> io::Result<()> {
+        let mut pattern_names = vec![];
+        let pattern = self.grammar.pattern(id).map(&mut |_| {
+            let index = pattern_names.len();
+            pattern_names.push(format!("{}tok{}", self.prefix, index));
+            pattern_names.last().cloned().unwrap()
+        });
+
+        let mut pattern = format!("{}", pattern);
+        if pattern_names.is_empty() {
+            pattern_names.push(format!("{}tok", self.prefix));
+            pattern = format!("{}tok @ {}", self.prefix, pattern);
+        }
+
+        pattern = format!("({}loc1, {}, {}loc2)", self.prefix, pattern, self.prefix);
+
+        rust!(self.out, "Some({}) => {{", pattern);
+
+        rust!(
+            self.out,
+            "let {} = ({}loc1, ({}), {}loc2);",
+            let_name,
+            self.prefix,
+            pattern_names.join(", "),
+            self.prefix
+        );
+
+        Ok(())
+    }
+
+    fn triple_type(&self) -> TypeRepr {
+        self.types.triple_type()
+    }
+
+    fn next_token(&mut self, lookahead: &str, tokens: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}{} = match {}{}.next() {{",
+            self.prefix,
+            lookahead,
+            self.prefix,
+            tokens
+        );
+        rust!(self.out, "Some(Ok(v)) => Some(v),");
+        rust!(self.out, "None => None,");
+        if self.grammar.intern_token.is_some() {
+            // when we generate the tokenizer, the generated errors are `ParseError` values
+            rust!(self.out, "Some(Err(e)) => return Err(e),");
+        } else {
+            // otherwise, they are user errors
+            rust!(
+                self.out,
+                "Some(Err(e)) => return Err({}lalrpop_util::ParseError::User {{ error: e }}),",
+                self.prefix
+            );
+        }
+        rust!(self.out, "}};");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/codegen/base.rs
@@ -0,0 +1,278 @@
+//! Base helper routines for a code generator.
+
+use grammar::repr::*;
+use lr1::core::*;
+use rust::RustWrite;
+use std::io::{self, Write};
+use util::Sep;
+
+/// Base struct for various kinds of code generator. The flavor of
+/// code generator is customized by supplying distinct types for `C`
+/// (e.g., `self::ascent::RecursiveAscent`).
+pub struct CodeGenerator<'codegen, 'grammar: 'codegen, W: Write + 'codegen, C> {
+    /// the complete grammar
+    pub grammar: &'grammar Grammar,
+
+    /// some suitable prefix to separate our identifiers from the user's
+    pub prefix: &'grammar str,
+
+    /// types from the grammar
+    pub types: &'grammar Types,
+
+    /// the start symbol S the user specified
+    pub user_start_symbol: NonterminalString,
+
+    /// the synthetic start symbol S' that we specified
+    pub start_symbol: NonterminalString,
+
+    /// the vector of states
+    pub states: &'codegen [LR1State<'grammar>],
+
+    /// where we write output
+    pub out: &'codegen mut RustWrite<W>,
+
+    /// where to find the action routines (typically `super`)
+    pub action_module: String,
+
+    /// custom fields for the specific kind of codegenerator
+    /// (recursive ascent, table-driven, etc)
+    pub custom: C,
+
+    pub repeatable: bool,
+}
+
+impl<'codegen, 'grammar, W: Write, C> CodeGenerator<'codegen, 'grammar, W, C> {
+    pub fn new(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'codegen [LR1State<'grammar>],
+        out: &'codegen mut RustWrite<W>,
+        repeatable: bool,
+        action_module: &str,
+        custom: C,
+    ) -> Self {
+        CodeGenerator {
+            grammar: grammar,
+            prefix: &grammar.prefix,
+            types: &grammar.types,
+            states: states,
+            user_start_symbol: user_start_symbol,
+            start_symbol: start_symbol,
+            out: out,
+            custom: custom,
+            repeatable: repeatable,
+            action_module: action_module.to_string(),
+        }
+    }
+
+    pub fn write_parse_mod<F>(&mut self, body: F) -> io::Result<()>
+    where
+        F: FnOnce(&mut Self) -> io::Result<()>,
+    {
+        rust!(self.out, "");
+        rust!(self.out, "mod {}parse{} {{", self.prefix, self.start_symbol);
+
+        // these stylistic lints are annoying for the generated code,
+        // which doesn't follow conventions:
+        rust!(
+            self.out,
+            "#![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, \
+             unused_imports, unused_parens)]"
+        );
+        rust!(self.out, "");
+
+        try!(self.write_uses());
+
+        try!(body(self));
+
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    pub fn write_uses(&mut self) -> io::Result<()> {
+        try!(
+            self.out
+                .write_uses(&format!("{}::", self.action_module), &self.grammar)
+        );
+
+        if self.grammar.intern_token.is_some() {
+            rust!(
+                self.out,
+                "use {}::{}intern_token::Token;",
+                self.action_module,
+                self.prefix
+            );
+        } else {
+            rust!(
+                self.out,
+                "use {}::{}ToTriple;",
+                self.action_module,
+                self.prefix
+            );
+        }
+
+        Ok(())
+    }
+
+    pub fn start_parser_fn(&mut self) -> io::Result<()> {
+        let error_type = self.types.error_type();
+        let parse_error_type = self.types.parse_error_type();
+
+        let (type_parameters, parameters, mut where_clauses);
+
+        let intern_token = self.grammar.intern_token.is_some();
+        if intern_token {
+            // if we are generating the tokenizer, we just need the
+            // input, and that has already been added as one of the
+            // user parameters
+            type_parameters = vec![];
+            parameters = vec![];
+            where_clauses = vec![];
+        } else {
+            // otherwise, we need an iterator of type `TOKENS`
+            let mut user_type_parameters = String::new();
+            for type_parameter in &self.grammar.type_parameters {
+                user_type_parameters.push_str(&format!("{}, ", type_parameter));
+            }
+            type_parameters = vec![
+                format!(
+                    "{}TOKEN: {}ToTriple<{}Error={}>",
+                    self.prefix, self.prefix, user_type_parameters, error_type
+                ),
+                format!(
+                    "{}TOKENS: IntoIterator<Item={}TOKEN>",
+                    self.prefix, self.prefix
+                ),
+            ];
+            parameters = vec![format!("{}tokens0: {}TOKENS", self.prefix, self.prefix)];
+            where_clauses = vec![];
+
+            if self.repeatable {
+                where_clauses.push(format!("{}TOKENS: Clone", self.prefix));
+            }
+        }
+
+        rust!(
+            self.out,
+            "{}struct {}Parser {{",
+            self.grammar.nonterminals[&self.start_symbol].visibility,
+            self.user_start_symbol
+        );
+        if intern_token {
+            rust!(
+                self.out,
+                "builder: {1}::{0}intern_token::{0}MatcherBuilder,",
+                self.prefix,
+                self.action_module
+            );
+        }
+        rust!(self.out, "_priv: (),");
+        rust!(self.out, "}}");
+        rust!(self.out, "");
+
+        rust!(self.out, "impl {}Parser {{", self.user_start_symbol);
+        rust!(
+            self.out,
+            "{}fn new() -> {}Parser {{",
+            self.grammar.nonterminals[&self.start_symbol].visibility,
+            self.user_start_symbol
+        );
+        if intern_token {
+            rust!(
+                self.out,
+                "let {0}builder = {1}::{0}intern_token::{0}MatcherBuilder::new();",
+                self.prefix,
+                self.action_module
+            );
+        }
+        rust!(self.out, "{}Parser {{", self.user_start_symbol);
+        if intern_token {
+            rust!(self.out, "builder: {}builder,", self.prefix);
+        }
+        rust!(self.out, "_priv: (),");
+        rust!(self.out, "}}"); // Parser
+        rust!(self.out, "}}"); // new()
+        rust!(self.out, "");
+
+        rust!(self.out, "#[allow(dead_code)]");
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &self.grammar.nonterminals[&self.start_symbol].visibility,
+            "parse".to_owned(),
+            type_parameters,
+            Some("&self".to_owned()),
+            parameters,
+            format!(
+                "Result<{}, {}>",
+                self.types.nonterminal_type(&self.start_symbol),
+                parse_error_type
+            ),
+            where_clauses
+        ));
+        rust!(self.out, "{{");
+
+        Ok(())
+    }
+
+    pub fn define_tokens(&mut self) -> io::Result<()> {
+        if self.grammar.intern_token.is_some() {
+            // if we are generating the tokenizer, create a matcher as our input iterator
+            rust!(
+                self.out,
+                "let mut {}tokens = self.builder.matcher(input);",
+                self.prefix
+            );
+        } else {
+            // otherwise, convert one from the `IntoIterator`
+            // supplied, using the `ToTriple` trait which inserts
+            // errors/locations etc if none are given
+            let clone_call = if self.repeatable { ".clone()" } else { "" };
+            rust!(
+                self.out,
+                "let {}tokens = {}tokens0{}.into_iter();",
+                self.prefix,
+                self.prefix,
+                clone_call
+            );
+
+            rust!(
+                self.out,
+                "let mut {}tokens = {}tokens.map(|t| {}ToTriple::to_triple(t));",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        Ok(())
+    }
+
+    pub fn end_parser_fn(&mut self) -> io::Result<()> {
+        rust!(self.out, "}}"); // fn
+        rust!(self.out, "}}"); // impl
+        Ok(())
+    }
+
+    /// Returns phantom data type that captures the user-declared type
+    /// parameters in a phantom-data. This helps with ensuring that
+    /// all type parameters are constrained, even if they are not
+    /// used.
+    pub fn phantom_data_type(&self) -> String {
+        format!(
+            "::std::marker::PhantomData<({})>",
+            Sep(", ", &self.grammar.non_lifetime_type_parameters())
+        )
+    }
+
+    /// Returns expression that captures the user-declared type
+    /// parameters in a phantom-data. This helps with ensuring that
+    /// all type parameters are constrained, even if they are not
+    /// used.
+    pub fn phantom_data_expr(&self) -> String {
+        format!(
+            "::std::marker::PhantomData::<({})>",
+            Sep(", ", &self.grammar.non_lifetime_type_parameters())
+        )
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/codegen/mod.rs
@@ -0,0 +1,4 @@
+pub mod ascent;
+mod base;
+pub mod parse_table;
+pub mod test_all;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/codegen/parse_table.rs
@@ -0,0 +1,2168 @@
+//! A compiler from an LR(1) table to a traditional table driven parser.
+
+use collections::{Entry, Map, Set};
+use grammar::parse_tree::WhereClause;
+use grammar::repr::*;
+use string_cache::DefaultAtom as Atom;
+use lr1::core::*;
+use lr1::lookahead::Token;
+use rust::RustWrite;
+use std::fmt;
+use std::io::{self, Write};
+use tls::Tls;
+use util::Sep;
+
+use super::base::CodeGenerator;
+
+const DEBUG_PRINT: bool = false;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    action_module: &str,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let mut table_driven = CodeGenerator::new_table_driven(
+        grammar,
+        user_start_symbol,
+        start_symbol,
+        states,
+        action_module,
+        out,
+    );
+    table_driven.write()
+}
+
+// We create three parse tables:
+//
+// - `ACTION[state * num_states + terminal]: i32`: given a state and next token,
+//   yields an integer indicating whether to shift/reduce (see below)
+// - `EOF_ACTION[state]: i32`: as above, but for the EOF token
+// - `GOTO[state * num_states + nonterminal]: i32`: index + 1 of state to jump to when given
+//   nonterminal is pushed (no error is possible)
+//
+// For the `ACTION` and `EOF_ACTION` tables, the value is an `i32` and
+// its interpretation varies depending on whether it is positive or
+// negative:
+//
+// - if zero, parse error.
+// - if a positive integer (not zero), it is the next state to shift to.
+// - if a negative integer (not zero), it is the index of a reduction
+//   action to execute (actually index + 1).
+//
+// We maintain two stacks: one is a stack of state indexes (each an
+// u32). The other is a stack of values and spans: `(L, T, L)`. `L` is
+// the location type and represents the start/end span. `T` is the
+// value of the symbol. The type `T` is an `enum` that we synthesize
+// which contains a variant for all the possibilities:
+//
+// ```
+// enum Value<> {
+//     // One variant for each terminal:
+//     Term1(Ty1),
+//     ...
+//     TermN(TyN),
+//
+//     // One variant for each nonterminal:
+//     Nt1(Ty1),
+//     ...
+//     NtN(TyN),
+// }
+// ```
+//
+// The action parser function looks like this (pseudo-code):
+//
+// ```
+// fn parse_fn<TOKENS>(tokens: TOKENS) -> Result<T, Error>
+//    where TOKENS: Iterator<Item=Result<(Location, Token, Location), Error>>
+// {
+//    let mut states = vec![0]; // initial state is zero
+//    let mut symbols = vec![];
+//    'shift: loop {
+//        // Code to shift the next symbol and determine which terminal
+//        // it is; emitted by `shift_symbol()`.
+//        let lookahead = match tokens.next() {
+//            Some(Ok(l)) => l,
+//            None => break 'shift,
+//            Some(Err(e)) => return Err(e),
+//        };
+//        let integer = match lookahead {
+//            (_, PatternForTerminal0(...), _) => 0,
+//            ...
+//        };
+//
+//        // Code to process next symbol.
+//        'inner: loop {
+//            let symbol = match lookahead {
+//               (l, PatternForTerminal0(...), r) => {
+//                   (l, Value::VariantForTerminal0(...), r),
+//               }
+//               ...
+//            };
+//            let state = *states.last().unwrap() as usize;
+//            let action = ACTION[state * NUM_STATES + integer];
+//            if action > 0 { // shift
+//                states.push(action - 1);
+//                symbols.push(symbol);
+//                continue 'shift;
+//            } else if action < 0 { // reduce
+//                if let Some(r) = reduce(action, Some(&lookahead.0), &mut states, &mut symbols) {
+//                    // Give errors from within grammar a higher priority
+//                    if r.is_err() {
+//                        return r;
+//                    }
+//                    return Err(lalrpop_util::ParseError::ExtraToken { token: lookahead });
+//                }
+//            } else {
+//                // Error recovery code: emitted by `try_error_recovery`
+//                let mut err_lookahead = Some(lookahead);
+//                let mut err_integer = Some(integer);
+//                match error_recovery(&mut tokens, &mut states, &mut symbols, last_location,
+//                                     &mut err_lookahead, &mut err_integer) {
+//                  Err(e) => return e,
+//                  Ok(Some(v)) => return Ok(v),
+//                  Ok(None) => { }
+//                }
+//                match (err_lookahead, err_integer) {
+//                  (Some(l), Some(i)) => {
+//                    lookahead = l;
+//                    integer = i;
+//                    continue 'inner;
+//                  }
+//                  _ => break 'shift;
+//                }
+//            }
+//        }
+//    }
+//
+//    // Process EOF
+//    while let Some(state) = self.states.pop() {
+//        let action = EOF_ACTION[state * NUM_STATES];
+//        if action < 0 { // reduce
+//            try!(reduce(action, None, &mut states, &mut symbols));
+//        } else {
+//            let mut err_lookahead = None;
+//            let mut err_integer = None;
+//            match error_recovery(&mut tokens, &mut states, &mut symbols, last_location,
+//                                 &mut err_lookahead, &mut err_integer) {
+//              Err(e) => return e,
+//              Ok(Some(v)) => return Ok(v),
+//              Ok(None) => { }
+//            }
+//        }
+//    }
+// }
+//
+// // generated by `emit_reduce_actions()`
+// fn reduce(action: i32, lookahead_start: Option<&L>,
+//           states: &mut Vec<i32>, symbols: &mut Vec<(L, Symbol, L))
+//           -> Option<Result<..>> {
+//     let nonterminal = match -action {
+//        0 => {
+//            // Execute reduce action 0 to produce nonterminal N, popping from stacks etc
+//            // (generated by `emit_reduce_action()`). If this is a fallible action,
+//            // it may return `Some(Err)`, and if this is a reduce of the start NT,
+//            // it may return `Some(Ok)`.
+//            states.pop(); // however many times
+//            symbols.pop(); // however many times
+//            let data = action_fn0(...);
+//            symbols.push((l, Value::VariantForNonterminalN(data), r));
+//            N
+//        }
+//        ...
+//     };
+//     let state = *states.last().unwrap();
+//     let next_state = GOTO[state * NUM_STATES + nonterminal] - 1;
+//     state_stack.push(next_state);
+//     None
+// }
+//
+// generated by `write_error_recovery_fn`
+// fn error_recovery(...) {
+//     let mut dropped_tokens = vec![];
+//
+//     // First, reduce as long as we can with the `!` token as lookahead
+//     loop {
+//         let state = *states.last().unwrap() as usize;
+//         let action = ACTION[(state + 1) * ACTIONS_PER_STATE - 1];
+//         if action >= 0 {
+//             break;
+//         }
+//         if let Some(r) = reduce(action, None, &mut states, &mut symbols) {
+//             return r;
+//         }
+//     }
+//
+//     let top0;
+//     'find_state: loop {
+//         // See if there is a state that can shift `!` token. If so,
+//         // break.
+//         for top in (0..states.len()).rev() {
+//             let state = states[top];
+//             let action = ACTION[state * ACTIONS_PER_STATE + 1];
+//             if action <= 0 { continue; }
+//             let error_state = action - 1;
+//             if accepts(error_state, &states[..top+1], *opt-integer) {
+//                 top0 = top;
+//                 break 'find_state;
+//             }
+//         }
+//
+//         // Else, drop a token from the input and try again.
+//         'eof: loop {
+//             match opt_lookahead.take() {
+//                 None => {
+//                     // No more tokens to drop
+//                     return Err(...);
+//                 }
+//                 Some(mut lookahead) => {
+//                     dropped_tokens.push(lookahead);
+//                     next_token()
+//                     opt_lookahead = Some(match tokens.next() {
+//                         Some(Ok(l)) => l,
+//                         None => break 'eof,
+//                         Some(Err(e)) => return Err(e),
+//                     });
+//                     opt_integer = Some(match lookahead {
+//                         (_, PatternForTerminal0(...), _) => 0,
+//                         ...
+//                     });
+//                     continue 'find_state;
+//                 }
+//             }
+//         }
+//         opt_lookahead = None;
+//         opt_integer = None;
+//     }
+//
+//     let top = top0;
+//     let start = /* figure out "start" of error */;
+//     let end = /* figure out "end" of error */;
+//     states.truncate(top + 1);
+//     symbols.truncate(top);
+//     let recover_state = states[top];
+//     let error_state = ACTION[recover_state * ACTIONS_PER_STATE + 1] - 1;
+//     states.push(error_state);
+//     let recovery = ErrorRecovery { dropped_tokens, ... };
+//     symbols.push((start, Symbol::Termerror(recovery), end));
+//     Ok(None)
+// }
+// ```
+
+enum Comment<'a, T> {
+    Goto(T, usize),
+    Error(T),
+    Reduce(T, &'a Production),
+}
+
+impl<'a, T: fmt::Display> fmt::Display for Comment<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Comment::Goto(ref token, new_state) => {
+                write!(f, " // on {}, goto {}", token, new_state)
+            }
+            Comment::Error(ref token) => write!(f, " // on {}, error", token),
+            Comment::Reduce(ref token, production) => {
+                write!(f, " // on {}, reduce `{:?}`", token, production)
+            }
+        }
+    }
+}
+
+struct TableDriven<'grammar> {
+    /// type parameters for the `Nonterminal` type
+    symbol_type_params: Vec<TypeParameter>,
+
+    symbol_where_clauses: Vec<WhereClause<TypeRepr>>,
+
+    /// a list of each nonterminal in some specific order
+    all_nonterminals: Vec<NonterminalString>,
+
+    reduce_indices: Map<&'grammar Production, usize>,
+
+    state_type: &'static str,
+
+    variant_names: Map<Symbol, String>,
+    variants: Map<TypeRepr, String>,
+}
+
+impl<'ascent, 'grammar, W: Write> CodeGenerator<'ascent, 'grammar, W, TableDriven<'grammar>> {
+    fn new_table_driven(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'ascent [LR1State<'grammar>],
+        action_module: &str,
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        // The nonterminal type needs to be parameterized by all the
+        // type parameters that actually appear in the types of
+        // nonterminals.  We can't just use *all* type parameters
+        // because that would leave unused lifetime/type parameters in
+        // some cases.
+        let referenced_ty_params: Set<TypeParameter> = grammar
+            .types
+            .nonterminal_types()
+            .into_iter()
+            .chain(grammar.types.terminal_types())
+            .flat_map(|t| t.referenced())
+            .collect();
+
+        let symbol_type_params: Vec<_> = grammar
+            .type_parameters
+            .iter()
+            .filter(|t| referenced_ty_params.contains(t))
+            .cloned()
+            .collect();
+
+        let mut referenced_where_clauses = Set::new();
+        for wc in &grammar.where_clauses {
+            wc.map(|ty| {
+                if ty.referenced()
+                    .iter()
+                    .any(|p| symbol_type_params.contains(p))
+                {
+                    referenced_where_clauses.insert(wc.clone());
+                }
+            });
+        }
+
+        let symbol_where_clauses: Vec<_> = grammar
+            .where_clauses
+            .iter()
+            .filter(|wc| referenced_where_clauses.contains(wc))
+            .cloned()
+            .collect();
+
+        // Assign each production a unique index to use as the values for reduce
+        // actions in the ACTION and EOF_ACTION tables.
+        let reduce_indices: Map<&'grammar Production, usize> = grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(0..)
+            .collect();
+
+        let state_type = {
+            // `reduce_indices` are allowed to be +1 since the negative maximum of any integer type
+            // is one larger than the positive maximum
+            let max_value = ::std::cmp::max(states.len(), reduce_indices.len() - 1);
+            if max_value <= ::std::i8::MAX as usize {
+                "i8"
+            } else if max_value <= ::std::i16::MAX as usize {
+                "i16"
+            } else {
+                "i32"
+            }
+        };
+
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            false,
+            action_module,
+            TableDriven {
+                symbol_type_params: symbol_type_params,
+                symbol_where_clauses: symbol_where_clauses,
+                all_nonterminals: grammar.nonterminals.keys().cloned().collect(),
+                reduce_indices: reduce_indices,
+                state_type: state_type,
+                variant_names: Map::new(),
+                variants: Map::new(),
+            },
+        )
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_value_type_defn());
+            try!(this.write_parse_table());
+            try!(this.write_parser_fn());
+            try!(this.write_error_recovery_fn());
+            try!(this.write_accepts_fn());
+            try!(this.emit_reduce_actions());
+            try!(this.emit_downcast_fns());
+            Ok(())
+        })
+    }
+
+    fn write_value_type_defn(&mut self) -> io::Result<()> {
+        // sometimes some of the variants are not used, particularly
+        // if we are generating multiple parsers from the same file:
+        rust!(self.out, "#[allow(dead_code)]");
+        rust!(
+            self.out,
+            "pub enum {}Symbol<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.symbol_type_params)
+        );
+
+        if !self.custom.symbol_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.symbol_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        // make one variant per terminal
+        for term in &self.grammar.terminals.all {
+            let ty = self.types.terminal_type(term).clone();
+            let len = self.custom.variants.len();
+            let name = match self.custom.variants.entry(ty.clone()) {
+                Entry::Occupied(entry) => entry.into_mut(),
+                Entry::Vacant(entry) => {
+                    let name = format!("Variant{}", len);
+
+                    rust!(self.out, "{}({}),", name, ty);
+                    entry.insert(name)
+                }
+            };
+
+            self.custom
+                .variant_names
+                .insert(Symbol::Terminal(term.clone()), name.clone());
+        }
+
+        // make one variant per nonterminal
+        for nt in self.grammar.nonterminals.keys() {
+            let ty = self.types.nonterminal_type(nt).clone();
+            let len = self.custom.variants.len();
+            let name = match self.custom.variants.entry(ty.clone()) {
+                Entry::Occupied(entry) => entry.into_mut(),
+                Entry::Vacant(entry) => {
+                    let name = format!("Variant{}", len);
+
+                    rust!(self.out, "{}({}),", name, ty);
+                    entry.insert(name)
+                }
+            };
+
+            self.custom
+                .variant_names
+                .insert(Symbol::Nonterminal(nt.clone()), name.clone());
+        }
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    fn write_parse_table(&mut self) -> io::Result<()> {
+        // The table is a two-dimensional matrix indexed first by state
+        // and then by the terminal index. The value is described above.
+        rust!(
+            self.out,
+            "const {}ACTION: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+
+            if Tls::session().emit_comments {
+                for item in state.items.vec.iter() {
+                    rust!(self.out, "//     {:?}", item);
+                }
+            }
+
+            // Write an action for each terminal (either shift, reduce, or error).
+            let custom = &self.custom;
+            let iterator = self.grammar.terminals.all.iter().map(|terminal| {
+                if let Some(new_state) = state.shifts.get(&terminal) {
+                    (
+                        new_state.0 as i32 + 1,
+                        Comment::Goto(Token::Terminal(terminal.clone()), new_state.0),
+                    )
+                } else {
+                    Self::write_reduction(custom, state, &Token::Terminal(terminal.clone()))
+                }
+            });
+            try!(self.out.write_table_row(iterator))
+        }
+
+        rust!(self.out, "];");
+
+        // Actions on EOF. Indexed just by state.
+        rust!(
+            self.out,
+            "const {}EOF_ACTION: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+            let reduction = Self::write_reduction(&self.custom, state, &Token::EOF);
+            try!(self.out.write_table_row(Some(reduction)));
+        }
+        rust!(self.out, "];");
+
+        // The goto table is indexed by state and *nonterminal*.
+        rust!(
+            self.out,
+            "const {}GOTO: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+            let iterator = self.grammar.nonterminals.keys().map(|nonterminal| {
+                if let Some(&new_state) = state.gotos.get(&nonterminal) {
+                    (
+                        new_state.0 as i32 + 1,
+                        Comment::Goto(nonterminal, new_state.0),
+                    )
+                } else {
+                    (0, Comment::Error(nonterminal))
+                }
+            });
+            try!(self.out.write_table_row(iterator));
+        }
+        rust!(self.out, "];");
+
+        try!(self.emit_expected_tokens_fn());
+
+        Ok(())
+    }
+
+    fn write_reduction<'s>(
+        custom: &TableDriven<'grammar>,
+        state: &'s LR1State,
+        token: &Token,
+    ) -> (i32, Comment<'s, Token>) {
+        let reduction = state
+            .reductions
+            .iter()
+            .filter(|&&(ref t, _)| t.contains(token))
+            .map(|&(_, p)| p)
+            .next();
+        if let Some(production) = reduction {
+            let action = custom.reduce_indices[production];
+            (
+                -(action as i32 + 1),
+                Comment::Reduce(token.clone(), production),
+            )
+        } else {
+            // Otherwise, this is an error. Store 0.
+            (0, Comment::Error(token.clone()))
+        }
+    }
+
+    fn write_parser_fn(&mut self) -> io::Result<()> {
+        let phantom_data_expr = self.phantom_data_expr();
+
+        try!(self.start_parser_fn());
+
+        try!(self.define_tokens());
+
+        // State and data stack.
+        rust!(
+            self.out,
+            "let mut {}states = vec![0_{}];",
+            self.prefix,
+            self.custom.state_type
+        );
+        rust!(self.out, "let mut {}symbols = vec![];", self.prefix);
+
+        rust!(self.out, "let mut {}integer;", self.prefix);
+        rust!(self.out, "let mut {}lookahead;", self.prefix);
+        // The location of the last token is necessary for for error recovery at EOF (or they would not have
+        // a location)
+        rust!(
+            self.out,
+            "let {}last_location = &mut Default::default();",
+            self.prefix
+        );
+
+        // Outer loop: each time we continue around this loop, we
+        // shift a new token from the input. We break from the loop
+        // when the end of the input is reached (we return early if an
+        // error occurs).
+        rust!(self.out, "'{}shift: loop {{", self.prefix);
+
+        // Read next token from input.
+        try!(self.next_token("lookahead", "tokens", "last_location", "shift"));
+        try!(self.token_to_integer("integer", "lookahead"));
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"pulled next token from input: {{:?}}\", \
+                 {p}lookahead);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - integer: {{}}\", \
+                 {p}integer);",
+                p = self.prefix
+            );
+        }
+
+        // Loop.
+        rust!(self.out, "'{}inner: loop {{", self.prefix);
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+
+        // Load the next action to take.
+        rust!(
+            self.out,
+            "let {}action = {}ACTION[{}state * {} + {}integer];",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.grammar.terminals.all.len(),
+            self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"state: {{}} lookahead: {{:?}}/{{}} action: {{}} stack-depth: {{}}\", \
+                 {p}state, {p}lookahead, {p}integer, {p}action, {p}symbols.len());",
+                p = self.prefix
+            );
+        }
+
+        // Shift.
+        rust!(self.out, "if {}action > 0 {{", self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"--> shift `{{:?}}`\", {p}lookahead);",
+                p = self.prefix
+            );
+        }
+        try!(self.token_to_symbol());
+        rust!(
+            self.out,
+            "{}states.push({}action - 1);",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "{}symbols.push(({}lookahead.0, {}symbol, {}lookahead.2));",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "continue '{}shift;", self.prefix);
+
+        // Reduce.
+        rust!(self.out, "}} else if {}action < 0 {{", self.prefix);
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"--> reduce\");");
+        }
+        rust!(
+            self.out,
+            "if let Some(r) = {}reduce({}{}action, Some(&{}lookahead.0), &mut {}states, &mut \
+             {}symbols, {}) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            phantom_data_expr
+        );
+        rust!(self.out, "if r.is_err() {{");
+        rust!(self.out, "return r;");
+        rust!(self.out, "}}");
+        rust!(
+            self.out,
+            "return Err({}lalrpop_util::ParseError::ExtraToken {{ token: {}lookahead }});",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}}");
+
+        // Error.
+        rust!(self.out, "}} else {{");
+
+        self.try_error_recovery(
+            "tokens",
+            "states",
+            "symbols",
+            "last_location",
+            Some(("lookahead", "integer", "inner", "shift")),
+        )?;
+
+        rust!(self.out, "}}"); // if-else-if-else
+
+        rust!(self.out, "}}"); // reduce loop
+
+        rust!(self.out, "}}"); // shift loop
+
+        // EOF loop
+        rust!(self.out, "loop {{");
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"EOF loop state: {{}}\", {}state);",
+                self.prefix
+            );
+        }
+        rust!(
+            self.out,
+            "let {}action = {}EOF_ACTION[{}state];",
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"EOF in state {{}} takes action {{}}\", {}state, {}action);",
+                self.prefix,
+                self.prefix
+            );
+        }
+        rust!(self.out, "if {}action < 0 {{", self.prefix);
+        rust!(
+            self.out,
+            "if let Some(r) = {}reduce({}{}action, None, &mut {}states, &mut {}symbols, {}) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            phantom_data_expr
+        );
+        rust!(self.out, "return r;");
+        rust!(self.out, "}}");
+        rust!(self.out, "}} else {{");
+
+        self.try_error_recovery("tokens", "states", "symbols", "last_location", None)?;
+
+        rust!(self.out, "}}"); // else
+
+        rust!(self.out, "}}"); // while let
+
+        self.end_parser_fn()
+    }
+
+    fn next_token(
+        &mut self,
+        lookahead: &str,
+        tokens: &str,
+        last_location: &str,
+        break_on_eof: &str,
+    ) -> io::Result<()> {
+        rust!(
+            self.out,
+            "{p}{lookahead} = match {p}{tokens}.next() {{",
+            lookahead = lookahead,
+            tokens = tokens,
+            p = self.prefix
+        );
+        rust!(self.out, "Some(Ok(v)) => v,");
+        rust!(self.out, "None => break '{}{},", self.prefix, break_on_eof); // EOF: break out
+        if self.grammar.intern_token.is_some() {
+            // when we generate the tokenizer, the generated errors are `ParseError` values
+            rust!(self.out, "Some(Err(e)) => return Err(e),");
+        } else {
+            // otherwise, they are user errors
+            rust!(
+                self.out,
+                "Some(Err(e)) => return Err({p}lalrpop_util::ParseError::User {{ error: e }}),",
+                p = self.prefix
+            );
+        }
+        rust!(self.out, "}};");
+        rust!(
+            self.out,
+            "*{p}{last_location} = {p}{lookahead}.2.clone();",
+            last_location = last_location,
+            lookahead = lookahead,
+            p = self.prefix
+        );
+        Ok(())
+    }
+
+    fn token_to_integer(&mut self, integer: &str, lookahead: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "{p}{integer} = match {p}{lookahead}.1 {{",
+            integer = integer,
+            lookahead = lookahead,
+            p = self.prefix
+        );
+        for (terminal, index) in self.grammar.terminals.all.iter().zip(0..) {
+            if *terminal == TerminalString::Error {
+                continue;
+            }
+            let pattern = self.grammar.pattern(terminal).map(&mut |_| "_");
+            rust!(
+                self.out,
+                "{pattern} if true => {index},",
+                pattern = pattern,
+                index = index
+            );
+        }
+
+        rust!(self.out, "_ => {{");
+        let prefix = self.prefix;
+        try!(self.let_unrecognized_token_error(
+            "error",
+            &format!("Some({p}{lookahead})", lookahead = lookahead, p = prefix)
+        ));
+        rust!(self.out, "return Err({p}error);", p = self.prefix);
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn token_to_symbol(&mut self) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}symbol = match {}integer {{",
+            self.prefix,
+            self.prefix
+        );
+        for (terminal, index) in self.grammar.terminals.all.iter().zip(0..) {
+            if *terminal == TerminalString::Error {
+                continue;
+            }
+            rust!(self.out, "{} => match {}lookahead.1 {{", index, self.prefix);
+
+            let mut pattern_names = vec![];
+            let pattern = self.grammar.pattern(terminal).map(&mut |_| {
+                let index = pattern_names.len();
+                pattern_names.push(format!("{}tok{}", self.prefix, index));
+                pattern_names.last().cloned().unwrap()
+            });
+
+            let mut pattern = format!("{}", pattern);
+            if pattern_names.is_empty() {
+                pattern_names.push(format!("{}tok", self.prefix));
+                pattern = format!("{}tok @ {}", self.prefix, pattern);
+            }
+
+            let variant_name = self.variant_name_for_symbol(&Symbol::Terminal(terminal.clone()));
+            rust!(
+                self.out,
+                "{} => {}Symbol::{}(({})),",
+                pattern,
+                self.prefix,
+                variant_name,
+                pattern_names.join(", ")
+            );
+            rust!(self.out, "_ => unreachable!(),");
+            rust!(self.out, "}},");
+        }
+
+        rust!(self.out, "_ => unreachable!(),");
+
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn emit_reduce_actions(&mut self) -> io::Result<()> {
+        let success_type = self.types.nonterminal_type(&self.start_symbol);
+        let parse_error_type = self.types.parse_error_type();
+        let loc_type = self.types.terminal_loc_type();
+        let spanned_symbol_type = self.spanned_symbol_type();
+
+        let parameters = vec![
+            format!("{}action: {}", self.prefix, self.custom.state_type),
+            format!("{}lookahead_start: Option<&{}>", self.prefix, loc_type),
+            format!(
+                "{}states: &mut ::std::vec::Vec<{}>",
+                self.prefix, self.custom.state_type
+            ),
+            format!(
+                "{}symbols: &mut ::std::vec::Vec<{}>",
+                self.prefix, spanned_symbol_type
+            ),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Pub(Some(Path::from_id(Atom::from("crate")))),
+            format!("{}reduce", self.prefix),
+            vec![],
+            None,
+            parameters,
+            format!("Option<Result<{},{}>>", success_type, parse_error_type),
+            vec![]
+        ));
+        rust!(self.out, "{{");
+
+        rust!(
+            self.out,
+            "let ({p}pop_states, {p}symbol, {p}nonterminal) = match -{}action {{",
+            p = self.prefix
+        );
+        for (production, index) in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(1..)
+        {
+            rust!(self.out, "{} => {{", index);
+            // In debug builds LLVM is not very good at reusing stack space which makes this
+            // reduce function take up O(number of states) space. By wrapping each reduce action in
+            // an immediately called closure each reduction takes place in their own function
+            // context which ends up reducing the stack space used.
+
+            // Fallible actions and the start symbol may do early returns so we avoid wrapping
+            // those
+            let is_fallible = self.grammar.action_is_fallible(production.action);
+            let reduce_stack_space = !is_fallible && production.nonterminal != self.start_symbol;
+
+            if reduce_stack_space {
+                rust!(self.out, "(|| {{");
+            }
+
+            try!(self.emit_reduce_action(production));
+
+            if reduce_stack_space {
+                rust!(self.out, "}})()");
+            }
+
+            rust!(self.out, "}}");
+        }
+        rust!(
+            self.out,
+            "_ => panic!(\"invalid action code {{}}\", {}action)",
+            self.prefix
+        );
+        rust!(self.out, "}};");
+
+        // pop the consumed states from the stack
+        rust!(
+            self.out,
+            "let {p}states_len = {p}states.len();",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "{p}states.truncate({p}states_len - {p}pop_states);",
+            p = self.prefix
+        );
+
+        rust!(self.out, "{p}symbols.push({p}symbol);", p = self.prefix);
+
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "let {}next_state = {}GOTO[{}state * {} + {}nonterminal] - 1;",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.grammar.nonterminals.len(),
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"goto state {{}} from {{}} due to nonterminal {{}}\", {}next_state, \
+                 {}state, {}nonterminal);",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+        rust!(
+            self.out,
+            "{}states.push({}next_state);",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "None");
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    fn emit_reduce_action(&mut self, production: &Production) -> io::Result<()> {
+        rust!(self.out, "// {:?}", production);
+
+        // Pop each of the symbols and their associated states.
+        for (index, symbol) in production.symbols.iter().enumerate().rev() {
+            let name = self.variant_name_for_symbol(symbol);
+            rust!(
+                self.out,
+                "let {}sym{} = {}pop_{}({}symbols);",
+                self.prefix,
+                index,
+                self.prefix,
+                name,
+                self.prefix
+            );
+        }
+        let transfer_syms: Vec<_> = (0..production.symbols.len())
+            .map(|i| format!("{}sym{}", self.prefix, i))
+            .collect();
+
+        // Execute the action fn
+        // identify the "start" location for this production; this
+        // is typically the start of the first symbol we are
+        // reducing; but in the case of an empty production, it
+        // will be the last symbol pushed, or at worst `default`.
+        if let Some(first_sym) = transfer_syms.first() {
+            rust!(
+                self.out,
+                "let {}start = {}.0.clone();",
+                self.prefix,
+                first_sym
+            );
+        } else {
+            // we pop no symbols, so grab from the top of the stack
+            // (unless we are in the start state, in which case the
+            // stack will be empty)
+            rust!(
+                self.out,
+                "let {}start = {}symbols.last().map(|s| s.2.clone()).unwrap_or_default();",
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        // identify the "end" location for this production;
+        // this is typically the end of the last symbol we are reducing,
+        // but in the case of an empty production it will come from the
+        // lookahead
+        if let Some(last_sym) = transfer_syms.last() {
+            rust!(self.out, "let {}end = {}.2.clone();", self.prefix, last_sym);
+        } else {
+            rust!(
+                self.out,
+                "let {}end = {}lookahead_start.cloned().unwrap_or_else(|| \
+                 {}start.clone());",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        let transfered_syms = transfer_syms.len();
+
+        let mut args = transfer_syms;
+        if transfered_syms == 0 {
+            args.push(format!("&{}start", self.prefix));
+            args.push(format!("&{}end", self.prefix));
+        }
+
+        // invoke the action code
+        let is_fallible = self.grammar.action_is_fallible(production.action);
+        if is_fallible {
+            rust!(
+                self.out,
+                "let {}nt = match {}::{}action{}::<{}>({}{}) {{",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            );
+            rust!(self.out, "Ok(v) => v,");
+            rust!(self.out, "Err(e) => return Some(Err(e)),");
+            rust!(self.out, "}};");
+        } else {
+            rust!(
+                self.out,
+                "let {}nt = {}::{}action{}::<{}>({}{});",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            );
+        }
+
+        // if this is the final state, return it
+        if production.nonterminal == self.start_symbol {
+            rust!(self.out, "return Some(Ok({}nt));", self.prefix);
+            return Ok(());
+        }
+
+        // push the produced value on the stack
+        let name =
+            self.variant_name_for_symbol(&Symbol::Nonterminal(production.nonterminal.clone()));
+        rust!(
+            self.out,
+            "let {}symbol = ({}start, {}Symbol::{}({}nt), {}end);",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            name,
+            self.prefix,
+            self.prefix
+        );
+
+        // produce the index that we will use to extract the next state
+        // from GOTO array
+        let index = self.custom
+            .all_nonterminals
+            .iter()
+            .position(|x| *x == production.nonterminal)
+            .unwrap();
+        rust!(
+            self.out,
+            "({len}, {p}symbol, {index})",
+            p = self.prefix,
+            index = index,
+            len = production.symbols.len()
+        );
+
+        Ok(())
+    }
+
+    fn variant_name_for_symbol(&mut self, s: &Symbol) -> String {
+        self.custom.variant_names[s].clone()
+    }
+
+    fn emit_downcast_fns(&mut self) -> io::Result<()> {
+        for (ty, name) in self.custom.variants.clone() {
+            try!(self.emit_downcast_fn(&name, ty));
+        }
+
+        Ok(())
+    }
+
+    fn emit_downcast_fn(&mut self, variant_name: &str, variant_ty: TypeRepr) -> io::Result<()> {
+        let spanned_symbol_type = self.spanned_symbol_type();
+
+        rust!(self.out, "fn {}pop_{}<", self.prefix, variant_name);
+        for type_parameter in &self.custom.symbol_type_params {
+            rust!(self.out, "  {},", type_parameter);
+        }
+        rust!(self.out, ">(");
+        rust!(
+            self.out,
+            "{}symbols: &mut ::std::vec::Vec<{}>",
+            self.prefix,
+            spanned_symbol_type
+        );
+        rust!(self.out, ") -> {}", self.types.spanned_type(variant_ty));
+
+        if !self.custom.symbol_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.symbol_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"pop_{}\");", variant_name);
+        }
+        rust!(self.out, "match {}symbols.pop().unwrap() {{", self.prefix);
+        rust!(
+            self.out,
+            "({}l, {}Symbol::{}({}v), {}r) => ({}l, {}v, {}r),",
+            self.prefix,
+            self.prefix,
+            variant_name,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "_ => panic!(\"symbol type mismatch\")");
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}}");
+
+        Ok(())
+    }
+
+    /// Tries to invoke the error recovery function. Takes a bunch of
+    /// arguments from the surrounding state:
+    ///
+    /// - `tokens` -- name of a mut variable of type `I` where `I` is an iterator over tokens
+    /// - `symbols` -- name of symbols vector
+    /// - `last_location` -- name of `last_location` variable
+    /// - `opt_lookahead` -- see below
+    ///
+    /// The `opt_lookahead` tuple contains the lookahead -- if any --
+    /// or None for EOF. It is a 4-tuple: (lookahead, integer,
+    /// tok_target, and eof_target). The idea is like this: on entry,
+    /// lookahead/integer have values. On exit, if the next token is
+    /// EOF, because we have dropped all remaining tokens, we will
+    /// `break` to `eof_target`.  Otherwise, we will `continue` to
+    /// `tok_target` after storing next token into the variable
+    /// `lookahead` and its integer index into `integer`.
+    fn try_error_recovery(
+        &mut self,
+        tokens: &str,
+        states: &str,
+        symbols: &str,
+        last_location: &str,
+        opt_lookahead: Option<(&str, &str, &str, &str)>,
+    ) -> io::Result<()> {
+        if let Some((out_lookahead, out_integer, _, _)) = opt_lookahead {
+            rust!(
+                self.out,
+                "let mut {p}err_lookahead = Some({p}{});",
+                out_lookahead,
+                p = self.prefix,
+            );
+
+            rust!(
+                self.out,
+                "let mut {p}err_integer: Option<usize> = Some({p}{});",
+                out_integer,
+                p = self.prefix,
+            );
+        } else {
+            rust!(
+                self.out,
+                "let mut {p}err_lookahead = None;",
+                p = self.prefix,
+            );
+
+            rust!(
+                self.out,
+                "let mut {p}err_integer: Option<usize> = None;",
+                p = self.prefix,
+            );
+        }
+
+        // Easy case: error recovery is disabled. Just error out.
+        if !self.grammar.uses_error_recovery {
+            let prefix = self.prefix;
+            self.let_unrecognized_token_error("error", &format!("{p}err_lookahead", p = prefix))?;
+            rust!(self.out, "return Err({p}error)", p = prefix);
+            return Ok(());
+        }
+
+        let phantom_data_expr = self.phantom_data_expr();
+
+        rust!(
+            self.out,
+            "match {p}error_recovery(\
+             {upr} \
+             &mut {p}{tokens}, \
+             &mut {p}{states}, \
+             &mut {p}{symbols}, \
+             {p}{last_location}, \
+             &mut {p}err_lookahead, \
+             &mut {p}err_integer, \
+             {phantom_data_expr}) {{",
+            upr = self.grammar.user_parameter_refs(),
+            tokens = tokens,
+            states = states,
+            symbols = symbols,
+            last_location = last_location,
+            phantom_data_expr = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "Err({p}e) => return Err({p}e),", p = self.prefix);
+        rust!(
+            self.out,
+            "Ok(Some({p}v)) => return Ok({p}v),",
+            p = self.prefix
+        );
+        rust!(self.out, "Ok(None) => (),");
+        rust!(self.out, "}}");
+
+        if let Some((out_lookahead, out_integer, tok_target, eof_target)) = opt_lookahead {
+            rust!(
+                self.out,
+                "match ({p}err_lookahead, {p}err_integer) {{",
+                p = self.prefix
+            );
+            rust!(self.out, "(Some({p}l), Some({p}i)) => {{", p = self.prefix);
+            rust!(self.out, "{p}{} = {p}l;", out_lookahead, p = self.prefix);
+            rust!(self.out, "{p}{} = {p}i;", out_integer, p = self.prefix);
+            rust!(self.out, "continue '{p}{};", tok_target, p = self.prefix);
+            rust!(self.out, "}}"); // end arm
+            rust!(self.out, "_ => break '{p}{},", eof_target, p = self.prefix);
+            rust!(self.out, "}}"); // end match
+        }
+
+        Ok(())
+    }
+
+    fn write_error_recovery_fn(&mut self) -> io::Result<()> {
+        // Easy case: error recovery is disabled. Just error out.
+        if !self.grammar.uses_error_recovery {
+            return Ok(());
+        }
+
+        let parse_error_type = self.types.parse_error_type();
+        let error_type = self.types.error_type();
+        let spanned_symbol_type = self.spanned_symbol_type();
+        let triple_type = self.types.triple_type();
+        let loc_type = self.types.terminal_loc_type();
+        let prefix = self.prefix;
+        let actions_per_state = self.grammar.terminals.all.len();
+        let start_type = self.types.nonterminal_type(&self.start_symbol);
+
+        // The tokenizr, when we supply it, returns parse
+        // errors. Otherwise, it returns custom user errors.
+        let tok_error_type = if self.grammar.intern_token.is_some() {
+            parse_error_type
+        } else {
+            &error_type
+        };
+
+        let parameters = vec![
+            format!("{p}tokens: &mut {p}I", p = self.prefix),
+            format!(
+                "{p}states: &mut ::std::vec::Vec<{typ}>",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!(
+                "{p}symbols: &mut ::std::vec::Vec<{spanned_symbol_type}>",
+                spanned_symbol_type = spanned_symbol_type,
+                p = self.prefix
+            ),
+            format!(
+                "{p}last_location: &mut {loc_type}",
+                loc_type = loc_type,
+                p = self.prefix
+            ),
+            format!(
+                "{p}opt_lookahead: &mut Option<{triple_type}>",
+                triple_type = triple_type,
+                p = self.prefix
+            ),
+            format!("{p}opt_integer: &mut Option<usize>", p = self.prefix),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{p}error_recovery", p = self.prefix),
+            vec![format!("{p}I", p = self.prefix)],
+            None,
+            parameters,
+            format!(
+                "Result<Option<{start_type}>, {parse_error_type}>",
+                start_type = start_type,
+                parse_error_type = parse_error_type
+            ),
+            vec![
+                format!(
+                    "{p}I: Iterator<Item = \
+                     Result<{triple_type}, {tok_error_type}>\
+                     >",
+                    triple_type = triple_type,
+                    tok_error_type = tok_error_type,
+                    p = self.prefix
+                ),
+            ]
+        ));
+
+        rust!(self.out, "{{");
+
+        self.let_unrecognized_token_error(
+            "error",
+            &format!("{p}opt_lookahead.clone()", p = prefix),
+        )?;
+
+        rust!(self.out, "let mut {}dropped_tokens = vec![];", prefix);
+
+        let phantom_data_expr = self.phantom_data_expr();
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Initiating error recovery in state: {{}}\", \
+                 {p}states.last().unwrap());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - state stack size: {{}}\", \
+                 {p}states.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - symbol stack size: {{}}\", \
+                 {p}symbols.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - opt lookahead: {{:?}}\", \
+                 {p}opt_lookahead);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - opt integer: {{:?}}\", \
+                 {p}opt_integer);",
+                p = self.prefix
+            );
+        }
+
+        // We are going to insert ERROR into the lookahead. So, first,
+        // perform all reductions from current state triggered by having
+        // ERROR in the lookahead.
+        rust!(self.out, "loop {{");
+        rust!(
+            self.out,
+            "let {p}state = *{p}states.last().unwrap() as usize;",
+            p = self.prefix
+        );
+
+        // Access the action with `error` as the lookahead; it is always final
+        // column in the row for this state
+        rust!(
+            self.out,
+            "let {p}action = {p}ACTION[{p}state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        rust!(self.out, "if {p}action >= 0 {{", p = self.prefix);
+        rust!(self.out, "break;");
+        rust!(self.out, "}}");
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery reduces on action: {{}}", {}action);"#,
+                self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}lookahead_start = {p}opt_lookahead.as_ref().map(|l| &l.0);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "if let Some(r) = {p}reduce( \
+             {upr} \
+             {p}action, \
+             {p}lookahead_start, \
+             {p}states, \
+             {p}symbols, \
+             {phantoms} \
+             ) {{",
+            upr = self.grammar.user_parameter_refs(),
+            phantoms = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "return Ok(Some(r?));");
+        rust!(self.out, "}}");
+        rust!(self.out, "}}"); // end reduce loop
+
+        // Now try to find the recovery state.
+
+        rust!(
+            self.out,
+            "let {p}states_len = {p}states.len();",
+            p = self.prefix
+        );
+
+        // I'd rather generate `let top = loop {{...}}` but I do not
+        // to retain compatibility with Rust 1.16.0.
+        rust!(self.out, "let {p}top0;", p = self.prefix);
+
+        rust!(self.out, "'{p}find_state: loop {{", p = self.prefix);
+
+        // Go backwards through the states...
+        rust!(
+            self.out,
+            "for {p}top in (0..{p}states_len).rev() {{",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}state = {p}states[{p}top] as usize;",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Probing recovery from state {{}} (top = {{}}).\", {p}state, {p}top);",
+                p = self.prefix,
+            );
+        }
+        // ...fetch action for error token...
+        rust!(
+            self.out,
+            "let {p}action = {p}ACTION[{p}state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        // ...if action is error or reduce, go to next state...
+        rust!(
+            self.out,
+            "if {p}action <= 0 {{ continue; }}",
+            p = self.prefix
+        );
+        // ...otherwise, action *must* be shift. That would take us into `error_state`.
+        rust!(
+            self.out,
+            "let {p}error_state = {p}action - 1;",
+            p = self.prefix
+        );
+        // If `error_state` can accept this lookahead, we are done.
+        rust!(
+            self.out,
+            "if {p}accepts(\
+             {upr} \
+             {p}error_state, \
+             &{p}states[..{p}top + 1], \
+             *{p}opt_integer, \
+             {phantoms},\
+             ) {{",
+            upr = self.grammar.user_parameter_refs(),
+            phantoms = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "{p}top0 = {p}top;", p = self.prefix);
+        rust!(self.out, "break '{p}find_state;", p = self.prefix);
+        rust!(self.out, "}}"); // end if
+        rust!(self.out, "}}"); // end for
+
+        // Otherwise, if we did not find any enclosing state that can
+        // error and then accept this lookahead, we need to drop the current token.
+
+        // Introduce an artificial loop here so we can break to
+        // it. This is a hack to re-use the `next_token` function.
+        rust!(self.out, "'{p}eof: loop {{", p = self.prefix);
+        rust!(
+            self.out,
+            "match {p}opt_lookahead.take() {{",
+            p = self.prefix
+        );
+
+        // If the lookahead is EOF, and there is no suitable state to
+        // recover to, we just have to abort EOF recovery. Find the
+        // first token that we dropped (if any) and use that as the
+        // point of error.
+        rust!(self.out, "None => {{");
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery: cannot drop EOF; aborting");"#
+            );
+        }
+        rust!(self.out, "return Err({}error)", prefix);
+        rust!(self.out, "}}"); // end None arm
+
+        // Else, drop the current token and shift to the next. If there is a next
+        // token, we will `continue` to the start of the `'find_state` loop.
+        rust!(self.out, "Some(mut {p}lookahead) => {{", p = self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery: dropping token `{{:?}}`", {p}lookahead);"#,
+                p = self.prefix,
+            );
+        }
+        rust!(
+            self.out,
+            "{p}dropped_tokens.push({p}lookahead);",
+            p = self.prefix
+        );
+        self.next_token("lookahead", "tokens", "last_location", "eof")?;
+        rust!(self.out, "let {p}integer;", p = self.prefix);
+        try!(self.token_to_integer("integer", "lookahead"));
+        rust!(
+            self.out,
+            "*{p}opt_lookahead = Some({p}lookahead);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "*{p}opt_integer = Some({p}integer);",
+            p = self.prefix
+        );
+        rust!(self.out, "continue '{p}find_state;", p = self.prefix);
+        rust!(self.out, "}}"); // end Some(_) arm
+        rust!(self.out, "}}"); // end match
+        rust!(self.out, "}}"); // end 'eof loop
+
+        // The `next_token` function will break here (out of the
+        // `'eof` loop) when we encounter EOF (i.e., there is no
+        // `next_token`). Just set `opt_lookahead` to `None` in that
+        // case.
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Encountered EOF during error recovery\");"
+            );
+        }
+        rust!(self.out, "*{p}opt_lookahead = None;", p = self.prefix);
+        rust!(self.out, "*{p}opt_integer = None;", p = self.prefix);
+        rust!(self.out, "}};"); // end 'find_state loop
+
+        // If we get here, we are ready to push the error recovery state.
+
+        // We have to compute the span for the error recovery
+        // token. We do this first, before we pop any symbols off the
+        // stack. There are several possibilities, in order of
+        // preference.
+        //
+        // For the **start** of the message, we prefer to use the start of any
+        // popped states. This represents parts of the input we had consumed but
+        // had to roll back and ignore.
+        //
+        // Example:
+        //
+        //       a + (b + /)
+        //              ^ start point is here, since this `+` will be popped off
+        //
+        // If there are no popped states, but there *are* dropped tokens, we can use
+        // the start of those.
+        //
+        // Example:
+        //
+        //       a + (b + c e)
+        //                  ^ start point would be here
+        //
+        // Finally, if there are no popped states *nor* dropped tokens, we can use
+        // the end of the top-most state.
+
+        rust!(self.out, "let {p}top = {p}top0;", p = self.prefix);
+        rust!(
+            self.out,
+            "let {p}start = if let Some({p}popped_sym) = {p}symbols.get({p}top) {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from popped symbol {{:?}}\", \
+                 (&{p}popped_sym.0 .. &{p}popped_sym.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}popped_sym.0.clone()", p = self.prefix);
+        rust!(
+            self.out,
+            "}} else if let Some({p}dropped_token) = {p}dropped_tokens.first() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from dropped token {{:?}}\", \
+                 (&{p}dropped_token.0 .. &{p}dropped_token.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}dropped_token.0.clone()", p = self.prefix);
+        rust!(self.out, "}} else if {p}top > 0 {{", p = self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from end of last retained symbol\");"
+            );
+        }
+        rust!(
+            self.out,
+            "{p}symbols[{p}top - 1].2.clone()",
+            p = self.prefix
+        );
+        rust!(self.out, "}} else {{");
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span starts from default\");");
+        }
+        rust!(self.out, "Default::default()");
+        rust!(self.out, "}};"); // end if
+
+        // For the end span, here are the possibilities:
+        //
+        // We prefer to use the end of the last dropped token.
+        //
+        // Examples:
+        //
+        //       a + (b + /)
+        //              ---
+        //       a + (b c)
+        //              -
+        //
+        // But, if there are no dropped tokens, we will use the end of the popped states,
+        // if any:
+        //
+        //       a + /
+        //         -
+        //
+        // If there are neither dropped tokens *or* popped states,
+        // then the user is simulating insertion of an operator. In
+        // this case, we prefer the start of the lookahead, but
+        // fallback to the start if we are at EOF.
+        //
+        // Examples:
+        //
+        //       a + (b c)
+        //             -
+        rust!(
+            self.out,
+            "let {p}end = if let Some({p}dropped_token) = {p}dropped_tokens.last() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span ends at end of last dropped token {{:?}}\", \
+                 (&{p}dropped_token.0 .. &{p}dropped_token.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}dropped_token.2.clone()", p = self.prefix);
+        rust!(
+            self.out,
+            "}} else if {p}states_len - 1 > {p}top {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span ends at end of last popped symbol {{:?}}\", \
+                 {p}symbols.last().unwrap().2);",
+                p = self.prefix,
+            );
+        }
+        rust!(
+            self.out,
+            "{p}symbols.last().unwrap().2.clone()",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "}} else if let Some({p}lookahead) = {p}opt_lookahead.as_ref() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span ends at start of lookahead\");");
+        }
+        rust!(self.out, "{p}lookahead.0.clone()", p = self.prefix);
+        rust!(self.out, "}} else {{");
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span ends at start\");");
+        }
+        rust!(self.out, "{p}start.clone()", p = self.prefix);
+        rust!(self.out, "}};"); // end if
+
+        // First we have to pop off the states we are skipping. Note
+        // that the bottom-most state doesn't have a symbol, so the
+        // symbols vector is always 1 shorter, hence we truncate its
+        // length to `{p}top` not `{p}top + 1`.
+        rust!(self.out, "{p}states.truncate({p}top + 1);", p = self.prefix);
+        rust!(self.out, "{p}symbols.truncate({p}top);", p = self.prefix);
+
+        // Now load the new top state.
+        rust!(
+            self.out,
+            "let {p}recover_state = {p}states[{p}top] as usize;",
+            p = self.prefix
+        );
+
+        // Load the error action, which must be a shift.
+        rust!(
+            self.out,
+            "let {p}error_action = {p}ACTION[{p}recover_state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}error_state = {p}error_action - 1;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Recovering from error:\");");
+            rust!(
+                self.out,
+                "println!(\"  - recovery base state: {{}}\", {p}top);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new top state {{}}\", {p}recover_state);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - error state {{}}\", {p}error_state);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new stack length: {{}}\", {p}states.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new symbol length: {{}}\", {p}symbols.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - span {{:?}}..{{:?}}\", {p}start, {p}end);",
+                p = self.prefix
+            );
+        }
+
+        // Push the error state onto the stack.
+        rust!(self.out, "{p}states.push({p}error_state);", p = self.prefix);
+        rust!(
+            self.out,
+            "let {p}recovery = {}lalrpop_util::ErrorRecovery {{",
+            p = self.prefix
+        );
+        rust!(self.out, "error: {p}error,", p = self.prefix);
+        rust!(
+            self.out,
+            "dropped_tokens: {p}dropped_tokens,",
+            p = self.prefix
+        );
+        rust!(self.out, "}};");
+
+        let error_variant = self.variant_name_for_symbol(&Symbol::Terminal(TerminalString::Error));
+        rust!(
+            self.out,
+            "{p}symbols.push(({p}start, {p}Symbol::{e}({p}recovery), {p}end));",
+            p = self.prefix,
+            e = error_variant
+        );
+
+        rust!(self.out, "Ok(None)");
+        rust!(self.out, "}}"); // end fn
+        Ok(())
+    }
+
+    /// The `accepts` function
+    ///
+    /// ```ignore
+    /// fn __accepts() {
+    ///     error_state: i32,
+    ///     states: &Vec<i32>,
+    ///     opt_integer: Option<usize>,
+    /// ) -> bool {
+    ///     ...
+    /// }
+    /// ```
+    ///
+    /// has the job of figuring out whether the given error state would
+    /// "accept" the given lookahead. We basically trace through the LR
+    /// automaton looking for one of two outcomes:
+    ///
+    /// - the lookahead is eventually shifted
+    /// - we reduce to the end state successfully (in the case of EOF).
+    ///
+    /// If we used the pure LR(1) algorithm, we wouldn't need this
+    /// function, because we would be guaranteed to error immediately
+    /// (and not after some number of reductions). But with an LALR
+    /// (or Lane Table) generated automaton, it is possible to reduce
+    /// some number of times before encountering an error. Failing to
+    /// take this into account can lead error recovery into an
+    /// infinite loop (see the `error_recovery_lalr_loop` test) or
+    /// produce crappy results (see `error_recovery_lock_in`).
+    fn write_accepts_fn(&mut self) -> io::Result<()> {
+        if !self.grammar.uses_error_recovery {
+            return Ok(());
+        }
+
+        let actions_per_state = self.grammar.terminals.all.len();
+        let parameters = vec![
+            format!(
+                "{p}error_state: {typ}",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!(
+                "{p}states: & [{typ}]",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!("{p}opt_integer: Option<usize>", p = self.prefix),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{}accepts", self.prefix),
+            vec![],
+            None,
+            parameters,
+            format!("bool"),
+            vec![]
+        ));
+        rust!(self.out, "{{");
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Testing whether state {{}} accepts token {{:?}}\", \
+                 {p}error_state, {p}opt_integer);",
+                p = self.prefix
+            );
+        }
+
+        // Create our own copy of the state stack to play with.
+        rust!(
+            self.out,
+            "let mut {p}states = {p}states.to_vec();",
+            p = self.prefix
+        );
+        rust!(self.out, "{p}states.push({p}error_state);", p = self.prefix);
+
+        rust!(self.out, "loop {{",);
+
+        rust!(
+            self.out,
+            "let mut {}states_len = {}states.len();",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(
+            self.out,
+            "let {p}top = {p}states[{p}states_len - 1] as usize;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"accepts: top-state={{}} num-states={{}}\", {p}top, {p}states_len);",
+                p = self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}action = match {p}opt_integer {{",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "None => {p}EOF_ACTION[{p}top as usize],",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "Some({p}integer) => {p}ACTION[{p}top * {actions_per_state} + {p}integer],",
+            p = self.prefix,
+            actions_per_state = actions_per_state,
+        );
+        rust!(self.out, "}};"); // end `match`
+
+        // If we encounter an error action, we do **not** accept.
+        rust!(
+            self.out,
+            "if {p}action == 0 {{ return false; }}",
+            p = self.prefix
+        );
+
+        // If we encounter a shift action, we DO accept.
+        rust!(
+            self.out,
+            "if {p}action > 0 {{ return true; }}",
+            p = self.prefix
+        );
+
+        // If we encounter a reduce action, we need to simulate its
+        // effect on the state stack.
+        rust!(
+            self.out,
+            "let ({p}to_pop, {p}nt) = match -{p}action {{",
+            p = self.prefix
+        );
+        for (production, index) in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(1..)
+        {
+            if Tls::session().emit_comments {
+                rust!(self.out, "// simulate {:?}", production);
+            }
+
+            // if we just reduced the start symbol, that is also an accept criteria
+            if production.nonterminal == self.start_symbol {
+                rust!(self.out, "{} => return true,", index);
+            } else {
+                let num_symbols = production.symbols.len();
+                let nt = self.custom
+                    .all_nonterminals
+                    .iter()
+                    .position(|x| *x == production.nonterminal)
+                    .unwrap();
+                rust!(self.out, "{} => {{", index);
+                if DEBUG_PRINT {
+                    rust!(
+                        self.out,
+                        "println!(r##\"accepts: simulating {:?}\"##);",
+                        production
+                    );
+                }
+                rust!(
+                    self.out,
+                    "({num_symbols}, {nt})",
+                    num_symbols = num_symbols,
+                    nt = nt
+                );
+                rust!(self.out, "}}");
+            }
+        }
+        rust!(
+            self.out,
+            "_ => panic!(\"invalid action code {{}}\", {}action)",
+            self.prefix
+        );
+        rust!(self.out, "}};"); // end match
+
+        rust!(self.out, "{p}states_len -= {p}to_pop;", p = self.prefix);
+        rust!(
+            self.out,
+            "{p}states.truncate({p}states_len);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}top = {p}states[{p}states_len - 1] as usize;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"accepts: popped {{}} symbols, new top is {{}}, nt is {{}}\", \
+                 {p}to_pop, \
+                 {p}top, \
+                 {p}nt, \
+                 );",
+                p = self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}next_state = {p}GOTO[{p}top * {num_non_terminals} + {p}nt] - 1;",
+            p = self.prefix,
+            num_non_terminals = self.grammar.nonterminals.len(),
+        );
+
+        rust!(self.out, "{p}states.push({p}next_state);", p = self.prefix);
+
+        rust!(self.out, "}}"); // end loop
+        rust!(self.out, "}}"); // end fn
+
+        Ok(())
+    }
+
+    fn symbol_type(&self) -> String {
+        format!(
+            "{}Symbol<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.symbol_type_params)
+        )
+    }
+
+    fn spanned_symbol_type(&self) -> String {
+        let loc_type = self.types.terminal_loc_type();
+        format!("({},{},{})", loc_type, self.symbol_type(), loc_type)
+    }
+
+    fn let_unrecognized_token_error(&mut self, error_var: &str, token: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "let {}{} = {}lalrpop_util::ParseError::UnrecognizedToken {{",
+            self.prefix,
+            error_var,
+            self.prefix
+        );
+        rust!(self.out, "token: {},", token);
+        rust!(
+            self.out,
+            "expected: {}expected_tokens({}state),",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn emit_expected_tokens_fn(&mut self) -> io::Result<()> {
+        rust!(
+            self.out,
+            "fn {}expected_tokens({}state: usize) -> Vec<::std::string::String> {{",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(
+            self.out,
+            "const {}TERMINAL: &'static [&'static str] = &[",
+            self.prefix
+        );
+        let all_terminals = if self.grammar.uses_error_recovery {
+            // Subtract one to exlude the error terminal
+            &self.grammar.terminals.all[..self.grammar.terminals.all.len() - 1]
+        } else {
+            &self.grammar.terminals.all
+        };
+        for terminal in all_terminals {
+            // Three # should hopefully be enough to prevent any
+            // reasonable terminal from escaping the literal
+            rust!(self.out, "r###\"{}\"###,", terminal);
+        }
+        rust!(self.out, "];");
+
+        // Grab any terminals in the current state which would have resulted in a successful parse
+        rust!(
+            self.out,
+            "{}ACTION[({}state * {})..].iter().zip({}TERMINAL).filter_map(|(&state, terminal)| {{",
+            self.prefix,
+            self.prefix,
+            self.grammar.terminals.all.len(),
+            self.prefix
+        );
+        rust!(self.out, "if state == 0 {{");
+        rust!(self.out, "None");
+        rust!(self.out, "}} else {{");
+        rust!(self.out, "Some(terminal.to_string())");
+        rust!(self.out, "}}");
+        rust!(self.out, "}}).collect()");
+        rust!(self.out, "}}");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/codegen/test_all.rs
@@ -0,0 +1,145 @@
+//! A compiler from an LR(1) table to a [recursive ascent] parser.
+//!
+//! [recursive ascent]: https://en.wikipedia.org/wiki/Recursive_ascent_parser
+
+use grammar::repr::{Grammar, NonterminalString, TypeParameter};
+use lr1::core::*;
+use rust::RustWrite;
+use std::io::{self, Write};
+use util::Sep;
+
+use super::base::CodeGenerator;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let mut ascent =
+        CodeGenerator::new_test_all(grammar, user_start_symbol, start_symbol, states, out);
+    ascent.write()
+}
+
+struct TestAll;
+
+impl<'ascent, 'grammar, W: Write> CodeGenerator<'ascent, 'grammar, W, TestAll> {
+    fn new_test_all(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'ascent [LR1State<'grammar>],
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            true,
+            "super",
+            TestAll,
+        )
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_parser_fn());
+
+            rust!(this.out, "mod {}ascent {{", this.prefix);
+            try!(super::ascent::compile(
+                this.grammar,
+                this.user_start_symbol.clone(),
+                this.start_symbol.clone(),
+                this.states,
+                "super::super::super",
+                this.out
+            ));
+            let pub_use = format!(
+                "{}use self::{}parse{}::{}Parser;",
+                this.grammar.nonterminals[&this.user_start_symbol].visibility,
+                this.prefix,
+                this.start_symbol,
+                this.user_start_symbol
+            );
+            rust!(this.out, "{}", pub_use);
+            rust!(this.out, "}}");
+
+            rust!(this.out, "mod {}parse_table {{", this.prefix);
+            try!(super::parse_table::compile(
+                this.grammar,
+                this.user_start_symbol.clone(),
+                this.start_symbol.clone(),
+                this.states,
+                "super::super::super",
+                this.out
+            ));
+            rust!(this.out, "{}", pub_use);
+            rust!(this.out, "}}");
+
+            Ok(())
+        })
+    }
+
+    fn write_parser_fn(&mut self) -> io::Result<()> {
+        try!(self.start_parser_fn());
+
+        if self.grammar.intern_token.is_some() {
+            rust!(self.out, "let _ = self.builder;");
+        }
+        // parse input using both methods:
+        try!(self.call_delegate("ascent"));
+        try!(self.call_delegate("parse_table"));
+
+        // check that result is the same either way:
+        rust!(
+            self.out,
+            "assert_eq!({}ascent, {}parse_table);",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(self.out, "return {}ascent;", self.prefix);
+
+        try!(self.end_parser_fn());
+
+        Ok(())
+    }
+
+    fn call_delegate(&mut self, delegate: &str) -> io::Result<()> {
+        let non_lifetimes: Vec<_> = self.grammar
+            .type_parameters
+            .iter()
+            .filter(|&tp| match *tp {
+                TypeParameter::Lifetime(_) => false,
+                TypeParameter::Id(_) => true,
+            })
+            .cloned()
+            .collect();
+        let parameters = if non_lifetimes.is_empty() {
+            String::new()
+        } else {
+            format!("::<{}>", Sep(", ", &non_lifetimes))
+        };
+        rust!(
+            self.out,
+            "let {}{} = {}{}::{}Parser::new().parse{}(",
+            self.prefix,
+            delegate,
+            self.prefix,
+            delegate,
+            self.user_start_symbol,
+            parameters
+        );
+        for parameter in &self.grammar.parameters {
+            rust!(self.out, "{},", parameter.name);
+        }
+        if self.grammar.intern_token.is_none() {
+            rust!(self.out, "{}tokens0.clone(),", self.prefix);
+        }
+        rust!(self.out, ");");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/core/mod.rs
@@ -0,0 +1,333 @@
+//! Core LR(1) types.
+
+use collections::Map;
+use grammar::repr::*;
+use itertools::Itertools;
+use std::fmt::{Debug, Display, Error, Formatter};
+use std::rc::Rc;
+use util::Prefix;
+
+use super::lookahead::*;
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Item<'grammar, L: Lookahead> {
+    pub production: &'grammar Production,
+    /// the dot comes before `index`, so `index` would be 1 for X = A (*) B C
+    pub index: usize,
+    pub lookahead: L,
+}
+
+pub type LR0Item<'grammar> = Item<'grammar, Nil>;
+
+pub type LR1Item<'grammar> = Item<'grammar, TokenSet>;
+
+impl<'grammar> Item<'grammar, Nil> {
+    pub fn lr0(production: &'grammar Production, index: usize) -> Self {
+        Item {
+            production: production,
+            index: index,
+            lookahead: Nil,
+        }
+    }
+}
+
+impl<'grammar, L: Lookahead> Item<'grammar, L> {
+    pub fn with_lookahead<L1: Lookahead>(&self, l: L1) -> Item<'grammar, L1> {
+        Item {
+            production: self.production,
+            index: self.index,
+            lookahead: l,
+        }
+    }
+
+    pub fn prefix(&self) -> &'grammar [Symbol] {
+        &self.production.symbols[..self.index]
+    }
+
+    pub fn symbol_sets(&self) -> SymbolSets<'grammar> {
+        let symbols = &self.production.symbols;
+        if self.can_shift() {
+            SymbolSets {
+                prefix: &symbols[..self.index],
+                cursor: Some(&symbols[self.index]),
+                suffix: &symbols[self.index + 1..],
+            }
+        } else {
+            SymbolSets {
+                prefix: &symbols[..self.index],
+                cursor: None,
+                suffix: &[],
+            }
+        }
+    }
+
+    pub fn to_lr0(&self) -> LR0Item<'grammar> {
+        Item {
+            production: self.production,
+            index: self.index,
+            lookahead: Nil,
+        }
+    }
+
+    pub fn can_shift(&self) -> bool {
+        self.index < self.production.symbols.len()
+    }
+
+    pub fn can_shift_nonterminal(&self, nt: &NonterminalString) -> bool {
+        match self.shift_symbol() {
+            Some((Symbol::Nonterminal(shifted), _)) => shifted == *nt,
+            _ => false,
+        }
+    }
+
+    pub fn can_shift_terminal(&self, term: &TerminalString) -> bool {
+        match self.shift_symbol() {
+            Some((Symbol::Terminal(shifted), _)) => shifted == *term,
+            _ => false,
+        }
+    }
+
+    pub fn can_reduce(&self) -> bool {
+        self.index == self.production.symbols.len()
+    }
+
+    pub fn shifted_item(&self) -> Option<(Symbol, Item<'grammar, L>)> {
+        if self.can_shift() {
+            Some((
+                self.production.symbols[self.index].clone(),
+                Item {
+                    production: self.production,
+                    index: self.index + 1,
+                    lookahead: self.lookahead.clone(),
+                },
+            ))
+        } else {
+            None
+        }
+    }
+
+    pub fn shift_symbol(&self) -> Option<(Symbol, &[Symbol])> {
+        if self.can_shift() {
+            Some((
+                self.production.symbols[self.index].clone(),
+                &self.production.symbols[self.index + 1..],
+            ))
+        } else {
+            None
+        }
+    }
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct StateIndex(pub usize);
+
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Items<'grammar, L: Lookahead> {
+    pub vec: Rc<Vec<Item<'grammar, L>>>,
+}
+
+#[allow(dead_code)]
+pub type LR0Items<'grammar> = Items<'grammar, Nil>;
+#[allow(dead_code)]
+pub type LR1Items<'grammar> = Items<'grammar, TokenSet>;
+
+#[derive(Clone, Debug)]
+pub struct State<'grammar, L: Lookahead> {
+    pub index: StateIndex,
+    pub items: Items<'grammar, L>,
+    pub shifts: Map<TerminalString, StateIndex>,
+    pub reductions: Vec<(L, &'grammar Production)>,
+    pub gotos: Map<NonterminalString, StateIndex>,
+}
+
+pub type LR0State<'grammar> = State<'grammar, Nil>;
+pub type LR1State<'grammar> = State<'grammar, TokenSet>;
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Action<'grammar> {
+    Shift(TerminalString, StateIndex),
+    Reduce(&'grammar Production),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Conflict<'grammar, L> {
+    // when in this state...
+    pub state: StateIndex,
+
+    // with the following lookahead...
+    pub lookahead: L,
+
+    // we can reduce...
+    pub production: &'grammar Production,
+
+    // but we can also...
+    pub action: Action<'grammar>,
+}
+
+#[allow(dead_code)]
+pub type LR0Conflict<'grammar> = Conflict<'grammar, Nil>;
+pub type LR1Conflict<'grammar> = Conflict<'grammar, TokenSet>;
+
+#[derive(Debug)]
+pub struct TableConstructionError<'grammar, L: Lookahead> {
+    // LR(1) state set, possibly incomplete if construction is
+    // configured to terminate early.
+    pub states: Vec<State<'grammar, L>>,
+
+    // Conflicts (non-empty) found in those states.
+    pub conflicts: Vec<Conflict<'grammar, L>>,
+}
+
+pub type LR0TableConstructionError<'grammar> = TableConstructionError<'grammar, Nil>;
+pub type LR1TableConstructionError<'grammar> = TableConstructionError<'grammar, TokenSet>;
+pub type LRResult<'grammar, L> =
+    Result<Vec<State<'grammar, L>>, TableConstructionError<'grammar, L>>;
+pub type LR1Result<'grammar> = LRResult<'grammar, TokenSet>;
+
+impl<'grammar, L: Lookahead> Debug for Item<'grammar, L> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        try!(write!(
+            fmt,
+            "{} ={} (*){}",
+            self.production.nonterminal,
+            Prefix(" ", &self.production.symbols[..self.index]),
+            Prefix(" ", &self.production.symbols[self.index..])
+        ));
+
+        self.lookahead.fmt_as_item_suffix(fmt)
+    }
+}
+
+impl Display for Token {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Token::EOF => write!(fmt, "EOF"),
+            Token::Error => write!(fmt, "Error"),
+            Token::Terminal(ref s) => write!(fmt, "{}", s),
+        }
+    }
+}
+
+impl Debug for Token {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self)
+    }
+}
+
+impl Debug for StateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "S{}", self.0)
+    }
+}
+
+impl Display for StateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+impl<'grammar, L: Lookahead> State<'grammar, L> {
+    /// Returns the set of symbols which must appear on the stack to
+    /// be in this state. This is the *maximum* prefix of any item,
+    /// basically.
+    pub fn max_prefix(&self) -> &'grammar [Symbol] {
+        // Each state fn takes as argument the longest prefix of any
+        // item. Note that all items must have compatible prefixes.
+        let prefix = self.items
+            .vec
+            .iter()
+            .map(|item| item.prefix())
+            .max_by_key(|symbols| symbols.len())
+            .unwrap();
+
+        debug_assert!(
+            self.items
+                .vec
+                .iter()
+                .all(|item| prefix.ends_with(&item.production.symbols[..item.index]))
+        );
+
+        prefix
+    }
+
+    /// Returns the set of symbols from the stack that must be popped
+    /// for this state to return. If we have a state like:
+    ///
+    /// ```
+    /// X = A B C (*) C
+    /// Y = B C (*) C
+    /// C = (*) ...
+    /// ```
+    ///
+    /// This would return `[B, C]`. For every state other than the
+    /// start state, this will return a list of length at least 1.
+    /// For the start state, returns `[]`.
+    pub fn will_pop(&self) -> &'grammar [Symbol] {
+        let prefix = self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| item.prefix())
+            .min_by_key(|symbols| symbols.len())
+            .unwrap_or(&[]);
+
+        debug_assert!(
+            self.items
+                .vec
+                .iter()
+                .filter(|item| item.index > 0)
+                .all(|item| item.prefix().ends_with(prefix))
+        );
+
+        prefix
+    }
+
+    pub fn will_push(&self) -> &[Symbol] {
+        self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| &item.production.symbols[item.index..])
+            .min_by_key(|symbols| symbols.len())
+            .unwrap_or(&[])
+    }
+
+    /// Returns the type of nonterminal that this state will produce;
+    /// if `None` is returned, then this state may produce more than
+    /// one kind of nonterminal.
+    ///
+    /// FIXME -- currently, the start state returns `None` instead of
+    /// the goal symbol.
+    pub fn will_produce(&self) -> Option<NonterminalString> {
+        let mut returnable_nonterminals: Vec<_> = self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| item.production.nonterminal.clone())
+            .dedup()
+            .collect();
+        if returnable_nonterminals.len() == 1 {
+            returnable_nonterminals.pop()
+        } else {
+            None
+        }
+    }
+}
+
+/// `A = B C (*) D E F` or `A = B C (*)`
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub struct SymbolSets<'grammar> {
+    pub prefix: &'grammar [Symbol],       // both cases, [B, C]
+    pub cursor: Option<&'grammar Symbol>, // first [D], second []
+    pub suffix: &'grammar [Symbol],       // first [E, F], second []
+}
+
+impl<'grammar> SymbolSets<'grammar> {
+    pub fn new() -> Self {
+        SymbolSets {
+            prefix: &[],
+            cursor: None,
+            suffix: &[],
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/error/mod.rs
@@ -0,0 +1,839 @@
+//! Error reporting. For now very stupid and simplistic.
+
+use collections::{set, Set};
+use lr1::trace::Tracer;
+use lr1::core::*;
+use lr1::example::{Example, ExampleStyles, ExampleSymbol};
+use lr1::first::FirstSets;
+use lr1::lookahead::{Token, TokenSet};
+use itertools::Itertools;
+use grammar::repr::*;
+use message::Message;
+use message::builder::{BodyCharacter, Builder, Character, MessageBuilder};
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+pub fn report_error(grammar: &Grammar, error: &LR1TableConstructionError) -> Vec<Message> {
+    let mut cx = ErrorReportingCx::new(grammar, &error.states, &error.conflicts);
+    cx.report_errors()
+}
+
+struct ErrorReportingCx<'cx, 'grammar: 'cx> {
+    grammar: &'grammar Grammar,
+    first_sets: FirstSets,
+    states: &'cx [LR1State<'grammar>],
+    conflicts: &'cx [LR1Conflict<'grammar>],
+}
+
+#[derive(Debug)]
+enum ConflictClassification {
+    /// The grammar is ambiguous. This means we have two examples of
+    /// precisely the same set of symbols which can be reduced in two
+    /// distinct ways.
+    Ambiguity { action: Example, reduce: Example },
+
+    /// The grammar is ambiguous, and moreover it looks like a
+    /// precedence error. This means that the reduction is to a
+    /// nonterminal `T` and the shift is some symbol sandwiched
+    /// between two instances of `T`.
+    Precedence {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    },
+
+    /// Suggest inlining `nonterminal`. Makes sense if there are two
+    /// levels in the reduction tree in both examples, and the suffix
+    /// after the inner reduction is the same in all cases.
+    SuggestInline {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    },
+
+    /// Like the previous, but suggest replacing `nonterminal` with
+    /// `symbol?`. Makes sense if the thing to be inlined consists of
+    /// two alternatives, `X = symbol | ()`.
+    SuggestQuestion {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+        symbol: Symbol,
+    },
+
+    /// Can't say much beyond that a conflict occurred.
+    InsufficientLookahead { action: Example, reduce: Example },
+
+    /// Really can't say *ANYTHING*.
+    Naive,
+}
+
+type TokenConflict<'grammar> = Conflict<'grammar, Token>;
+
+impl<'cx, 'grammar> ErrorReportingCx<'cx, 'grammar> {
+    fn new(
+        grammar: &'grammar Grammar,
+        states: &'cx [LR1State<'grammar>],
+        conflicts: &'cx [LR1Conflict<'grammar>],
+    ) -> Self {
+        ErrorReportingCx {
+            grammar: grammar,
+            first_sets: FirstSets::new(grammar),
+            states: states,
+            conflicts: conflicts,
+        }
+    }
+
+    fn report_errors(&mut self) -> Vec<Message> {
+        token_conflicts(self.conflicts)
+            .iter()
+            .map(|conflict| self.report_error(conflict))
+            .collect()
+    }
+
+    fn report_error(&mut self, conflict: &TokenConflict<'grammar>) -> Message {
+        match self.classify(conflict) {
+            ConflictClassification::Ambiguity { action, reduce } => {
+                self.report_error_ambiguity(conflict, action, reduce)
+            }
+            ConflictClassification::Precedence {
+                shift,
+                reduce,
+                nonterminal,
+            } => self.report_error_precedence(conflict, shift, reduce, nonterminal),
+            ConflictClassification::SuggestInline {
+                shift,
+                reduce,
+                nonterminal,
+            } => self.report_error_suggest_inline(conflict, shift, reduce, nonterminal),
+            ConflictClassification::SuggestQuestion {
+                shift,
+                reduce,
+                nonterminal,
+                symbol,
+            } => self.report_error_suggest_question(conflict, shift, reduce, nonterminal, symbol),
+            ConflictClassification::InsufficientLookahead { action, reduce } => {
+                self.report_error_insufficient_lookahead(conflict, action, reduce)
+            }
+            ConflictClassification::Naive => self.report_error_naive(conflict),
+        }
+    }
+
+    fn report_error_ambiguity_core(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+    ) -> Builder<BodyCharacter> {
+        let styles = ExampleStyles::ambig();
+        MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Ambiguous grammar detected")
+            .end()
+            .body()
+            .begin_lines()
+            .wrap_text("The following symbols can be reduced in two ways:")
+            .push(reduce.to_symbol_list(reduce.symbols.len(), styles))
+            .end()
+            .begin_lines()
+            .wrap_text("They could be reduced like so:")
+            .push(reduce.into_picture(styles))
+            .end()
+            .begin_lines()
+            .wrap_text("Alternatively, they could be reduced like so:")
+            .push(shift.into_picture(styles))
+            .end()
+    }
+
+    fn report_error_ambiguity(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+    ) -> Message {
+        self.report_error_ambiguity_core(conflict, shift, reduce)
+            .wrap_text(
+                "LALRPOP does not yet support ambiguous grammars. \
+                 See the LALRPOP manual for advice on \
+                 making your grammar unambiguous.",
+            )
+            .end()
+            .end()
+    }
+
+    fn report_error_precedence(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    ) -> Message {
+        self.report_error_ambiguity_core(conflict, shift, reduce)
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("This looks like a precedence error related to")
+            .push(nonterminal)
+            .verbatimed()
+            .punctuated(".")
+            .text("See the LALRPOP manual for advice on encoding precedence.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_not_lr1_core(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action: Example,
+        reduce: Example,
+    ) -> Builder<BodyCharacter> {
+        let styles = ExampleStyles::new();
+        let builder = MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Local ambiguity detected")
+            .end()
+            .body();
+
+        let builder = builder
+            .begin_lines()
+            .begin_wrap()
+            .text("The problem arises after having observed the following symbols")
+            .text("in the input:")
+            .end()
+            .push(if action.cursor >= reduce.cursor {
+                action.to_symbol_list(action.cursor, styles)
+            } else {
+                reduce.to_symbol_list(reduce.cursor, styles)
+            })
+            .begin_wrap();
+
+        let builder = match conflict.lookahead {
+            Token::Terminal(ref term) => builder
+                .text("At that point, if the next token is a")
+                .push(term.clone())
+                .verbatimed()
+                .styled(Tls::session().cursor_symbol)
+                .punctuated(","),
+            Token::Error => builder.text("If an error has been found,"),
+            Token::EOF => builder.text("If the end of the input is reached,"),
+        };
+
+        let builder = builder
+            .text("then the parser can proceed in two different ways.")
+            .end()
+            .end();
+
+        let builder = self.describe_reduce(builder, styles, conflict.production, reduce, "First");
+
+        match conflict.action {
+            Action::Shift(ref lookahead, _) => {
+                self.describe_shift(builder, styles, lookahead.clone(), action, "Alternatively")
+            }
+            Action::Reduce(production) => {
+                self.describe_reduce(builder, styles, production, action, "Alternatively")
+            }
+        }
+    }
+
+    fn describe_shift<C: Character>(
+        &self,
+        builder: Builder<C>,
+        styles: ExampleStyles,
+        lookahead: TerminalString,
+        example: Example,
+        intro_word: &str,
+    ) -> Builder<C> {
+        // A shift example looks like:
+        //
+        // ...p1 ...p2 (*) L ...s2 ...s1
+        // |     |               |     |
+        // |     +-NT1-----------+     |
+        // |                           |
+        // |           ...             |
+        // |                           |
+        // +-NT2-----------------------+
+
+        let nt1 = example.reductions[0].nonterminal.clone();
+
+        builder
+            .begin_lines()
+            .begin_wrap()
+            .text(intro_word)
+            .punctuated(",")
+            .text("the parser could shift the")
+            .push(lookahead)
+            .verbatimed()
+            .text("token and later use it to construct a")
+            .push(nt1)
+            .verbatimed()
+            .punctuated(".")
+            .text("This might then yield a parse tree like")
+            .end()
+            .push(example.into_picture(styles))
+            .end()
+    }
+
+    fn describe_reduce<C: Character>(
+        &self,
+        builder: Builder<C>,
+        styles: ExampleStyles,
+        production: &Production,
+        example: Example,
+        intro_word: &str,
+    ) -> Builder<C> {
+        builder
+            .begin_lines()
+            .begin_wrap()
+            .text(intro_word)
+            .punctuated(",")
+            .text("the parser could execute the production at")
+            .push(production.span)
+            .punctuated(",")
+            .text("which would consume the top")
+            .text(production.symbols.len())
+            .text("token(s) from the stack")
+            .text("and produce a")
+            .push(production.nonterminal.clone())
+            .verbatimed()
+            .punctuated(".")
+            .text("This might then yield a parse tree like")
+            .end()
+            .push(example.into_picture(styles))
+            .end()
+    }
+
+    fn report_error_suggest_inline(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    ) -> Message {
+        let builder = self.report_error_not_lr1_core(conflict, shift, reduce);
+
+        builder
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("It appears you could resolve this problem by adding")
+            .text("the annotation `#[inline]` to the definition of")
+            .push(nonterminal)
+            .verbatimed()
+            .punctuated(".")
+            .text("For more information, see the section on inlining")
+            .text("in the LALRPOP manual.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_suggest_question(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+        symbol: Symbol,
+    ) -> Message {
+        let builder = self.report_error_not_lr1_core(conflict, shift, reduce);
+
+        builder
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("It appears you could resolve this problem by replacing")
+            .text("uses of")
+            .push(nonterminal.clone())
+            .verbatimed()
+            .text("with")
+            .text(symbol) // intentionally disable coloring here, looks better
+            .adjacent_text("`", "?`")
+            .text("(or, alternatively, by adding the annotation `#[inline]` \
+                   to the definition of")
+            .push(nonterminal)
+            .punctuated(").")
+            .text("For more information, see the section on inlining")
+            .text("in the LALROP manual.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_insufficient_lookahead(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action: Example,
+        reduce: Example,
+    ) -> Message {
+        // The reduce example will look something like:
+        //
+        //
+        // ...p1 ...p2 (*) L ...s2 ...s1
+        // |     |               |     |
+        // |     +-NT1-----------+     |
+        // |     |               |     |
+        // |     +-...-----------+     |
+        // |     |               |     |
+        // |     +-NTn-----------+     |
+        // |                           |
+        // +-NTn+1---------------------+
+        //
+        // To solve the conflict, essentially, the user needs to
+        // modify the grammar so that `NTn` does not appear with `L`
+        // in its follow-set. How to guide them in this?
+
+        let builder = self.report_error_not_lr1_core(conflict, action, reduce);
+
+        builder
+            .wrap_text(
+                "See the LALRPOP manual for advice on \
+                 making your grammar LR(1).",
+            )
+            .end()
+            .end()
+    }
+
+    /// Naive error reporting. This is a fallback path which (I think)
+    /// never actually executes.
+    fn report_error_naive(&self, conflict: &TokenConflict<'grammar>) -> Message {
+        let mut builder = MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Conflict detected")
+            .end()
+            .body()
+            .begin_lines()
+            .wrap_text("when in this state:")
+            .indented();
+        for item in self.states[conflict.state.0].items.vec.iter() {
+            builder = builder.text(format!("{:?}", item));
+        }
+        let mut builder = builder
+            .end()
+            .begin_wrap()
+            .text(format!("and looking at a token `{:?}`", conflict.lookahead))
+            .text("we can reduce to a")
+            .push(conflict.production.nonterminal.clone())
+            .verbatimed();
+        builder = match conflict.action {
+            Action::Shift(..) => builder.text("but we can also shift"),
+            Action::Reduce(prod) => builder
+                .text("but we can also reduce to a")
+                .text(prod.nonterminal.clone())
+                .verbatimed(),
+        };
+        builder.end().end().end()
+    }
+
+    fn classify(&mut self, conflict: &TokenConflict<'grammar>) -> ConflictClassification {
+        // Find examples from the conflicting action (either a shift
+        // or a reduce).
+        let mut action_examples = match conflict.action {
+            Action::Shift(..) => self.shift_examples(conflict),
+            Action::Reduce(production) => {
+                self.reduce_examples(conflict.state, production, conflict.lookahead.clone())
+            }
+        };
+
+        // Find examples from the conflicting reduce.
+        let mut reduce_examples = self.reduce_examples(
+            conflict.state,
+            conflict.production,
+            conflict.lookahead.clone(),
+        );
+
+        // Prefer shorter examples to longer ones.
+        action_examples.sort_by(|e, f| e.symbols.len().cmp(&f.symbols.len()));
+        reduce_examples.sort_by(|e, f| e.symbols.len().cmp(&f.symbols.len()));
+
+        // This really shouldn't happen, but if we've failed to come
+        // up with examples, then report a "naive" error.
+        if action_examples.is_empty() || reduce_examples.is_empty() {
+            return ConflictClassification::Naive;
+        }
+
+        if let Some(classification) =
+            self.try_classify_ambiguity(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        if let Some(classification) =
+            self.try_classify_question(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        if let Some(classification) =
+            self.try_classify_inline(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        // Give up. Just grab an example from each and pair them up.
+        // If there aren't even two examples, something's pretty
+        // bogus, but we'll just call it naive.
+        action_examples
+            .into_iter()
+            .zip(reduce_examples)
+            .next()
+            .map(
+                |(action, reduce)| ConflictClassification::InsufficientLookahead {
+                    action: action,
+                    reduce: reduce,
+                },
+            )
+            .unwrap_or(ConflictClassification::Naive)
+    }
+
+    fn try_classify_ambiguity(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        action_examples
+            .iter()
+            .cartesian_product(reduce_examples)
+            .filter(|&(action, reduce)| action.symbols == reduce.symbols)
+            .filter(|&(action, reduce)| action.cursor == reduce.cursor)
+            .map(|(action, reduce)| {
+                // Consider whether to call this a precedence
+                // error. We do this if we are stuck between reducing
+                // `T = T S T` and shifting `S`.
+                if let Action::Shift(ref term, _) = conflict.action {
+                    let nt = &conflict.production.nonterminal;
+                    if conflict.production.symbols.len() == 3
+                        && conflict.production.symbols[0] == Symbol::Nonterminal(nt.clone())
+                        && conflict.production.symbols[1] == Symbol::Terminal(term.clone())
+                        && conflict.production.symbols[2] == Symbol::Nonterminal(nt.clone())
+                    {
+                        return ConflictClassification::Precedence {
+                            shift: action.clone(),
+                            reduce: reduce.clone(),
+                            nonterminal: nt.clone(),
+                        };
+                    }
+                }
+                ConflictClassification::Ambiguity {
+                    action: action.clone(),
+                    reduce: reduce.clone(),
+                }
+            })
+            .next()
+    }
+
+    fn try_classify_question(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        // If we get a shift/reduce conflict and the reduce
+        // is of a nonterminal like:
+        //
+        //     T = { () | U }
+        //
+        // then suggest replacing T with U?. I'm being a bit lenient
+        // here since I do not KNOW that it will help, but it often
+        // does, and it's better style anyhow.
+
+        if let Action::Reduce(_) = conflict.action {
+            return None;
+        }
+
+        debug!(
+            "try_classify_question: action_examples={:?}",
+            action_examples
+        );
+        debug!(
+            "try_classify_question: reduce_examples={:?}",
+            reduce_examples
+        );
+
+        let nt = &conflict.production.nonterminal;
+        let nt_productions = self.grammar.productions_for(nt);
+        if nt_productions.len() == 2 {
+            for &(i, j) in &[(0, 1), (1, 0)] {
+                if nt_productions[i].symbols.is_empty() && nt_productions[j].symbols.len() == 1 {
+                    return Some(ConflictClassification::SuggestQuestion {
+                        shift: action_examples[0].clone(),
+                        reduce: reduce_examples[0].clone(),
+                        nonterminal: nt.clone(),
+                        symbol: nt_productions[j].symbols[0].clone(),
+                    });
+                }
+            }
+        }
+
+        None
+    }
+
+    fn try_classify_inline(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        // Inlining can help resolve a shift/reduce conflict because
+        // it defers the need to reduce. In particular, if we inlined
+        // all the reductions up until the last one, then we would be
+        // able to *shift* the lookahead instead of having to reduce.
+        // This can be helpful if we can see that shifting would let
+        // us delay reducing until the lookahead diverges.
+
+        // Only applicable to shift/reduce:
+        if let Action::Reduce(_) = conflict.action {
+            return None;
+        }
+
+        // FIXME: The logic here finds the first example where inline
+        // would help; but maybe we want to restrict it to cases
+        // where inlining would help *all* the examples...?
+
+        action_examples
+            .iter()
+            .cartesian_product(reduce_examples)
+            .filter_map(|(shift, reduce)| {
+                if self.try_classify_inline_example(shift, reduce) {
+                    let nt = &reduce.reductions[0].nonterminal;
+                    Some(ConflictClassification::SuggestInline {
+                        shift: shift.clone(),
+                        reduce: reduce.clone(),
+                        nonterminal: nt.clone(),
+                    })
+                } else {
+                    None
+                }
+            })
+            .next()
+    }
+
+    fn try_classify_inline_example<'ex>(&self, shift: &Example, reduce: &Example) -> bool {
+        debug!("try_classify_inline_example({:?}, {:?})", shift, reduce);
+
+        // In the case of shift, the example will look like
+        //
+        // ```
+        // ... ... (*) L ...s1 ...
+        // |   |             |   |
+        // |   +-R0----------+   |
+        // |  ...                |
+        // +-Rn------------------+
+        // ```
+        //
+        // We want to extract the symbols ...s1: these are the
+        // things we are able to shift before being forced to
+        // make our next hard decision (to reduce R0 or not).
+        let shift_upcoming = &shift.symbols[shift.cursor + 1..shift.reductions[0].end];
+        debug!(
+            "try_classify_inline_example: shift_upcoming={:?}",
+            shift_upcoming
+        );
+
+        // For the reduce, the example might look like
+        //
+        // ```
+        // ...  ...   (*) ...s ...
+        // | | |    |        |
+        // | | +-R0-+        |
+        // | | ...  |        |
+        // | +--Ri--+        |
+        // |  ...            |
+        // +-R(i+1)----------+
+        // ```
+        //
+        // where Ri is the last reduction that requires
+        // shifting no additional symbols. In this case, if we
+        // inlined R0...Ri, then we know we can shift L.
+        let r0_end = reduce.reductions[0].end;
+        let i = reduce.reductions.iter().position(|r| r.end != r0_end);
+        let i = match i {
+            Some(v) => v,
+            None => return false,
+        };
+        let ri = &reduce.reductions[i];
+        let reduce_upcoming = &reduce.symbols[r0_end..ri.end];
+        debug!(
+            "try_classify_inline_example: reduce_upcoming={:?} i={:?}",
+            reduce_upcoming, i
+        );
+
+        // For now, we only suggest inlining a single nonterminal,
+        // mostly because I am too lazy to weak the suggestion struct
+        // and error messages (but the rest of the code below doesn't
+        // make this assumption for the most part).
+        if i != 1 {
+            return false;
+        }
+
+        // Make sure that all the things we are suggesting inlining
+        // are distinct so that we are not introducing a cycle.
+        let mut duplicates = set();
+        if reduce.reductions[0..i + 1]
+            .iter()
+            .any(|r| !duplicates.insert(r.nonterminal.clone()))
+        {
+            return false;
+        }
+
+        // Compare the two suffixes to see whether they
+        // diverge at some point.
+        shift_upcoming
+            .iter()
+            .zip(reduce_upcoming)
+            .filter_map(|(shift_sym, reduce_sym)| match (shift_sym, reduce_sym) {
+                (&ExampleSymbol::Symbol(ref shift_sym), &ExampleSymbol::Symbol(ref reduce_sym)) => {
+                    if shift_sym == reduce_sym {
+                        // same symbol on both; we'll be able to shift them
+                        None
+                    } else {
+                        // different symbols: for this to work, must
+                        // have disjoint first sets. Note that we
+                        // consider a suffix matching epsilon to be
+                        // potentially overlapping, though we could
+                        // supply the actual lookahead for more precision.
+                        let shift_first = self.first_sets.first0(&[shift_sym.clone()]);
+                        let reduce_first = self.first_sets.first0(&[reduce_sym.clone()]);
+                        if shift_first.is_disjoint(&reduce_first) {
+                            Some(true)
+                        } else {
+                            Some(false)
+                        }
+                    }
+                }
+                _ => {
+                    // we don't expect to encounter any
+                    // epsilons, I don't think, because those
+                    // only occur with an empty reduce at the
+                    // top level
+                    Some(false)
+                }
+            })
+            .next()
+            .unwrap_or(false)
+    }
+
+    fn shift_examples(&self, conflict: &TokenConflict<'grammar>) -> Vec<Example> {
+        log!(Tls::session(), Verbose, "Gathering shift examples");
+        let state = &self.states[conflict.state.0];
+        let conflicting_items = self.conflicting_shift_items(state, conflict);
+        conflicting_items
+            .into_iter()
+            .flat_map(|item| {
+                let tracer = Tracer::new(&self.first_sets, self.states);
+                let shift_trace = tracer.backtrace_shift(conflict.state, item);
+                let local_examples: Vec<Example> = shift_trace.lr0_examples(item).collect();
+                local_examples
+            })
+            .collect()
+    }
+
+    fn reduce_examples(
+        &self,
+        state: StateIndex,
+        production: &'grammar Production,
+        lookahead: Token,
+    ) -> Vec<Example> {
+        log!(Tls::session(), Verbose, "Gathering reduce examples");
+        let item = Item {
+            production: production,
+            index: production.symbols.len(),
+            lookahead: TokenSet::from(lookahead),
+        };
+        let tracer = Tracer::new(&self.first_sets, self.states);
+        let reduce_trace = tracer.backtrace_reduce(state, item.to_lr0());
+        reduce_trace.lr1_examples(&self.first_sets, &item).collect()
+    }
+
+    fn conflicting_shift_items(
+        &self,
+        state: &LR1State<'grammar>,
+        conflict: &TokenConflict<'grammar>,
+    ) -> Set<LR0Item<'grammar>> {
+        // Lookahead must be a terminal, not EOF.
+        // Find an item J like `Bar = ... (*) L ...`.
+        let lookahead = Symbol::Terminal(conflict.lookahead.unwrap_terminal().clone());
+        state
+            .items
+            .vec
+            .iter()
+            .filter(|i| i.can_shift())
+            .filter(|i| i.production.symbols[i.index] == lookahead)
+            .map(|i| i.to_lr0())
+            .collect()
+    }
+}
+
+fn token_conflicts<'grammar>(
+    conflicts: &[Conflict<'grammar, TokenSet>],
+) -> Vec<TokenConflict<'grammar>> {
+    conflicts
+        .iter()
+        .flat_map(|conflict| {
+            conflict.lookahead.iter().map(move |token| Conflict {
+                state: conflict.state,
+                lookahead: token,
+                production: conflict.production,
+                action: conflict.action.clone(),
+            })
+        })
+        .collect()
+}
+
+//fn choose_example<'grammar>(states: &[State<'grammar>],
+//                            lookahead: Token,
+//                            conflict: &TokenConflict<'grammar>)
+//{
+//    // Whenever we have a conflict in state S, there is always:
+//    // - a given lookahead L that permits some reduction, due to
+//    //   an item I like `Foo = ... (*) [L]`
+//    // - another action that conflicts with R1.
+//    //
+//    // The backtrace code can give context to this item `I`, but the
+//    // problem is that it often results in many different contexts,
+//    // and we need to try and narrow those down to the one that will
+//    // help the user understand the problem.
+//    //
+//    // For that, we turn to the conflicting action, which can either be
+//    // a shift or reduce. Let's consider those two cases.
+//    //
+//    // ### Shift
+//    //
+//    // If the conflicting action is a shift, then there is at least
+//    // one item J in the state S like `Bar = ... (*) L ...`. We can
+//    // produce a backtrace from J and enumerate examples. We want to
+//    // find a pair of examples from I and J that share a common
+//    // prefix.
+//    //
+//    // ### Reduce
+//    //
+//    // If the conflicting action is a reduce, then there is at least
+//    // one item J in S like `Bar = ... (*) [L]`. We can produce a
+//    // backtrace for J and then search for an example that shares a
+//    // common prefix.
+//
+//}
+//
+//fn conflicting_item<'grammar>(state: &State<'grammar>,
+//                              lookahead: Token,
+//                              conflict: &TokenConflict<'grammar>)
+//                              -> Item<'grammar>
+//{
+//    match conflict.action {
+//        Action::Shift(_) => {
+//        }
+//        Action::Reduce(production) => {
+//            // Must be at least some other item J in S like `Bar = ... (*) [L]`.
+//            state.items.vec.iter()
+//                           .filter(|i| i.can_reduce())
+//                           .filter(|i| i.lookahead == lookahead)
+//                           .filter(|i| i.production == production)
+//                           .cloned()
+//                           .next()
+//                           .unwrap()
+//        }
+//    }
+//}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/error/test.rs
@@ -0,0 +1,187 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use tls::Tls;
+
+use super::{ConflictClassification, ErrorReportingCx};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+#[test]
+fn priority_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::Precedence {
+            shift,
+            reduce,
+            nonterminal,
+        } => {
+            println!(
+                "shift={:#?}, reduce={:#?}, nonterminal={:?}",
+                shift, reduce, nonterminal
+            );
+            assert_eq!(shift.symbols.len(), 5); // Ty -> Ty -> Ty
+            assert_eq!(shift.cursor, 3); // Ty -> Ty -> Ty
+            assert_eq!(shift.symbols, reduce.symbols);
+            assert_eq!(shift.cursor, reduce.cursor);
+            assert_eq!(nonterminal, nt("Ty"));
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn expr_braced_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Expr: () = {
+    "Id" => (),
+    "Id" "{" "}" => (),
+    "Expr" "+" "Id" => (),
+    "if" Expr "{" "}" => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Expr")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::InsufficientLookahead { .. } => {}
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn suggest_question_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+
+        pub E: () = {
+            "L",
+            "&" OPT_L E
+        };
+
+        OPT_L: () = {
+            (),
+            "L"
+        };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("E")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::SuggestQuestion {
+            shift: _,
+            reduce: _,
+            nonterminal,
+            symbol,
+        } => {
+            assert_eq!(nonterminal, nt("OPT_L"));
+            assert_eq!(
+                symbol,
+                Symbol::Terminal(TerminalString::quoted(Atom::from("L")))
+            );
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn suggest_inline_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub ImportDecl: () = {
+    "import" <Path> ";" => (),
+    "import" <Path> "." "*" ";" => (),
+};
+
+Path: () = {
+    <head: Ident> <tail: ("." <Ident>)*> => ()
+};
+
+Ident = r#"[a-zA-Z][a-zA-Z0-9]*"#;
+"##,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("ImportDecl")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::SuggestInline {
+            shift: _,
+            reduce: _,
+            nonterminal,
+        } => {
+            assert_eq!(nonterminal, nt("Path"));
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+/// This example used to cause an out-of-bounds error.
+#[test]
+fn issue_249() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub Func = StructDecl* VarDecl*;
+StructDecl = "<" StructParameter* ">";
+StructParameter = "may_dangle"?;
+VarDecl = "let";
+"##,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Func")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    for conflict in &conflicts {
+        println!("conflict={:?}", conflict);
+        cx.classify(conflict);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/example/mod.rs
@@ -0,0 +1,409 @@
+//! Code to compute example inputs given a backtrace.
+
+use ascii_canvas::AsciiView;
+use message::Content;
+use message::builder::InlineBuilder;
+use grammar::repr::*;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+/// An "example" input and the way it was derived. This can be
+/// serialized into useful text. For example, it might represent
+/// something like this:
+///
+/// ```
+///          Looking at
+///              |
+///              v
+/// Ty "->" Ty "->" Ty
+/// |        |       |
+/// +-Ty-----+       |
+/// |                |
+/// +-Ty-------------+
+/// ```
+///
+/// The top-line is the `symbols` vector. The groupings below are
+/// stored in the `reductions` vector, in order from smallest to
+/// largest (they are always properly nested). The `cursor` field
+/// indicates the current lookahead token.
+///
+/// The `symbols` vector is actually `Option<Symbol>` to account
+/// for empty reductions:
+///
+/// ```
+/// A       B
+/// | |   | |
+/// | +-Y-+ |
+/// +-Z-----+
+/// ```
+///
+/// The "empty space" between A and B would be represented as `None`.
+#[derive(Clone, Debug)]
+pub struct Example {
+    pub symbols: Vec<ExampleSymbol>,
+    pub cursor: usize,
+    pub reductions: Vec<Reduction>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ExampleSymbol {
+    Symbol(Symbol),
+    Epsilon,
+}
+
+#[derive(Copy, Clone, Default)]
+pub struct ExampleStyles {
+    pub before_cursor: Style,
+    pub on_cursor: Style,
+    pub after_cursor: Style,
+}
+
+#[derive(Clone, Debug)]
+pub struct Reduction {
+    pub start: usize,
+    pub end: usize,
+    pub nonterminal: NonterminalString,
+}
+
+impl Example {
+    /// Length of each symbol. Each will need *at least* that amount
+    /// of space. :) Measure in characters, under the assumption of a
+    /// mono-spaced font. Also add a final `0` marker which will serve
+    /// as the end position.
+    fn lengths(&self) -> Vec<usize> {
+        self.symbols
+            .iter()
+            .map(|s| match *s {
+                ExampleSymbol::Symbol(ref s) => format!("{}", s).chars().count(),
+                ExampleSymbol::Epsilon => 1, // display as " "
+            })
+            .chain(Some(0))
+            .collect()
+    }
+
+    /// Extract a prefix of the list of symbols from this `Example`
+    /// and make a styled list of them, like:
+    ///
+    ///    Ty "->" Ty -> "Ty"
+    pub fn to_symbol_list(&self, length: usize, styles: ExampleStyles) -> Box<Content> {
+        let mut builder = InlineBuilder::new().begin_spaced();
+
+        for (index, symbol) in self.symbols[..length].iter().enumerate() {
+            let style = if index < self.cursor {
+                styles.before_cursor
+            } else if index > self.cursor {
+                styles.after_cursor
+            } else {
+                match *symbol {
+                    ExampleSymbol::Symbol(Symbol::Terminal(_)) => styles.on_cursor,
+                    ExampleSymbol::Symbol(Symbol::Nonterminal(_)) => styles.after_cursor,
+                    ExampleSymbol::Epsilon => styles.after_cursor,
+                }
+            };
+
+            if let &ExampleSymbol::Symbol(ref s) = symbol {
+                builder = builder.push(s.clone()).styled(style);
+            }
+        }
+
+        builder.end().indented().end()
+    }
+
+    /// Render the example into a styled diagram suitable for
+    /// embedding in an error message.
+    pub fn into_picture(self, styles: ExampleStyles) -> Box<Content> {
+        let lengths = self.lengths();
+        let positions = self.positions(&lengths);
+        InlineBuilder::new()
+            .push(Box::new(ExamplePicture {
+                example: self,
+                positions: positions,
+                styles: styles,
+            }))
+            .indented()
+            .end()
+    }
+
+    fn starting_positions(&self, lengths: &[usize]) -> Vec<usize> {
+        lengths
+            .iter()
+            .scan(0, |counter, &len| {
+                let start = *counter;
+
+                // Leave space for "NT " (if "NT" is the name
+                // of the nonterminal).
+                *counter = start + len + 1;
+
+                Some(start)
+            })
+            .collect()
+    }
+
+    /// Start index where each symbol in the example should appear,
+    /// measured in characters. These are spaced to leave enough room
+    /// for the reductions below.
+    fn positions(&self, lengths: &[usize]) -> Vec<usize> {
+        // Initially, position each symbol with one space in between,
+        // like:
+        //
+        //     X Y Z
+        let mut positions = self.starting_positions(lengths);
+
+        // Adjust spacing to account for the nonterminal labels
+        // we will have to add. It will display
+        // like this:
+        //
+        //    A1 B2 C3 D4 E5 F6
+        //    |         |
+        //    +-Label---+
+        //
+        // But if the label is long we may have to adjust the spacing
+        // of the covered items (here, we changed them to two spaces,
+        // except the first gap, which got 3 spaces):
+        //
+        //    A1   B2  C3  D4 E5 F6
+        //    |             |
+        //    +-LongLabel22-+
+        for &Reduction {
+            start,
+            end,
+            ref nonterminal,
+        } in &self.reductions
+        {
+            let nt_len = format!("{}", nonterminal).chars().count();
+
+            // Number of symbols we are reducing. This should always
+            // be non-zero because even in the case of a \epsilon
+            // rule, we ought to be have a `None` entry in the symbol array.
+            let num_syms = end - start;
+            assert!(num_syms > 0);
+
+            // Let's use the expansion from above as our running example.
+            // We start out with positions like this:
+            //
+            //    A1 B2 C3 D4 E5 F6
+            //    |             |
+            //    +-LongLabel22-+
+            //
+            // But we want LongLabel to end at D4. No good.
+
+            // Start of first symbol to be reduced. Here, 0.
+            //
+            // A1 B2 C3 D4
+            // ^ here
+            let start_position = positions[start];
+
+            // End of last symbol to be reduced. Here, 11.
+            //
+            // A1 B2 C3 D4 E5
+            //             ^ positions[end]
+            //            ^ here -- positions[end] - 1
+            let end_position = positions[end] - 1;
+
+            // We need space to draw `+-Label-+` between
+            // start_position and end_position.
+            let required_len = nt_len + 4; // here, 15
+            let actual_len = end_position - start_position; // here, 10
+            if required_len < actual_len {
+                continue; // Got enough space, all set.
+            }
+
+            // Have to add `difference` characters altogether.
+            let difference = required_len - actual_len; // here, 4
+
+            // Increment over everything that is not part of this nonterminal.
+            // In the example above, that is E5 and F6.
+            shift(&mut positions[end..], difference);
+
+            if num_syms > 1 {
+                // If there is just one symbol being reduced here,
+                // then we have shifted over the things that follow
+                // it, and we are done. This would be a case like:
+                //
+                //     X         Y Z
+                //     |       |
+                //     +-Label-+
+                //
+                // (which maybe ought to be rendered slightly
+                // differently).
+                //
+                // But if there are multiple symbols, we're not quite
+                // done, because there would be an unsightly gap:
+                //
+                //       (gaps)
+                //      |  |  |
+                //      v  v  v
+                //    A1 B2 C3 D4     E5 F6
+                //    |             |
+                //    +-LongLabel22-+
+                //
+                // we'd like to make things line up, so we have to
+                // distribute that extra space internally by
+                // increasing the "gaps" (marked above) as evenly as
+                // possible (basically, full justification).
+                //
+                // We do this by dividing up the spaces evenly and
+                // then taking the remainder `N` and distributing 1
+                // extra to the first N.
+                let num_gaps = num_syms - 1; // number of gaps we can adjust. Here, 3.
+                let amount = difference / num_gaps; // what to add to each gap. Here, 1.
+                let extra = difference % num_gaps; // the remainder. Here, 1.
+
+                // For the first `extra` symbols, give them amount + 1
+                // extra space. After that, just amount. (O(n^2). Sue me.)
+                for i in 0..extra {
+                    shift(&mut positions[start + 1 + i..end], amount + 1);
+                }
+                for i in extra..num_gaps {
+                    shift(&mut positions[start + 1 + i..end], amount);
+                }
+            }
+        }
+
+        positions
+    }
+
+    #[cfg(test)]
+    pub fn paint_unstyled(&self) -> Vec<::ascii_canvas::Row> {
+        use std::default::Default;
+        let this = self.clone();
+        let content = this.into_picture(ExampleStyles::default());
+        let min_width = content.min_width();
+        let canvas = content.emit_to_canvas(min_width);
+        canvas.to_strings()
+    }
+
+    fn paint_on(&self, styles: &ExampleStyles, positions: &[usize], view: &mut AsciiView) {
+        // Draw the brackets for each reduction:
+        for (index, reduction) in self.reductions.iter().enumerate() {
+            let start_column = positions[reduction.start];
+            let end_column = positions[reduction.end] - 1;
+            let row = 1 + index;
+            view.draw_vertical_line(0..row + 1, start_column);
+            view.draw_vertical_line(0..row + 1, end_column - 1);
+            view.draw_horizontal_line(row, start_column..end_column);
+        }
+
+        // Write the labels for each reduction. Do this after the
+        // brackets so that ascii canvas can convert `|` to `+`
+        // without interfering with the text (in case of weird overlap).
+        let session = Tls::session();
+        for (index, reduction) in self.reductions.iter().enumerate() {
+            let column = positions[reduction.start] + 2;
+            let row = 1 + index;
+            view.write_chars(
+                row,
+                column,
+                reduction.nonterminal.to_string().chars(),
+                session.nonterminal_symbol,
+            );
+        }
+
+        // Write the labels on top:
+        //    A1   B2  C3  D4 E5 F6
+        self.paint_symbols_on(&self.symbols, &positions, styles, view);
+    }
+
+    fn paint_symbols_on(
+        &self,
+        symbols: &[ExampleSymbol],
+        positions: &[usize],
+        styles: &ExampleStyles,
+        view: &mut AsciiView,
+    ) {
+        let session = Tls::session();
+        for (index, ex_symbol) in symbols.iter().enumerate() {
+            let style = if index < self.cursor {
+                styles.before_cursor
+            } else if index == self.cursor {
+                // Only display actual terminals in the "on-cursor"
+                // font, because it might be misleading to show a
+                // nonterminal that way. Really it'd be nice to expand
+                // so that the cursor is always a terminal.
+                match *ex_symbol {
+                    ExampleSymbol::Symbol(Symbol::Terminal(_)) => styles.on_cursor,
+                    _ => styles.after_cursor,
+                }
+            } else {
+                styles.after_cursor
+            };
+
+            let column = positions[index];
+            match *ex_symbol {
+                ExampleSymbol::Symbol(Symbol::Terminal(ref term)) => {
+                    view.write_chars(
+                        0,
+                        column,
+                        term.to_string().chars(),
+                        style.with(session.terminal_symbol),
+                    );
+                }
+                ExampleSymbol::Symbol(Symbol::Nonterminal(ref nt)) => {
+                    view.write_chars(
+                        0,
+                        column,
+                        nt.to_string().chars(),
+                        style.with(session.nonterminal_symbol),
+                    );
+                }
+                ExampleSymbol::Epsilon => {}
+            }
+        }
+    }
+}
+
+struct ExamplePicture {
+    example: Example,
+    positions: Vec<usize>,
+    styles: ExampleStyles,
+}
+
+impl Content for ExamplePicture {
+    fn min_width(&self) -> usize {
+        *self.positions.last().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        self.example.paint_on(&self.styles, &self.positions, view);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+impl Debug for ExamplePicture {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Debug::fmt(&self.example, fmt)
+    }
+}
+
+fn shift(positions: &mut [usize], amount: usize) {
+    for position in positions {
+        *position += amount;
+    }
+}
+
+impl ExampleStyles {
+    pub fn ambig() -> Self {
+        let session = Tls::session();
+        ExampleStyles {
+            before_cursor: session.ambig_symbols,
+            on_cursor: session.ambig_symbols,
+            after_cursor: session.ambig_symbols,
+        }
+    }
+
+    pub fn new() -> Self {
+        let session = Tls::session();
+        ExampleStyles {
+            before_cursor: session.observed_symbols,
+            on_cursor: session.cursor_symbol,
+            after_cursor: session.unobserved_symbols,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/example/test.rs
@@ -0,0 +1,195 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use test_util::expect_debug;
+use tls::Tls;
+
+use super::{Example, ExampleSymbol, Reduction};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+macro_rules! sym {
+    (ε) => { ExampleSymbol::Epsilon };
+    ($t:ident) => { ExampleSymbol::Symbol(Symbol::Nonterminal(nt(stringify!($t)))) }
+}
+
+macro_rules! syms {
+    ($($t:tt),*) => {
+        vec![$(sym!($t)),*]
+    }
+}
+
+//  01234567890123456789012
+//  A1   B2  C3  D4 E5 F6
+//  |             |     |
+//  +-LongLabel22-+     |
+//  |                   |
+//  +-Label-------------+
+fn long_label_1_example() -> Example {
+    Example {
+        symbols: syms!(A1, B2, C3, D4, E5, F6),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("LongLabel22"),
+            },
+            Reduction {
+                start: 0,
+                end: 6,
+                nonterminal: nt("Label"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn long_label_1_positions() {
+    let _tls = Tls::test();
+    let example = long_label_1_example();
+    let lengths = example.lengths();
+    let positions = example.positions(&lengths);
+    assert_eq!(positions, vec![0, 5, 9, 13, 16, 19, 22]);
+}
+
+#[test]
+fn long_label_1_strings() {
+    let _tls = Tls::test();
+    let strings = long_label_1_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  A1   B2  C3  D4 E5 F6",
+    "  ├─LongLabel22─┘     │",
+    "  └─Label─────────────┘"
+]
+"#.trim(),
+    );
+}
+
+// Example with some empty sequences and
+// other edge cases.
+//
+//  012345678901234567890123456789012345
+//         A1  B2  C3 D4 E5       F6
+//  |   |           |       |   | |   |
+//  +-X-+           |       |   | |   |
+//  |               |       |   | |   |
+//  +-MegaLongLabel-+       |   | |   |
+//                          |   | |   |
+//                          +-Y-+ |   |
+//                                |   |
+//                                +-Z-+
+fn empty_labels_example() -> Example {
+    Example {
+        //             0 1  2  3  4  5  6 7
+        symbols: syms!(ε, A1, B2, C3, D4, E5, ε, F6),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("X"),
+            },
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("MegaLongLabel"),
+            },
+            Reduction {
+                start: 6,
+                end: 7,
+                nonterminal: nt("Y"),
+            },
+            Reduction {
+                start: 7,
+                end: 8,
+                nonterminal: nt("Z"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn empty_labels_positions() {
+    let _tls = Tls::test();
+    let example = empty_labels_example();
+    let lengths = example.lengths();
+    let positions = example.positions(&lengths);
+    //                            A1 B2  C3  D4  E5      F6
+    assert_eq!(positions, vec![0, 7, 11, 15, 18, 21, 24, 30, 36]);
+}
+
+#[test]
+fn empty_labels_strings() {
+    let _tls = Tls::test();
+    let strings = empty_labels_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  ╷    ╷ A1  B2  C3 D4 E5 ╷   ╷ F6  ╷",
+    "  ├─X──┘          │       │   │ │   │",
+    "  └─MegaLongLabel─┘       │   │ │   │",
+    "                          └─Y─┘ │   │",
+    "                                └─Z─┘"
+]
+"#.trim(),
+    );
+}
+
+// _return_      _A_ Expression _B_
+// |            |                  |
+// +-ExprAtom---+                  |
+// |            |                  |
+// +-ExprSuffix-+                  |
+// |                               |
+// +-ExprSuffix--------------------+
+fn single_token_example() -> Example {
+    Example {
+        //             0 1  2  3  4  5  6 7
+        symbols: syms!(_return_, _A_, Expression, _B_),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("ExprAtom"),
+            },
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("ExprSuffix"),
+            },
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("ExprSuffix"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn single_token_strings() {
+    let _tls = Tls::test();
+    let strings = single_token_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  _return_     ╷ _A_ Expression _B_",
+    "  ├─ExprAtom───┤                  │",
+    "  ├─ExprSuffix─┘                  │",
+    "  └─ExprSuffix────────────────────┘"
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/first/mod.rs
@@ -0,0 +1,97 @@
+//! First set construction and computation.
+
+use collections::{map, Map};
+use grammar::repr::*;
+use lr1::lookahead::{Token, TokenSet};
+
+#[cfg(test)]
+mod test;
+
+#[derive(Clone)]
+pub struct FirstSets {
+    map: Map<NonterminalString, TokenSet>,
+}
+
+impl FirstSets {
+    pub fn new(grammar: &Grammar) -> FirstSets {
+        let mut this = FirstSets { map: map() };
+        let mut changed = true;
+        while changed {
+            changed = false;
+            for production in grammar.nonterminals.values().flat_map(|p| &p.productions) {
+                let nt = &production.nonterminal;
+                let lookahead = this.first0(&production.symbols);
+                let first_set = this.map
+                    .entry(nt.clone())
+                    .or_insert_with(|| TokenSet::new());
+                changed |= first_set.union_with(&lookahead);
+            }
+        }
+        this
+    }
+
+    /// Returns `FIRST(...symbols)`. If `...symbols` may derive
+    /// epsilon, then this returned set will include EOF. (This is
+    /// kind of repurposing EOF to serve as a binary flag of sorts.)
+    pub fn first0<'s, I>(&self, symbols: I) -> TokenSet
+    where
+        I: IntoIterator<Item = &'s Symbol>,
+    {
+        let mut result = TokenSet::new();
+
+        for symbol in symbols {
+            match *symbol {
+                Symbol::Terminal(ref t) => {
+                    result.insert(Token::Terminal(t.clone()));
+                    return result;
+                }
+
+                Symbol::Nonterminal(ref nt) => {
+                    let mut empty_prod = false;
+                    match self.map.get(nt) {
+                        None => {
+                            // This should only happen during set
+                            // construction; it corresponds to an
+                            // entry that has not yet been
+                            // built. Otherwise, it would mean a
+                            // terminal with no productions. Either
+                            // way, the resulting first set should be
+                            // empty.
+                        }
+                        Some(set) => for lookahead in set.iter() {
+                            match lookahead {
+                                Token::EOF => {
+                                    empty_prod = true;
+                                }
+                                Token::Error | Token::Terminal(_) => {
+                                    result.insert(lookahead);
+                                }
+                            }
+                        },
+                    }
+                    if !empty_prod {
+                        return result;
+                    }
+                }
+            }
+        }
+
+        // control only reaches here if either symbols is empty, or it
+        // consists of nonterminals all of which may derive epsilon
+        result.insert(Token::EOF);
+        result
+    }
+
+    pub fn first1(&self, symbols: &[Symbol], lookahead: &TokenSet) -> TokenSet {
+        let mut set = self.first0(symbols);
+
+        // we use EOF as the signal that `symbols` derives epsilon:
+        let epsilon = set.take_eof();
+
+        if epsilon {
+            set.union_with(&lookahead);
+        }
+
+        set
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/first/test.rs
@@ -0,0 +1,93 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::lookahead::{Token, TokenSet};
+use lr1::lookahead::Token::EOF;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use super::FirstSets;
+
+pub fn nt(t: &str) -> Symbol {
+    Symbol::Nonterminal(NonterminalString(Atom::from(t)))
+}
+
+pub fn term(t: &str) -> Symbol {
+    Symbol::Terminal(TerminalString::quoted(Atom::from(t)))
+}
+
+fn la(t: &str) -> Token {
+    Token::Terminal(TerminalString::quoted(Atom::from(t)))
+}
+
+fn first0(first: &FirstSets, symbols: &[Symbol]) -> Vec<Token> {
+    let v = first.first0(symbols);
+    v.iter().collect()
+}
+
+fn first1(first: &FirstSets, symbols: &[Symbol], lookahead: Token) -> Vec<Token> {
+    let v = first.first1(symbols, &TokenSet::from(lookahead));
+    v.iter().collect()
+}
+
+#[test]
+fn basic_first1() {
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        => None
+    };
+    X = "E"; // intentionally unreachable
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+
+    assert_eq!(first1(&first_sets, &[nt("A")], EOF), vec![la("C"), la("D")]);
+
+    assert_eq!(first1(&first_sets, &[nt("B")], EOF), vec![la("D"), EOF]);
+
+    assert_eq!(
+        first1(&first_sets, &[nt("B"), term("E")], EOF),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(
+        first1(&first_sets, &[nt("B"), nt("X")], EOF),
+        vec![la("D"), la("E")]
+    );
+}
+
+#[test]
+fn basic_first0() {
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        => None
+    };
+    X = "E"; // intentionally unreachable
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+
+    assert_eq!(first0(&first_sets, &[nt("A")]), vec![la("C"), la("D")]);
+
+    assert_eq!(first0(&first_sets, &[nt("B")]), vec![la("D"), EOF]);
+
+    assert_eq!(
+        first0(&first_sets, &[nt("B"), term("E")]),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(
+        first0(&first_sets, &[nt("B"), nt("X")]),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(first0(&first_sets, &[nt("X")]), vec![la("E")]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/interpret.rs
@@ -0,0 +1,206 @@
+//! LR(1) interpeter. Just builds up parse trees. Intended for testing.
+
+use lr1::core::*;
+use lr1::lookahead::*;
+use generate::ParseTree;
+use grammar::repr::*;
+use std::iter::IntoIterator;
+use std::fmt::{Debug, Display, Error, Formatter};
+use util::Sep;
+
+pub type InterpretError<'grammar, L> = (&'grammar State<'grammar, L>, Token);
+
+/// Feed in the given tokens and then EOF, returning the final parse tree that is reduced.
+pub fn interpret<'grammar, L>(
+    states: &'grammar [State<'grammar, L>],
+    tokens: Vec<TerminalString>,
+) -> Result<ParseTree, InterpretError<'grammar, L>>
+where
+    L: LookaheadInterpret,
+{
+    println!("interpret(tokens={:?})", tokens);
+    let mut m = Machine::new(states);
+    m.execute(tokens.into_iter())
+}
+
+/// Feed in the given tokens and returns the states on the stack.
+pub fn interpret_partial<'grammar, TOKENS, L>(
+    states: &'grammar [State<'grammar, L>],
+    tokens: TOKENS,
+) -> Result<Vec<StateIndex>, InterpretError<'grammar, L>>
+where
+    TOKENS: IntoIterator<Item = TerminalString>,
+    L: LookaheadInterpret,
+{
+    let mut m = Machine::new(states);
+    try!(m.execute_partial(tokens.into_iter()));
+    Ok(m.state_stack)
+}
+
+struct Machine<'grammar, L: LookaheadInterpret + 'grammar> {
+    states: &'grammar [State<'grammar, L>],
+    state_stack: Vec<StateIndex>,
+    data_stack: Vec<ParseTree>,
+}
+
+impl<'grammar, L> Machine<'grammar, L>
+where
+    L: LookaheadInterpret,
+{
+    fn new(states: &'grammar [State<'grammar, L>]) -> Machine<'grammar, L> {
+        Machine {
+            states: states,
+            state_stack: vec![],
+            data_stack: vec![],
+        }
+    }
+
+    fn top_state(&self) -> &'grammar State<'grammar, L> {
+        let index = self.state_stack.last().unwrap();
+        &self.states[index.0]
+    }
+
+    fn execute_partial<TOKENS>(
+        &mut self,
+        mut tokens: TOKENS,
+    ) -> Result<(), InterpretError<'grammar, L>>
+    where
+        TOKENS: Iterator<Item = TerminalString>,
+    {
+        assert!(self.state_stack.is_empty());
+        assert!(self.data_stack.is_empty());
+
+        self.state_stack.push(StateIndex(0));
+
+        let mut token = tokens.next();
+        while let Some(terminal) = token.clone() {
+            let state = self.top_state();
+
+            println!("state={:?}", state);
+            println!("terminal={:?}", terminal);
+
+            // check whether we can shift this token
+            if let Some(&next_index) = state.shifts.get(&terminal) {
+                self.data_stack.push(ParseTree::Terminal(terminal.clone()));
+                self.state_stack.push(next_index);
+                token = tokens.next();
+            } else if let Some(production) = L::reduction(state, &Token::Terminal(terminal.clone()))
+            {
+                let more = self.reduce(production);
+                assert!(more);
+            } else {
+                return Err((state, Token::Terminal(terminal.clone())));
+            }
+        }
+
+        Ok(())
+    }
+
+    fn execute<TOKENS>(&mut self, tokens: TOKENS) -> Result<ParseTree, InterpretError<'grammar, L>>
+    where
+        TOKENS: Iterator<Item = TerminalString>,
+    {
+        try!(self.execute_partial(tokens));
+
+        // drain now for EOF
+        loop {
+            let state = self.top_state();
+            match L::reduction(state, &Token::EOF) {
+                None => {
+                    return Err((state, Token::EOF));
+                }
+                Some(production) => {
+                    if !self.reduce(production) {
+                        assert_eq!(self.data_stack.len(), 1);
+                        return Ok(self.data_stack.pop().unwrap());
+                    }
+                }
+            }
+        }
+    }
+
+    fn reduce(&mut self, production: &Production) -> bool {
+        println!("reduce={:?}", production);
+
+        let args = production.symbols.len();
+
+        // remove the top N items from the data stack
+        let mut popped = vec![];
+        for _ in 0..args {
+            popped.push(self.data_stack.pop().unwrap());
+        }
+        popped.reverse();
+
+        // remove the top N states
+        for _ in 0..args {
+            self.state_stack.pop().unwrap();
+        }
+
+        // construct the new, reduced tree and push it on the stack
+        let tree = ParseTree::Nonterminal(production.nonterminal.clone(), popped);
+        self.data_stack.push(tree);
+
+        // recover the state and extract the "Goto" action
+        let receiving_state = self.top_state();
+        match receiving_state.gotos.get(&production.nonterminal) {
+            Some(&goto_state) => {
+                self.state_stack.push(goto_state);
+                true // keep going
+            }
+            None => {
+                false // all done
+            }
+        }
+    }
+}
+
+impl Debug for ParseTree {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for ParseTree {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            ParseTree::Nonterminal(ref id, ref trees) => {
+                write!(fmt, "[{}: {}]", id, Sep(", ", trees))
+            }
+            ParseTree::Terminal(ref id) => write!(fmt, "{}", id),
+        }
+    }
+}
+
+pub trait LookaheadInterpret: Lookahead {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        token: &Token,
+    ) -> Option<&'grammar Production>;
+}
+
+impl LookaheadInterpret for Nil {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        _token: &Token,
+    ) -> Option<&'grammar Production> {
+        state
+            .reductions
+            .iter()
+            .map(|&(_, production)| production)
+            .next()
+    }
+}
+
+impl LookaheadInterpret for TokenSet {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        token: &Token,
+    ) -> Option<&'grammar Production> {
+        state
+            .reductions
+            .iter()
+            .filter(|&&(ref tokens, _)| tokens.contains(token))
+            .map(|&(_, production)| production)
+            .next()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/item.rs
@@ -0,0 +1,1 @@
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/README.md
@@ -0,0 +1,417 @@
+This module contains code for LR(1) construction based on a paper by
+Pager and Chen, "The Lane Table Method Of Constructing LR(1) Parsers",
+published in APPLC '12. Unfortunately, that paper is quite compact --
+only 8 pages! -- which doesn't leave much room for examples and
+explanation.  This README is my attempt to explain the idea, or at
+least how I chose to implement it in LALRPOP, which may or may not be
+faithful to the original algorithm. Naturally it also serves as a
+guide to the code.
+
+### First example grammar: G0
+
+We will be working through two example grammars. The first I call G0
+-- it is a reduced version of what the paper calls G1. It is
+interesting because it does not require splitting any states, and so
+we wind up with the same number of states as in LR0. Put another way,
+it is an LALR(1) grammar.
+
+#### Grammar G0
+
+```
+G0 = X "c"
+   | Y "d"
+X  = "e" X
+   | "e"
+Y  = "e" Y
+   | "e"
+```
+
+#### Step 1: Construct an LR(0) state machine
+
+We begin by constructing an LR(0) state machine. The LR(0) states for
+G0 are as follows:
+
+```
+S0 = G0 = (*) X "c"
+   | G0 = (*) Y "d"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S1 = X = "e" (*) X
+   | X = "e" (*)
+   | X = (*) "e"
+   | X = (*) "e" "X"
+   | Y = "e" (*) Y
+   | Y = "e" (*)
+   | Y = (*) "e"
+   | Y = (*) "e" Y
+
+S2 = X = "e" X (*)
+
+S3 = G0 = X (*) "c"
+
+S4 = Y = "e" Y (*)
+
+S5 = G0 = Y (*) "d"
+
+S6 = G0 = X "c" (*)
+
+S7 = G0 = Y "d" (*)
+```
+
+We can also consider *edges* between the states as follows,
+with the label being the symbol that is pushed onto the stack:
+
+```
+S0 -"e"-> S1
+S1 -"e"-> S1
+S1 --X--> S2
+S0 --X--> S3
+S1 --Y--> S4
+S0 --Y--> S5
+S3 -"c"-> S6
+S5 -"d"-> S7
+```
+
+Note that state S1 is "inconsistent", in that it has conflicting
+actions.
+
+#### Step 2: Convert LR(0) states into LR(0-1) states.
+
+The term LR(0-1), but basically the idea is that the lookahead in a
+LR(0-1) state can be either a set of terminals (as in LR(1)) or *none*
+(as in LR(0)). You can also think of it alternatively as adding a
+special "wildcard" symbol `_` to the grammar; in our actual code, we
+represent this with `TokenSet::all()`. We will thus denote the
+inconsistent state after transformation as follows, where each line
+has the "wildcard" lookahead:
+
+```
+S1 = X = "e" (*) X   [_]
+   | X = "e" (*)     [_]
+   | X = (*) "e"     [_]
+   | X = (*) "e" "X" [_]
+   | Y = "e" (*) Y   [_]
+   | Y = "e" (*)     [_]
+   | Y = (*) "e"     [_]
+   | Y = (*) "e" Y   [_]
+```
+
+Naturally, the state is still inconsistent.
+
+#### Step 3: Resolve inconsistencies.
+
+In the next step, we iterate over all of our LR(0-1) states. In this
+example, we will not need to create new states, but in future examples
+we will. The iteration thus consists of a queue and some code like
+this:
+
+```rust
+let mut queue = Queue::new();
+queue.extend(/* all states */);
+while let Some(s) = queue.pop_front() {
+    if /* s is an inconsistent state */ {
+        resolve_inconsistencies(s, &mut queue);
+    }
+}
+```
+
+##### Step 3a: Build the lane table.
+
+To resolve an inconsistent state, we first construct a **lane
+table**. This is done by the code in the `lane` module (the `table`
+module maintains the data structure). It works by structing at each
+conflict and tracing **backwards**. Let's start with the final table
+we will get for the state S1 and then we will work our way back to how
+it is constructed. First, let's identify the conflicting actions from
+S1 and give them indices:
+
+```
+S1 = X = (*) "e"     [_] // C0 -- shift "e"
+   | X = "e" (*)     [_] // C1 -- reduce `X = "e" (*)`
+   | X = (*) "e" "X" [_] // C0 -- shift "e"
+   | X = "e" (*) X   [_]
+   | Y = (*) "e"     [_] // C0 -- shift "e"
+   | Y = "e" (*)     [_] // C2 -- reduce `Y = "e" (*)`
+   | Y = (*) "e" Y   [_] // C0 -- shift "e"
+   | Y = "e" (*) Y   [_]
+```
+
+Several of the items can cause "Confliction Action 0" (C0), which is
+to shift an `"e"`. These are all mutually compatible. However, there
+are also two incompatible actions: C1 and C2, both reductions. In
+fact, we'll find that we look back at state S0, these 'conflicting'
+actions all occur with distinct lookahead. The purpose of the lane
+table is to summarize that information. The lane table we will up
+constructing for these conflicting actions is as follows:
+
+```
+| State | C0    | C1    | C2    | Successors |
+| S0    |       | ["c"] | ["d"] | {S1}       |
+| S1    | ["e"] | []    | []    | {S1}       |
+```
+
+Here the idea is that the lane table summarizes the lookahead
+information contributed by each state. Note that for the *shift* the
+state S1 already has enough lookahead information: we only shift when
+we see the terminal we need next ("e"). But state C1 and C2, the lookahead
+actually came from S0, which is a predecessor state.
+
+As I said earlier, the algorithm for constructing the table works by
+looking at the conflicting item and walking backwards. So let's
+illustrate with conflict C1. We have the conflicting item `X = "e"
+(*)`, and we are basically looking to find its lookahead. We know
+that somewhere in the distant past of our state machine there must be
+an item like
+
+    Foo = ...a (*) X ...b
+    
+that led us here. We want to find that item, so we can derive the
+lookahead from `...b` (whatever symbols come after `X`).
+
+To do this, we will walk the graph. Our state at any point in time
+will be the pair of a state and an item in that state. To start out,
+then, we have `(S1, X = "e" (*))`, which is the conflict C1. Because
+the `(*)` is not at the "front" of this item, we have to figure out
+where this `"e"` came from on our stack, so we look for predecessors
+of the state S1 which have an item like `X = (*) e`. This leads us to
+S0 and also S1. So we can push two states in our search: `(S0, X = (*)
+"e")` and `(S1, X = (*) "e")`. Let's consider each in turn.
+
+The next state is then `(S0, X = (*) "e")`. Here the `(*)` lies at the
+front of the item, so we search **the same state** S0 for items that
+would have led to this state via an *epsilon move*.  This basically
+means an item like `Foo = ... (*) X ...` -- i.e., where the `(*)`
+appears directly before the nonterminal `X`. In our case, we will find
+`G0 = (*) X "c"`. This is great, because it tells us some lookahead
+("c", in particular), and hence we can stop our search. We add to the
+table the entry that the state S0 contributes lookahead "c" to the
+conflict C1.  In some cases, we might find something like `Foo =
+... (*) X` instead, where the `X` we are looking for appears at the
+end. In that case, we have to restart our search, but looking for the
+lookahead for `Foo`.
+
+The next state in our case is `(S1, X = (*) e)`. Again the `(*)` lies
+at the beginning and hence we search for things in the state S1 where
+`X` is the next symbol. We find `X = "e" (*) X`. This is not as good
+as last time, because there are no symbols appearing after X in this
+item, so it does not contribute any lookahead. We therefore can't stop
+our search yet, but we push the state `(S1, X = "e" (*) X)` -- this
+corresponds to the `Foo` state I mentioned at the end of the last
+paragraph, except that in this case `Foo` is the same nonterminal `X`
+we started with.
+
+Looking at `(S1, X = "e" (*) X)`, we again have the `(*)` in the
+middle of the item, so we move it left, searching for predecessors
+with the item `X = (*) e X`. We will (again) find S0 and S1 have such
+items. In the case of S0, we will (again) find the context "c", which
+we dutifully add to the table (this has no effect, since it is already
+present). In the case of S1, we will (again) wind up at the state
+`(S1, X = "e" (*) X)`.  Since we've already visited this state, we
+stop our search, it will not lead to new context.
+
+At this point, our table column for C1 is complete. We can repeat the
+process for C2, which plays out in an analogous way.
+
+##### Step 3b: Update the lookahead
+
+Looking at the lane table we built, we can union the context sets in
+any particular column. We see that the context sets for each
+conflicting action are pairwise disjoint. Therefore, we can simply
+update each reduce action in our state with those lookaheads in mind,
+and hence render it consistent:
+
+```
+S1 = X = (*) "e"     [_]
+   | X = "e" (*)     ["c"] // lookahead from C1
+   | X = (*) "e" "X" [_]
+   | X = "e" (*) X   [_]
+   | Y = (*) "e"     [_]
+   | Y = "e" (*)     ["d"] // lookahead from C2
+   | Y = (*) "e" Y   [_]
+   | Y = "e" (*) Y   [_]
+```
+
+This is of course also what the LALR(1) state would look like (though
+it would include context for the other items, though that doesn't play
+into the final machine execution).
+
+At this point we've covered enough to handle the grammar G0.  Let's
+turn to a more complex grammar, grammar G1, and then we'll come back
+to cover the remaining steps.
+
+### Second example: the grammar G1
+
+G1 is a (typo corrected) version of the grammar from the paper. This
+grammar is not LALR(1) and hence it is more interesting, because it
+requires splitting states.
+
+#### Grammar G1
+
+```
+G1 = "a" X "d"
+   | "a" Y "c"
+   | "b" X "c"
+   | "b" Y "d"
+X  = "e" X
+   | "e"
+Y  = "e" Y
+   | "e"
+```
+
+The key point of this grammar is that when we see `... "e" "c"` and we
+wish to know whether to reduce to `X` or `Y`, we don't have enough
+information. We need to know what is in the `...`, because `"a" "e"
+"c"` means we reduce `"e"` to `Y` and `"b" "e" "c"` means we reduce to
+`X`. In terms of our *state machine*, this corresponds to *splitting*
+the states responsible for X and Y based on earlier context.
+
+Let's look at a subset of the LR(0) states for G1:
+
+```
+S0 = G0 = (*) "a" X "d"
+   | G0 = (*) "a" Y "c"
+   | G0 = (*) "b" X "c"
+   | G0 = (*) "b" X "d"
+   
+S1 = G0 = "a" (*) X "d"
+   | G0 = "a" (*) Y "c"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S2 = G0 = "b" (*) X "c"
+   | G0 = "b" (*) Y "d"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S3 = X = "e" (*) X
+   | X = "e" (*)      // C1 -- can reduce
+   | X = (*) "e"      // C0 -- can shift "e"
+   | X = (*) "e" "X"  // C0 -- can shift "e"
+   | Y = "e" (*) Y
+   | Y = "e" (*)      // C2 -- can reduce
+   | Y = (*) "e"      // C0 -- can shift "e"
+   | Y = (*) "e" Y    // C0 -- can shift "e"
+```
+
+Here we can see the problem. The state S3 is inconsistent. But it is
+reachable from both S1 and S2. If we come from S1, then we can have (e.g.)
+`X "d"`, but if we come from S2, we expect `X "c"`.
+
+Let's walk through our algorithm again. I'll start with step 3a.
+
+### Step 3a: Build the lane table.
+
+The lane table for state S3 will look like this:
+
+```
+| State | C0    | C1    | C2    | Successors |
+| S1    |       | ["d"] | ["c"] | {S3}       |
+| S2    |       | ["c"] | ["d"] | {S3}       |
+| S3    | ["e"] | []    | []    | {S3}       |
+```
+
+Now if we union each column, we see that both C1 and C2 wind up with
+lookahead `{"c", "d"}`. This is our problem. We have to isolate things
+better. Therefore, step 3b ("update lookahead") does not apply. Instead
+we attempt step 3c.
+
+### Step 3c: Isolate lanes
+
+This part of the algorithm is only loosely described in the paper, but
+I think it works as follows. We will employ a union-find data
+structure. With each set, we will record a "context set", which
+records for each conflict the set of lookahead tokens (e.g.,
+`{C1:{"d"}}`).
+
+A context set tells us how to map the lookahead to an action;
+therefire, to be self-consistent, the lookaheads for each conflict
+must be mutually disjoint. In other words, `{C1:{"d"}, C2:{"c"}}` is
+valid, and says to do C1 if we see a "d" and C2 if we see a "c". But
+`{C1:{"d"}, C2:{"d"}}` is not, because there are two actions.
+
+Initially, each state in the lane table is mapped to itself, and the
+conflict set is derived from its column in the lane table:
+
+```
+S1 = {C1:d, C2:c}
+S2 = {C1:c, C2:d}
+S3 = {C0:e}
+```
+
+We designate "beachhead" states as those states in the table that are
+not reachable from another state in the table (i.e., using the
+successors). In this case, those are the states S1 and S2. We will be
+doing a DFS through the table and we want to use those as the starting
+points.
+
+(Question: is there always at least one beachhead state? Seems like
+there must be.)
+
+So we begin by iterating over the beachhead states.
+
+```rust
+for beachhead in beachheads { ... }
+```
+
+When we visit a state X, we will examine each of its successors Y. We
+consider whether the context set for Y can be merged with the context
+set for X. So, in our case, X will be S1 to start and Y will be S3.
+In this case, the context set can be merged, and hence we union S1, S3
+and wind up with the following union-find state:
+
+```
+S1,S3 = {C0:e, C1:d, C2:c}
+S2    = {C1:c, C2:d}
+```
+
+(Note that this union is just for the purpose of tracking context; it
+doesn't imply that S1 and S3 are the 'same states' or anything like
+that.)
+
+Next we examine the edge S3 -> S3. Here the contexts are already
+merged and everything is happy, so we stop. (We already visited S3,
+after all.)
+
+This finishes our first beachhead, so we proceed to the next edge, S2
+-> S3. Here we find that we **cannot** union the context: it would
+produce an inconsistent state. So what we do is we **clone** S3 to
+make a new state, S3', with the initial setup corresponding to the row
+for S3 from the lane table:
+
+```
+S1,S3 = {C0:e, C1:d, C2:c}
+S2    = {C1:c, C2:d}
+S3'   = {C0:e}
+```
+
+This also involves updating our LR(0-1) state set to have a new state
+S3'. All edges from S2 that led to S3 now lead to S3'; the outgoing
+edges from S3' remain unchanged. (At least to start.)
+
+Therefore, the edge `S2 -> S3` is now `S2 -> S3'`. We can now merge
+the conflicts:
+
+```
+S1,S3  = {C0:e, C1:d, C2:c}
+S2,S3' = {C0:e, C1:c, C2:d}
+```
+
+Now we examine the outgoing edge S3' -> S3. We cannot merge these
+conflicts, so we search (greedily, I guess) for a clone of S3 where we
+can merge the conflicts. We find one in S3', and hence we redirect the
+S3 edge to S3' and we are done. (I think the actual search we want is
+to make first look for a clone of S3 that is using literally the same
+context as us (i.e., same root node), as in this case. If that is not
+found, *then* we search for one with a mergable context. If *that*
+fails, then we clone a new state.)
+
+The final state thus has two copies of S3, one for the path from S1,
+and one for the path from S2, which gives us enough context to
+proceed.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/merge.rs
@@ -0,0 +1,218 @@
+use collections::{Map, Multimap, Set};
+use ena::unify::UnificationTable;
+use lr1::core::{Action, LR1State, StateIndex};
+use lr1::lane_table::construct::state_set::StateSet;
+use lr1::lane_table::table::LaneTable;
+use lr1::lane_table::table::context_set::ContextSet;
+
+/// The "merge" phase of the algorithm is described in "Step 3c" of
+/// [the README][r].  It consists of walking through the various
+/// states in the lane table and merging them into sets of states that
+/// have compatible context sets; if we encounter a state S that has a
+/// successor T but where the context set of S is not compatible with
+/// T, then we will clone T into a new T2 (and hopefully the context
+/// set of S will be compatible with the reduced context of T2).
+///
+/// [r]: ../README.md
+pub struct Merge<'m, 'grammar: 'm> {
+    table: &'m LaneTable<'grammar>,
+    states: &'m mut Vec<LR1State<'grammar>>,
+    visited: Set<StateIndex>,
+    original_indices: Map<StateIndex, StateIndex>,
+    clones: Multimap<StateIndex, Vec<StateIndex>>,
+    target_states: Vec<StateIndex>,
+    context_sets: ContextSets<'m>,
+}
+
+impl<'m, 'grammar> Merge<'m, 'grammar> {
+    pub fn new(
+        table: &'m LaneTable<'grammar>,
+        unify: &'m mut UnificationTable<StateSet>,
+        states: &'m mut Vec<LR1State<'grammar>>,
+        state_sets: &'m mut Map<StateIndex, StateSet>,
+        inconsistent_state: StateIndex,
+    ) -> Self {
+        Merge {
+            table: table,
+            states: states,
+            visited: Set::new(),
+            original_indices: Map::new(),
+            clones: Multimap::new(),
+            target_states: vec![inconsistent_state],
+            context_sets: ContextSets {
+                unify: unify,
+                state_sets: state_sets,
+            },
+        }
+    }
+
+    pub fn start(&mut self, beachhead_state: StateIndex) -> Result<(), (StateIndex, StateIndex)> {
+        debug!("Merge::start(beachhead_state={:?})", beachhead_state);
+
+        // Since we always start walks from beachhead states, and they
+        // are not reachable from anyone else, this state should not
+        // have been unioned with anything else yet.
+        self.walk(beachhead_state)
+    }
+
+    pub fn patch_target_starts(mut self, actions: &Set<Action<'grammar>>) {
+        debug!("Merge::patch_target_starts(actions={:?})", actions);
+
+        for &target_state in &self.target_states {
+            debug!(
+                "Merge::patch_target_starts: target_state={:?}",
+                target_state
+            );
+            let context_set = self.context_sets.context_set(target_state);
+            debug!("Merge::patch_target_starts: context_set={:?}", context_set);
+            context_set.apply(&mut self.states[target_state.0], actions);
+        }
+    }
+
+    /// If `state` is a cloned state, find its original index.  Useful
+    /// for indexing into the lane table and so forth.
+    fn original_index(&self, state: StateIndex) -> StateIndex {
+        *self.original_indices.get(&state).unwrap_or(&state)
+    }
+
+    fn successors(&self, state: StateIndex) -> Option<&'m Set<StateIndex>> {
+        self.table.successors(self.original_index(state))
+    }
+
+    fn walk(&mut self, state: StateIndex) -> Result<(), (StateIndex, StateIndex)> {
+        debug!("Merge::walk(state={:?})", state);
+
+        if !self.visited.insert(state) {
+            debug!("Merge::walk: visited already");
+            return Ok(());
+        }
+
+        for &successor in self.successors(state).iter().flat_map(|&s| s) {
+            debug!("Merge::walk: state={:?} successor={:?}", state, successor);
+
+            if self.context_sets.union(state, successor) {
+                debug!(
+                    "Merge::walk: successful union, context-set = {:?}",
+                    self.context_sets.context_set(state)
+                );
+                self.walk(successor)?;
+            } else {
+                // search for an existing clone with which we can merge
+                debug!("Merge::walk: union failed, seek existing clone");
+                let existing_clone = {
+                    let context_sets = &mut self.context_sets;
+                    self.clones.get(&successor)
+                               .into_iter()
+                               .flat_map(|clones| clones) // get() returns an Option<Set>
+                               .cloned()
+                               .filter(|&successor1| context_sets.union(state, successor1))
+                               .next()
+                };
+
+                if let Some(successor1) = existing_clone {
+                    debug!("Merge::walk: found existing clone {:?}", successor1);
+                    self.patch_links(state, successor, successor1);
+                    self.walk(successor1)?;
+                } else {
+                    // if we don't find one, we have to make a new clone
+                    debug!("Merge::walk: creating new clone of {:?}", successor);
+                    let successor1 = self.clone(successor);
+                    if self.context_sets.union(state, successor1) {
+                        self.patch_links(state, successor, successor1);
+                        self.walk(successor1)?;
+                    } else {
+                        debug!(
+                            "Merge::walk: failed to union {:?} with {:?}",
+                            state, successor1
+                        );
+                        debug!(
+                            "Merge::walk: state context = {:?}",
+                            self.context_sets.context_set(state)
+                        );
+                        debug!(
+                            "Merge::walk: successor context = {:?}",
+                            self.context_sets.context_set(successor1)
+                        );
+
+                        return Err((self.original_index(state), self.original_index(successor1)));
+                    }
+                }
+            }
+        }
+
+        Ok(())
+    }
+
+    fn clone(&mut self, state: StateIndex) -> StateIndex {
+        // create a new state with same contents as the old one
+        let new_index = StateIndex(self.states.len());
+        let new_state = self.states[state.0].clone();
+        self.states.push(new_state);
+
+        // track the original index and clones
+        let original_index = self.original_index(state);
+        self.original_indices.insert(new_index, original_index);
+        self.clones.push(original_index, new_index);
+
+        // create a new unify key for this new state
+        let context_set = self.table.context_set(original_index).unwrap();
+        self.context_sets.new_state(new_index, context_set);
+
+        // keep track of the clones of the target state
+        if original_index == self.target_states[0] {
+            self.target_states.push(new_index);
+        }
+
+        debug!("Merge::clone: cloned {:?} to {:?}", state, new_index);
+        new_index
+    }
+
+    fn patch_links(
+        &mut self,
+        predecessor: StateIndex,
+        original_successor: StateIndex,
+        cloned_successor: StateIndex,
+    ) {
+        let replace = |target_state: &mut StateIndex| {
+            if *target_state == original_successor {
+                *target_state = cloned_successor;
+            }
+        };
+
+        let state = &mut self.states[predecessor.0];
+        for (_, target_state) in &mut state.shifts {
+            replace(target_state);
+        }
+        for (_, target_state) in &mut state.gotos {
+            replace(target_state);
+        }
+    }
+}
+
+struct ContextSets<'m> {
+    state_sets: &'m mut Map<StateIndex, StateSet>,
+    unify: &'m mut UnificationTable<StateSet>,
+}
+
+impl<'m> ContextSets<'m> {
+    fn context_set(&mut self, state: StateIndex) -> ContextSet {
+        let state_set = self.state_sets[&state];
+        self.unify.probe_value(state_set)
+    }
+
+    fn union(&mut self, source: StateIndex, target: StateIndex) -> bool {
+        let set1 = self.state_sets[&source];
+        let set2 = self.state_sets[&target];
+        let result = self.unify.unify_var_var(set1, set2).is_ok();
+        debug!(
+            "ContextSets::union: source={:?} target={:?} result={:?}",
+            source, target, result
+        );
+        result
+    }
+
+    fn new_state(&mut self, new_index: StateIndex, context_set: ContextSet) {
+        let state_set = self.unify.new_key(context_set);
+        self.state_sets.insert(new_index, state_set);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/mod.rs
@@ -0,0 +1,264 @@
+//!
+
+use collections::{Map, Set};
+use ena::unify::UnificationTable;
+use grammar::repr::*;
+use lr1::build;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::lookahead::{Lookahead, TokenSet};
+use lr1::lane_table::lane::LaneTracer;
+use lr1::lane_table::table::{ConflictIndex, LaneTable};
+use lr1::lane_table::table::context_set::OverlappingLookahead;
+use lr1::state_graph::StateGraph;
+use std::rc::Rc;
+
+mod merge;
+use self::merge::Merge;
+
+mod state_set;
+use self::state_set::StateSet;
+
+pub struct LaneTableConstruct<'grammar> {
+    grammar: &'grammar Grammar,
+    first_sets: FirstSets,
+    start_nt: NonterminalString,
+}
+
+impl<'grammar> LaneTableConstruct<'grammar> {
+    pub fn new(grammar: &'grammar Grammar, start_nt: NonterminalString) -> Self {
+        let first_sets = FirstSets::new(grammar);
+        LaneTableConstruct {
+            grammar: grammar,
+            start_nt: start_nt,
+            first_sets: first_sets,
+        }
+    }
+
+    pub fn construct(self) -> Result<Vec<LR1State<'grammar>>, LR1TableConstructionError<'grammar>> {
+        let states = {
+            match build::build_lr0_states(self.grammar, self.start_nt.clone()) {
+                Ok(states) => {
+                    // In this case, the grammar is actually
+                    // LR(0). This is very rare -- it means that the
+                    // grammar does not need lookahead to execute. In
+                    // principle, we could stop here, except that if
+                    // we do so, then the lookahead values that we get
+                    // are very broad.
+                    //
+                    // Broad lookahead values will cause "eager"
+                    // reduce at runtime -- i.e., if there is some
+                    // scenario where the lookahead tells you we are
+                    // in error, but we would have to reduce a few
+                    // states before we see it. This, in turn, can
+                    // cause infinite loops around error recovery
+                    // (#240).
+                    //
+                    // Since we want to behave as a LR(1) parser
+                    // would, we'll just go ahead and run the
+                    // algorithm.
+                    states
+                }
+                Err(TableConstructionError {
+                    states,
+                    conflicts: _,
+                }) => states,
+            }
+        };
+
+        // Convert the LR(0) states into LR(0-1) states.
+        let mut states = self.promote_lr0_states(states);
+
+        // For each inconsistent state, apply the lane-table algorithm to
+        // resolve it.
+        for i in 0.. {
+            if i >= states.len() {
+                break;
+            }
+
+            match self.resolve_inconsistencies(&mut states, StateIndex(i)) {
+                Ok(()) => {}
+                Err(_) => {
+                    // We failed because of irreconcilable conflicts
+                    // somewhere. Just compute the conflicts from the final set of
+                    // states.
+                    debug!(
+                        "construct: failed to resolve inconsistencies in state {:#?}",
+                        states[i]
+                    );
+                    let conflicts: Vec<Conflict<'grammar, TokenSet>> = states
+                        .iter()
+                        .flat_map(|s| Lookahead::conflicts(&s))
+                        .collect();
+                    return Err(TableConstructionError {
+                        states: states,
+                        conflicts: conflicts,
+                    });
+                }
+            }
+        }
+
+        Ok(states)
+    }
+
+    /// Given a set of LR0 states, returns LR1 states where the lookahead
+    /// is always `TokenSet::all()`. We refer to these states as LR(0-1)
+    /// states in the README.
+    fn promote_lr0_states(&self, lr0: Vec<LR0State<'grammar>>) -> Vec<LR1State<'grammar>> {
+        let all = TokenSet::all();
+        debug!("promote_lr0_states: all={:?}", all);
+        lr0.into_iter()
+            .map(|s| {
+                let items = s.items
+                    .vec
+                    .iter()
+                    .map(|item| Item {
+                        production: item.production,
+                        index: item.index,
+                        lookahead: all.clone(),
+                    })
+                    .collect();
+                let reductions = s.reductions
+                    .into_iter()
+                    .map(|(_, p)| (all.clone(), p))
+                    .collect();
+                State {
+                    index: s.index,
+                    items: Items {
+                        vec: Rc::new(items),
+                    },
+                    shifts: s.shifts,
+                    reductions: reductions,
+                    gotos: s.gotos,
+                }
+            })
+            .collect()
+    }
+
+    fn resolve_inconsistencies(
+        &self,
+        states: &mut Vec<LR1State<'grammar>>,
+        inconsistent_state: StateIndex,
+    ) -> Result<(), StateIndex> {
+        debug!(
+            "resolve_inconsistencies(inconsistent_state={:?}/{:#?}",
+            inconsistent_state, states[inconsistent_state.0]
+        );
+
+        let mut actions = super::conflicting_actions(&states[inconsistent_state.0]);
+        if actions.is_empty() {
+            // This can mean one of two things: only shifts, or a
+            // single reduction. We have to be careful about states
+            // with a single reduction: even though such a state is
+            // not inconsistent (there is only one possible course of
+            // action), we still want to run the lane table algorithm,
+            // because otherwise we get states with "complete"
+            // lookahead, which messes with error recovery.
+            //
+            // In particular, if there is too much lookahead, we will
+            // reduce even when it is inappropriate to do so.
+            actions = states[inconsistent_state.0]
+                .reductions
+                .iter()
+                .map(|&(_, prod)| Action::Reduce(prod))
+                .collect();
+            if actions.is_empty() {
+                return Ok(());
+            }
+        }
+
+        debug!("resolve_inconsistencies: conflicting_actions={:?}", actions);
+
+        let table = self.build_lane_table(states, inconsistent_state, &actions);
+
+        // Consider first the "LALR" case, where the lookaheads for each
+        // action are completely disjoint.
+        if self.attempt_lalr(&mut states[inconsistent_state.0], &table, &actions) {
+            return Ok(());
+        }
+
+        // Construct the initial states; each state will map to a
+        // context-set derived from its row in the lane-table. This is
+        // fallible, because a state may be internally inconstent.
+        //
+        // (To handle unification, we also map each state to a
+        // `StateSet` that is its entry in the `ena` table.)
+        let rows = table.rows()?;
+        let mut unify = UnificationTable::<StateSet>::new();
+        let mut state_sets = Map::new();
+        for (&state_index, context_set) in &rows {
+            let state_set = unify.new_key(context_set.clone());
+            state_sets.insert(state_index, state_set);
+            debug!(
+                "resolve_inconsistencies: state_index={:?}, state_set={:?}",
+                state_index, state_set
+            );
+        }
+
+        // Now merge state-sets, cloning states where needed.
+        let mut merge = Merge::new(
+            &table,
+            &mut unify,
+            states,
+            &mut state_sets,
+            inconsistent_state,
+        );
+        let beachhead_states = table.beachhead_states();
+        for beachhead_state in beachhead_states {
+            match merge.start(beachhead_state) {
+                Ok(()) => {}
+                Err((source, _)) => {
+                    debug!(
+                        "resolve_inconsistencies: failed to merge, source={:?}",
+                        source
+                    );
+                    return Err(source);
+                }
+            }
+        }
+        merge.patch_target_starts(&actions);
+
+        Ok(())
+    }
+
+    fn attempt_lalr(
+        &self,
+        state: &mut LR1State<'grammar>,
+        table: &LaneTable<'grammar>,
+        actions: &Set<Action<'grammar>>,
+    ) -> bool {
+        match table.columns() {
+            Ok(columns) => {
+                debug!("attempt_lalr, columns={:#?}", columns);
+                columns.apply(state, actions);
+                debug!("attempt_lalr, state={:#?}", state);
+                true
+            }
+            Err(OverlappingLookahead) => {
+                debug!("attempt_lalr, OverlappingLookahead");
+                false
+            }
+        }
+    }
+
+    fn build_lane_table(
+        &self,
+        states: &[LR1State<'grammar>],
+        inconsistent_state: StateIndex,
+        actions: &Set<Action<'grammar>>,
+    ) -> LaneTable<'grammar> {
+        let state_graph = StateGraph::new(states);
+        let mut tracer = LaneTracer::new(
+            self.grammar,
+            self.start_nt.clone(),
+            states,
+            &self.first_sets,
+            &state_graph,
+            actions.len(),
+        );
+        for (i, action) in actions.iter().enumerate() {
+            tracer.start_trace(inconsistent_state, ConflictIndex::new(i), action.clone());
+        }
+        tracer.into_table()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/construct/state_set.rs
@@ -0,0 +1,44 @@
+use ena::unify::{UnifyKey, UnifyValue};
+use lr1::lane_table::table::context_set::{ContextSet, OverlappingLookahead};
+
+/// The unification key for a set of states in the lane table
+/// algorithm.  Each set of states is associated with a
+/// `ContextSet`. When two sets of states are merged, their conflict
+/// sets are merged as well; this will fail if that would produce an
+/// overlapping conflict set.
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub struct StateSet {
+    index: u32,
+}
+
+impl UnifyKey for StateSet {
+    type Value = ContextSet;
+
+    fn index(&self) -> u32 {
+        self.index
+    }
+
+    fn from_index(u: u32) -> Self {
+        StateSet { index: u }
+    }
+
+    fn tag() -> &'static str {
+        "StateSet"
+    }
+}
+
+// FIXME: The `ena` interface is really designed around `UnifyValue`
+// being cheaply cloneable; we should either refactor `ena` a bit or
+// find some other way to associate a `ContextSet` with a state set
+// (for example, we could have each state set be associated with an
+// index that maps to a `ContextSet`), and do the merging ourselves.
+// But this is easier for now, and cloning a `ContextSet` isn't THAT
+// expensive, right? :)
+impl UnifyValue for ContextSet {
+    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, (Self, Self)> {
+        match ContextSet::union(value1, value2) {
+            Ok(v) => Ok(v),
+            Err(OverlappingLookahead) => Err((value1.clone(), value2.clone())),
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/lane/mod.rs
@@ -0,0 +1,149 @@
+//! Code to trace out a single lane, collecting information into the
+//! lane table as we go.
+
+use collections::Set;
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::lookahead::*;
+use lr1::state_graph::StateGraph;
+
+use super::table::{ConflictIndex, LaneTable};
+
+pub struct LaneTracer<'trace, 'grammar: 'trace, L: Lookahead + 'trace> {
+    states: &'trace [State<'grammar, L>],
+    first_sets: &'trace FirstSets,
+    state_graph: &'trace StateGraph,
+    table: LaneTable<'grammar>,
+    start_nt: NonterminalString,
+}
+
+impl<'trace, 'grammar, L: Lookahead> LaneTracer<'trace, 'grammar, L> {
+    pub fn new(
+        grammar: &'grammar Grammar,
+        start_nt: NonterminalString,
+        states: &'trace [State<'grammar, L>],
+        first_sets: &'trace FirstSets,
+        state_graph: &'trace StateGraph,
+        conflicts: usize,
+    ) -> Self {
+        LaneTracer {
+            states: states,
+            first_sets: first_sets,
+            state_graph: state_graph,
+            start_nt: start_nt,
+            table: LaneTable::new(grammar, conflicts),
+        }
+    }
+
+    pub fn into_table(self) -> LaneTable<'grammar> {
+        self.table
+    }
+
+    pub fn start_trace(
+        &mut self,
+        state: StateIndex,
+        conflict: ConflictIndex,
+        action: Action<'grammar>,
+    ) {
+        let mut visited_set = Set::default();
+
+        // if the conflict item is a "shift" item, then the context
+        // is always the terminal to shift (and conflicts only arise
+        // around shifting terminal, so it must be a terminal)
+        match action {
+            Action::Shift(term, _) => {
+                let mut token_set = TokenSet::new();
+                token_set.insert(Token::Terminal(term));
+                self.table.add_lookahead(state, conflict, &token_set);
+            }
+
+            Action::Reduce(prod) => {
+                let item = Item::lr0(prod, prod.symbols.len());
+                self.continue_trace(state, conflict, item, &mut visited_set);
+            }
+        }
+    }
+
+    fn continue_trace(
+        &mut self,
+        state: StateIndex,
+        conflict: ConflictIndex,
+        item: LR0Item<'grammar>,
+        visited: &mut Set<(StateIndex, LR0Item<'grammar>)>,
+    ) {
+        if !visited.insert((state, item)) {
+            return;
+        }
+
+        if item.index > 0 {
+            // This item was reached by shifting some symbol.  We need
+            // to unshift that symbol, which means we walk backwards
+            // to predecessors of `state` in the state graph.
+            //
+            // Example:
+            //
+            //     X = ...p T (*) ...s
+            //
+            // Here we would be "unshifting" T, which means we will
+            // walk to predecessors of the current state that were
+            // reached by shifting T. Those predecessors will contain
+            // an item like `X = ...p (*) T ...s`, which we will then
+            // process in turn.
+            let shifted_symbol = item.production.symbols[item.index - 1].clone();
+            let unshifted_item = Item {
+                index: item.index - 1,
+                ..item
+            };
+            let predecessors = self.state_graph.predecessors(state, shifted_symbol);
+            for predecessor in predecessors {
+                self.table.add_successor(predecessor, state);
+                self.continue_trace(predecessor, conflict, unshifted_item, visited);
+            }
+            return;
+        }
+
+        // Either: we are in the start state, or this item was
+        // reached by an epsilon transition. We have to
+        // "unepsilon", which means that we search elsewhere in
+        // the state for where the epsilon transition could have
+        // come from.
+        //
+        // Example:
+        //
+        //     X = (*) ...
+        //
+        // We will search for other items in the same state like:
+        //
+        //     Y = ...p (*) X ...s
+        //
+        // We can then insert `FIRST(...s)` as lookahead for
+        // `conflict`. If `...s` may derive epsilon, though, we
+        // have to recurse and search with the previous item.
+
+        let state_items = &self.states[state.0].items.vec;
+        let nonterminal = &item.production.nonterminal;
+        if *nonterminal == self.start_nt {
+            // as a special case, if the `X` above is the special, synthetic
+            // start-terminal, then the only thing that comes afterwards is EOF.
+            self.table.add_lookahead(state, conflict, &TokenSet::eof());
+        }
+
+        // NB: Under the normal LR terms, the start nonterminal will
+        // only have one production like `X' = X`, in which case this
+        // loop is useless, but sometimes in tests we don't observe
+        // that restriction, so do it anyway.
+        for pred_item in state_items
+            .iter()
+            .filter(|i| i.can_shift_nonterminal(nonterminal))
+        {
+            let symbol_sets = pred_item.symbol_sets();
+            let mut first = self.first_sets.first0(symbol_sets.suffix);
+            let derives_epsilon = first.take_eof();
+            self.table.add_lookahead(state, conflict, &first);
+            if derives_epsilon {
+                self.continue_trace(state, conflict, pred_item.to_lr0(), visited);
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/mod.rs
@@ -0,0 +1,27 @@
+use collections::Set;
+use lr1::core::*;
+use lr1::lookahead::Lookahead;
+use grammar::repr::*;
+
+mod construct;
+mod lane;
+mod table;
+
+#[cfg(test)]
+mod test;
+
+pub fn build_lane_table_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    construct::LaneTableConstruct::new(grammar, start).construct()
+}
+
+fn conflicting_actions<'grammar, L: Lookahead>(
+    state: &State<'grammar, L>,
+) -> Set<Action<'grammar>> {
+    let conflicts = L::conflicts(state);
+    let reductions = conflicts.iter().map(|c| Action::Reduce(c.production));
+    let actions = conflicts.iter().map(|c| c.action.clone());
+    reductions.chain(actions).collect()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/table/context_set/mod.rs
@@ -0,0 +1,98 @@
+//! A key part of the lane-table algorithm is the idea of a CONTEXT
+//! SET (my name, the paper has no name for this). Basically it
+//! represents the LR1 context under which a given conflicting action
+//! would take place.
+//!
+//! So, for example, imagine this grammar:
+//!
+//! ```notrust
+//! A = B x
+//!   | C y
+//! B = z
+//! C = z
+//! ```
+//!
+//! This gives rise to states like:
+//!
+//! - `S0 = { * B x, * C y, B = * z, C = * z }`
+//! - `S1 = { B = z *, C = z * }`
+//!
+//! This second state has two conflicting items. Let's call them
+//! conflicts 0 and 1 respectively. The conflict set would then have
+//! two entries (one for each conflict) and it would map each of them
+//! to a TokenSet supplying context. So when we trace everything
+//! out we might get a ContextSet of:
+//!
+//! - `[ 0: x, 1: y ]`
+//!
+//! In general, you want to ensure that the token sets of all
+//! conflicting items are pairwise-disjoint, or else if you get to a
+//! state that has both of those items (which, by definition, does
+//! arise) you won't know which to take. In this case, we're all set,
+//! because item 0 occurs only with lookahead `x` and item 1 with
+//! lookahead `y`.
+
+use collections::{Map, Set};
+use lr1::core::*;
+use lr1::lookahead::*;
+mod test;
+
+use super::ConflictIndex;
+
+#[derive(Clone, Debug)]
+pub struct ContextSet {
+    values: Vec<TokenSet>,
+}
+
+#[derive(Debug)]
+pub struct OverlappingLookahead;
+
+impl ContextSet {
+    pub fn new(num_conflicts: usize) -> Self {
+        ContextSet {
+            values: (0..num_conflicts).map(|_| TokenSet::new()).collect(),
+        }
+    }
+
+    pub fn union(set1: &ContextSet, set2: &ContextSet) -> Result<Self, OverlappingLookahead> {
+        let mut result = set1.clone();
+        for (i, t) in set2.values.iter().enumerate() {
+            result.insert(ConflictIndex::new(i), t)?;
+        }
+        Ok(result)
+    }
+
+    /// Attempts to merge the values `conflict: set` into this
+    /// conflict set. If this would result in an invalid conflict set
+    /// (where two conflicts have overlapping lookahead), then returns
+    /// `Err(OverlappingLookahead)` and has no effect.
+    ///
+    /// Assuming no errors, returns `Ok(true)` if this resulted in any
+    /// modifications, and `Ok(false)` otherwise.
+    pub fn insert(
+        &mut self,
+        conflict: ConflictIndex,
+        set: &TokenSet,
+    ) -> Result<bool, OverlappingLookahead> {
+        for (value, index) in self.values.iter().zip((0..).map(ConflictIndex::new)) {
+            if index != conflict {
+                if value.is_intersecting(&set) {
+                    return Err(OverlappingLookahead);
+                }
+            }
+        }
+
+        Ok(self.values[conflict.index].union_with(&set))
+    }
+
+    pub fn apply<'grammar>(&self, state: &mut LR1State<'grammar>, actions: &Set<Action<'grammar>>) {
+        // create a map from each action to its lookahead
+        let lookaheads: Map<Action<'grammar>, &TokenSet> =
+            actions.iter().cloned().zip(&self.values).collect();
+
+        for &mut (ref mut lookahead, production) in &mut state.reductions {
+            let action = Action::Reduce(production);
+            *lookahead = lookaheads[&action].clone();
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/table/context_set/test.rs
@@ -0,0 +1,1 @@
+#![cfg(test)]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/table/mod.rs
@@ -0,0 +1,203 @@
+//! The "Lane Table". In the paper, this is depicted like so:
+//!
+//! ```
+//! +-------+----+-----+----+------------+
+//! + State | C1 | ... | Cn | Successors |
+//! +-------+----+-----+----+------------+
+//! ```
+//!
+//! where each row summarizes some state that potentially contributes
+//! lookahead to the conflict. The columns `Ci` represent each of the
+//! conflicts we are trying to disentangle; their values are each
+//! `TokenSet` indicating the lookahead contributing by this state.
+//! The Successors is a vector of further successors. For simplicity
+//! though we store this using maps, at least for now.
+
+use collections::{Map, Multimap, Set};
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::lookahead::*;
+use std::default::Default;
+use std::fmt::{Debug, Error, Formatter};
+use std::iter;
+
+pub mod context_set;
+use self::context_set::{ContextSet, OverlappingLookahead};
+
+#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub struct ConflictIndex {
+    index: usize,
+}
+
+impl ConflictIndex {
+    pub fn new(index: usize) -> ConflictIndex {
+        ConflictIndex { index: index }
+    }
+}
+
+pub struct LaneTable<'grammar> {
+    _grammar: &'grammar Grammar,
+    conflicts: usize,
+    lookaheads: Map<(StateIndex, ConflictIndex), TokenSet>,
+    successors: Multimap<StateIndex, Set<StateIndex>>,
+}
+
+impl<'grammar> LaneTable<'grammar> {
+    pub fn new(grammar: &'grammar Grammar, conflicts: usize) -> LaneTable {
+        LaneTable {
+            _grammar: grammar,
+            conflicts: conflicts,
+            lookaheads: Map::default(),
+            successors: Multimap::default(),
+        }
+    }
+
+    pub fn add_lookahead(&mut self, state: StateIndex, conflict: ConflictIndex, tokens: &TokenSet) {
+        self.lookaheads
+            .entry((state, conflict))
+            .or_insert_with(|| TokenSet::new())
+            .union_with(&tokens);
+    }
+
+    pub fn add_successor(&mut self, state: StateIndex, succ: StateIndex) {
+        self.successors.push(state, succ);
+    }
+
+    /// Unions together the lookaheads for each column and returns a
+    /// context set containing all of them. For an LALR(1) grammar,
+    /// these token sets will be mutually disjoint, as discussed in
+    /// the [README]; otherwise `Err` will be returned.
+    ///
+    /// [README]: ../README.md
+    pub fn columns(&self) -> Result<ContextSet, OverlappingLookahead> {
+        let mut columns = ContextSet::new(self.conflicts);
+        for (&(_, conflict_index), set) in &self.lookaheads {
+            columns.insert(conflict_index, set)?;
+        }
+        Ok(columns)
+    }
+
+    pub fn successors(&self, state: StateIndex) -> Option<&Set<StateIndex>> {
+        self.successors.get(&state)
+    }
+
+    /// Returns the state of states in the table that are **not**
+    /// reachable from another state in the table. These are called
+    /// "beachhead states".
+    pub fn beachhead_states(&self) -> Set<StateIndex> {
+        // set of all states that are reachable from another state
+        let reachable: Set<StateIndex> = self.successors
+            .iter()
+            .flat_map(|(_pred, succ)| succ)
+            .cloned()
+            .collect();
+
+        self.lookaheads
+            .keys()
+            .map(|&(state_index, _)| state_index)
+            .filter(|s| !reachable.contains(s))
+            .collect()
+    }
+
+    pub fn context_set(&self, state: StateIndex) -> Result<ContextSet, OverlappingLookahead> {
+        let mut set = ContextSet::new(self.conflicts);
+        for (&(state_index, conflict_index), token_set) in &self.lookaheads {
+            if state_index == state {
+                set.insert(conflict_index, token_set)?;
+            }
+        }
+        Ok(set)
+    }
+
+    /// Returns a map containing all states that appear in the table,
+    /// along with the context set for each state (i.e., each row in
+    /// the table, basically). Returns Err if any state has a conflict
+    /// between the context sets even within its own row.
+    pub fn rows(&self) -> Result<Map<StateIndex, ContextSet>, StateIndex> {
+        let mut map = Map::new();
+        for (&(state_index, conflict_index), token_set) in &self.lookaheads {
+            debug!(
+                "rows: inserting state_index={:?} conflict_index={:?} token_set={:?}",
+                state_index, conflict_index, token_set
+            );
+            match {
+                map.entry(state_index)
+                    .or_insert_with(|| ContextSet::new(self.conflicts))
+                    .insert(conflict_index, token_set)
+            } {
+                Ok(_changed) => {}
+                Err(OverlappingLookahead) => {
+                    debug!("rows: intra-row conflict inserting state_index={:?} conflict_index={:?} token_set={:?}",
+                           state_index, conflict_index, token_set);
+                    return Err(state_index);
+                }
+            }
+        }
+
+        // In some cases, there are states that have no context at
+        // all, only successors. In that case, make sure to add an
+        // empty row for them.
+        for (&state_index, _) in &self.successors {
+            map.entry(state_index)
+                .or_insert_with(|| ContextSet::new(self.conflicts));
+        }
+
+        Ok(map)
+    }
+}
+
+impl<'grammar> Debug for LaneTable<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let indices: Set<StateIndex> = self.lookaheads
+            .keys()
+            .map(|&(state, _)| state)
+            .chain(self.successors.iter().map(|(key, _)| key.clone()))
+            .collect();
+
+        let header = iter::once(format!("State"))
+            .chain((0..self.conflicts).map(|i| format!("C{}", i)))
+            .chain(Some(format!("Successors")))
+            .collect();
+
+        let rows = indices.iter().map(|&index| {
+            iter::once(format!("{:?}", index))
+                .chain((0..self.conflicts).map(|i| {
+                    self.lookaheads
+                        .get(&(index, ConflictIndex::new(i)))
+                        .map(|token_set| format!("{:?}", token_set))
+                        .unwrap_or(String::new())
+                }))
+                .chain(Some(
+                    self.successors
+                        .get(&index)
+                        .map(|c| format!("{:?}", c))
+                        .unwrap_or(String::new()),
+                ))
+                .collect()
+        });
+
+        let table: Vec<Vec<_>> = iter::once(header).chain(rows).collect();
+
+        let columns = 2 + self.conflicts;
+
+        let widths: Vec<_> = (0..columns)
+            .map(|c| {
+                // find the max width of any row at this column
+                table.iter().map(|r| r[c].len()).max().unwrap()
+            })
+            .collect();
+
+        for row in &table {
+            try!(write!(fmt, "| "));
+            for (i, column) in row.iter().enumerate() {
+                if i > 0 {
+                    try!(write!(fmt, " | "));
+                }
+                try!(write!(fmt, "{0:1$}", column, widths[i]));
+            }
+            try!(write!(fmt, " |\n"));
+        }
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lane_table/test.rs
@@ -0,0 +1,376 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use test_util::{expect_debug, normalized_grammar};
+use lr1::build;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::interpret;
+use lr1::state_graph::StateGraph;
+use lr1::tls::Lr1Tls;
+use tls::Tls;
+
+use super::construct::*;
+use super::lane::*;
+use super::table::*;
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+fn sym(t: &str) -> Symbol {
+    if t.chars().next().unwrap().is_uppercase() {
+        Symbol::Nonterminal(nt(t))
+    } else {
+        Symbol::Terminal(term(t))
+    }
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn traverse(states: &[LR0State], tokens: &[&str]) -> StateIndex {
+    interpret::interpret_partial(states, tokens.iter().map(|&s| term(s)))
+        .unwrap()
+        .pop()
+        .unwrap()
+}
+
+/// A simplified version of the paper's initial grammar; this version
+/// only has one inconsistent state (the same state they talk about in
+/// the paper).
+pub fn paper_example_g0() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    X "c",
+    Y "d",
+};
+
+X: () = {
+    "e" X,
+    "e",}
+;
+
+Y: () = {
+    "e" Y,
+    "e"
+};
+"#,
+    )
+}
+
+/// A (corrected) version of the sample grammar G1 from the paper. The
+/// grammar as written in the text omits some items, but the diagrams
+/// seem to contain the full set. I believe this is one of the
+/// smallest examples that still requires splitting states from the
+/// LR0 states.
+pub fn paper_example_g1() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    // if "a" is input, then lookahead "d" means "reduce X"
+    // and lookahead "c" means "reduce "Y"
+    "a" X "d",
+    "a" Y "c",
+
+    // if "b" is input, then lookahead "d" means "reduce Y"
+    // and lookahead "c" means "reduce X.
+    "b" X "c",
+    "b" Y "d",
+};
+
+X: () = {
+    "e" X,
+    "e",
+};
+
+Y: () = {
+    "e" Y,
+    "e"
+};
+"#,
+    )
+}
+
+fn build_table<'grammar>(
+    grammar: &'grammar Grammar,
+    goal: &str,
+    tokens: &[&str],
+) -> LaneTable<'grammar> {
+    let lr0_err = build::build_lr0_states(&grammar, nt(goal)).unwrap_err();
+
+    // Push the `tokens` to find the index of the inconsistent state
+    let inconsistent_state_index = traverse(&lr0_err.states, tokens);
+    assert!(
+        lr0_err
+            .conflicts
+            .iter()
+            .any(|c| c.state == inconsistent_state_index)
+    );
+    let inconsistent_state = &lr0_err.states[inconsistent_state_index.0];
+    println!("inconsistent_state={:#?}", inconsistent_state.items);
+
+    // Extract conflicting items and trace the lanes, constructing a table
+    let conflicting_items = super::conflicting_actions(inconsistent_state);
+    println!("conflicting_items={:#?}", conflicting_items);
+    let first_sets = FirstSets::new(&grammar);
+    let state_graph = StateGraph::new(&lr0_err.states);
+    let mut tracer = LaneTracer::new(
+        &grammar,
+        nt("G"),
+        &lr0_err.states,
+        &first_sets,
+        &state_graph,
+        conflicting_items.len(),
+    );
+    for (i, conflicting_item) in conflicting_items.iter().enumerate() {
+        tracer.start_trace(
+            inconsistent_state.index,
+            ConflictIndex::new(i),
+            conflicting_item.clone(),
+        );
+    }
+
+    tracer.into_table()
+}
+
+#[test]
+fn g0_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g0();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["e"]);
+    println!("{:#?}", table);
+    // conflicting_actions={
+    //     Shift("e") // C0
+    //     Reduce(X = "e" => ActionFn(4)) // C1
+    //     Reduce(Y = "e" => ActionFn(6)) // C2
+    // }
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2    | Successors |
+| S0    |       | ["c"] | ["d"] | {S3}       |
+| S3    | ["e"] | []    | []    | {S3}       |
+"#.trim_left(),
+    );
+}
+
+#[test]
+fn paper_example_g1_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["a", "e"]);
+    println!("{:#?}", table);
+    // conflicting_actions={
+    //     Shift("e") // C0
+    //     Reduce(X = "e" => ActionFn(6)) // C1
+    //     Reduce(Y = "e" => ActionFn(8)) // C2
+    // }
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2    | Successors |
+| S1    |       | ["d"] | ["c"] | {S5}       |
+| S2    |       | ["c"] | ["d"] | {S5}       |
+| S5    | ["e"] | []    | []    | {S5}       |
+"#.trim_left(),
+    );
+}
+
+#[test]
+fn paper_example_g0_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g0();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let lr0_err = build::build_lr0_states(&grammar, nt("G")).unwrap_err();
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    // we do not require more *states* than LR(0), just different lookahead
+    assert_eq!(states.len(), lr0_err.states.len());
+
+    let tree = interpret::interpret(&states, tokens!["e", "c"]).unwrap();
+    expect_debug(&tree, r#"[G: [X: "e"], "c"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["e", "e", "c"]).unwrap();
+    expect_debug(&tree, r#"[G: [X: "e", [X: "e"]], "c"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: [Y: "e", [Y: "e"]], "d"]"#);
+
+    interpret::interpret(&states, tokens!["e", "e", "e"]).unwrap_err();
+}
+
+#[test]
+fn paper_example_g1_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let lr0_err = build::build_lr0_states(&grammar, nt("G")).unwrap_err();
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    // we require more *states* than LR(0), not just different lookahead
+    assert_eq!(states.len() - lr0_err.states.len(), 1);
+
+    let tree = interpret::interpret(&states, tokens!["a", "e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: "a", [X: "e", [X: "e"]], "d"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["b", "e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: "b", [Y: "e", [Y: "e"]], "d"]"#);
+
+    interpret::interpret(&states, tokens!["e", "e", "e"]).unwrap_err();
+}
+
+pub fn paper_example_large() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    "x" W "a",
+    "x" V "t",
+    "y" W "b",
+    "y" V "t",
+    "z" W "r",
+    "z" V "b",
+    "u" U X "a",
+    "u" U Y "r",
+};
+
+W: () = {
+    U X C
+};
+
+V: () = {
+    U Y "d"
+};
+
+X: () = {
+    "k" "t" U X P,
+    "k" "t"
+};
+
+Y: () = {
+    "k" "t" U Y "u",
+    "k" "t"
+};
+
+U: () = {
+    U "k" "t",
+    "s"
+};
+
+E: () = {
+    "a",
+    "b",
+    "c",
+    "v",
+};
+
+C: () = {
+    "c",
+    "w"
+};
+
+P: () = {
+    "z"
+};
+"#,
+    )
+}
+
+#[test]
+fn large_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_large();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["x", "s", "k", "t"]);
+    println!("{:#?}", table);
+
+    // conflicting_actions={
+    //     Shift("s") // C0
+    //     Reduce(U = U "k" "t") // C1
+    //     Reduce(X = "k" "t") // C2
+    //     Reduce(Y = "k" "t") // C3
+    // }
+
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2         | C3    | Successors |
+| S1    |       | ["k"] |            |       | {S5}       |
+| S2    |       | ["k"] |            |       | {S7}       |
+| S3    |       | ["k"] |            |       | {S7}       |
+| S4    |       | ["k"] |            |       | {S7}       |
+| S5    |       |       | ["a"]      | ["r"] | {S16}      |
+| S7    |       |       | ["c", "w"] | ["d"] | {S16}      |
+| S16   |       |       |            |       | {S27}      |
+| S27   | ["s"] | ["k"] |            |       | {S32}      |
+| S32   |       |       | ["z"]      | ["u"] | {S16}      |
+"#.trim_left(),
+    );
+
+    // ^^ This differs in some particulars from what appears in the
+    // paper, but I believe it to be correct, and the paper to be wrong.
+    //
+    // Here is the table using the state names from the paper. I've
+    // marked the differences with `(*)`. Note that the paper does not
+    // include the C0 column (the shift).
+    //
+    // | State | pi1   | pi2   | pi3        | Successors |
+    // | B     | ["k"] |       | *1         | {G}        |
+    // | C     | ["k"] |       | *1         | {G}        |
+    // | D     | ["k"] |       | *1         | {G}        |
+    // | E     | ["k"] |       |            | {F}        |
+    // | F     |       | ["r"] | ["a"]      | {H}        |
+    // | G     |       | ["d"] | ["c", "w"] | {H}        |
+    // | H     |       |       |            | {I}        |
+    // | I     | ["k"] |       |            | {J}        |
+    // | J     |       | ["u"] | ["z"] *2   | {H}        |
+    //
+    // *1 - the paper lists "a", "b", and "r" here as lookaheads.  We
+    // do not. This is because when we trace back pi3, we never reach
+    // those states, as we have already acquired the necessary token
+    // of context earlier. I can imagine a distinct lane tracing
+    // algorithm that considers *sets* of conflicts and only
+    // terminates when all sets have context, but it's much more
+    // complex to implement, and seems to add little value.
+    //
+    // *2 - the paper does not list this context, and yet it seems to
+    // present. If you trace back "t" and "k" you reach state J which
+    // has the item "X = k t (*)". This "unepsilons" to "X = k t U (*)
+    // X P", and the lookahead from the "X" here is FIRST(P) which is
+    // "z".
+}
+
+#[test]
+fn paper_example_large_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_large();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    let tree = interpret::interpret(&states, tokens!["y", "s", "k", "t", "c", "b"]).unwrap();
+    expect_debug(
+        &tree,
+        r#"[G: "y", [W: [U: "s"], [X: "k", "t"], [C: "c"]], "b"]"#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/lookahead.rs
@@ -0,0 +1,299 @@
+use bit_set::{self, BitSet};
+use collections::Collection;
+use lr1::core::*;
+use lr1::tls::Lr1Tls;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::Hash;
+use grammar::repr::*;
+
+pub trait Lookahead: Clone + Debug + Eq + Ord + Hash + Collection<Item = Self> {
+    fn fmt_as_item_suffix(&self, fmt: &mut Formatter) -> Result<(), Error>;
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>>;
+}
+
+#[derive(Copy, Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Nil;
+
+impl Collection for Nil {
+    type Item = Nil;
+
+    fn push(&mut self, _: Nil) -> bool {
+        false
+    }
+}
+
+impl Lookahead for Nil {
+    fn fmt_as_item_suffix(&self, _fmt: &mut Formatter) -> Result<(), Error> {
+        Ok(())
+    }
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>> {
+        let index = this_state.index;
+
+        let mut conflicts = vec![];
+
+        for (terminal, &next_state) in &this_state.shifts {
+            conflicts.extend(
+                this_state
+                    .reductions
+                    .iter()
+                    .map(|&(_, production)| Conflict {
+                        state: index,
+                        lookahead: Nil,
+                        production: production,
+                        action: Action::Shift(terminal.clone(), next_state),
+                    }),
+            );
+        }
+
+        if this_state.reductions.len() > 1 {
+            for &(_, production) in &this_state.reductions[1..] {
+                let other_production = this_state.reductions[0].1;
+                conflicts.push(Conflict {
+                    state: index,
+                    lookahead: Nil,
+                    production: production,
+                    action: Action::Reduce(other_production),
+                });
+            }
+        }
+
+        conflicts
+    }
+}
+
+/// I have semi-arbitrarily decided to use the term "token" to mean
+/// either one of the terminals of our language, or else the
+/// pseudo-symbol EOF that represents "end of input".
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Token {
+    EOF,
+    Error,
+    Terminal(TerminalString),
+}
+
+impl Lookahead for TokenSet {
+    fn fmt_as_item_suffix(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, " {:?}", self)
+    }
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>> {
+        let mut conflicts = vec![];
+
+        for (terminal, &next_state) in &this_state.shifts {
+            let token = Token::Terminal(terminal.clone());
+            let inconsistent = this_state.reductions.iter().filter_map(
+                |&(ref reduce_tokens, production)| {
+                    if reduce_tokens.contains(&token) {
+                        Some(production)
+                    } else {
+                        None
+                    }
+                },
+            );
+            let set = TokenSet::from(token.clone());
+            for production in inconsistent {
+                conflicts.push(Conflict {
+                    state: this_state.index,
+                    lookahead: set.clone(),
+                    production: production,
+                    action: Action::Shift(terminal.clone(), next_state),
+                });
+            }
+        }
+
+        let len = this_state.reductions.len();
+        for i in 0..len {
+            for j in i + 1..len {
+                let &(ref i_tokens, i_production) = &this_state.reductions[i];
+                let &(ref j_tokens, j_production) = &this_state.reductions[j];
+
+                if i_tokens.is_disjoint(j_tokens) {
+                    continue;
+                }
+
+                conflicts.push(Conflict {
+                    state: this_state.index,
+                    lookahead: i_tokens.intersection(j_tokens),
+                    production: i_production,
+                    action: Action::Reduce(j_production),
+                });
+            }
+        }
+
+        conflicts
+    }
+}
+
+impl Token {
+    pub fn unwrap_terminal(&self) -> &TerminalString {
+        match *self {
+            Token::Terminal(ref t) => t,
+            Token::EOF | Token::Error => {
+                panic!("`unwrap_terminal()` invoked but with EOF or Error")
+            }
+        }
+    }
+}
+
+#[derive(Clone, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct TokenSet {
+    bit_set: BitSet<u32>,
+}
+
+fn with<OP, RET>(op: OP) -> RET
+where
+    OP: FnOnce(&TerminalSet) -> RET,
+{
+    Lr1Tls::with(op)
+}
+
+impl TokenSet {
+    pub fn new() -> Self {
+        with(|terminals| TokenSet {
+            bit_set: BitSet::with_capacity(terminals.all.len() + 2),
+        })
+    }
+
+    /// A TokenSet containing all possible terminals + EOF.
+    pub fn all() -> Self {
+        let mut s = TokenSet::new();
+        with(|terminals| {
+            for i in 0..terminals.all.len() {
+                s.bit_set.insert(i);
+            }
+            s.insert_eof();
+        });
+        s
+    }
+
+    pub fn eof() -> Self {
+        let mut set = TokenSet::new();
+        set.insert_eof();
+        set
+    }
+
+    fn eof_bit(&self) -> usize {
+        with(|terminals| terminals.all.len())
+    }
+
+    fn bit(&self, lookahead: &Token) -> usize {
+        match *lookahead {
+            Token::EOF => self.eof_bit(),
+            Token::Error => self.eof_bit() + 1,
+            Token::Terminal(ref t) => with(|terminals| terminals.bits[t]),
+        }
+    }
+
+    pub fn len(&self) -> usize {
+        self.bit_set.len()
+    }
+
+    pub fn insert(&mut self, lookahead: Token) -> bool {
+        let bit = self.bit(&lookahead);
+        self.bit_set.insert(bit)
+    }
+
+    pub fn insert_eof(&mut self) -> bool {
+        let bit = self.eof_bit();
+        self.bit_set.insert(bit)
+    }
+
+    pub fn union_with(&mut self, set: &TokenSet) -> bool {
+        let len = self.len();
+        self.bit_set.union_with(&set.bit_set);
+        self.len() != len
+    }
+
+    pub fn intersection(&self, set: &TokenSet) -> TokenSet {
+        let mut bit_set = self.bit_set.clone();
+        bit_set.intersect_with(&set.bit_set);
+        TokenSet { bit_set: bit_set }
+    }
+
+    pub fn contains(&self, token: &Token) -> bool {
+        self.bit_set.contains(self.bit(token))
+    }
+
+    pub fn contains_eof(&self) -> bool {
+        self.bit_set.contains(self.eof_bit())
+    }
+
+    /// If this set contains EOF, removes it from the set and returns
+    /// true. Otherwise, returns false.
+    pub fn take_eof(&mut self) -> bool {
+        let eof_bit = self.eof_bit();
+        let contains_eof = self.bit_set.contains(eof_bit);
+        self.bit_set.remove(eof_bit);
+        contains_eof
+    }
+
+    pub fn is_disjoint(&self, other: &TokenSet) -> bool {
+        self.bit_set.is_disjoint(&other.bit_set)
+    }
+
+    pub fn is_intersecting(&self, other: &TokenSet) -> bool {
+        !self.is_disjoint(other)
+    }
+
+    pub fn iter<'iter>(&'iter self) -> TokenSetIter<'iter> {
+        TokenSetIter {
+            bit_set: self.bit_set.iter(),
+        }
+    }
+}
+
+pub struct TokenSetIter<'iter> {
+    bit_set: bit_set::Iter<'iter, u32>,
+}
+
+impl<'iter> Iterator for TokenSetIter<'iter> {
+    type Item = Token;
+
+    fn next(&mut self) -> Option<Token> {
+        self.bit_set.next().map(|bit| {
+            with(|terminals| {
+                if bit == terminals.all.len() + 1 {
+                    Token::Error
+                } else if bit == terminals.all.len() {
+                    Token::EOF
+                } else {
+                    Token::Terminal(terminals.all[bit].clone())
+                }
+            })
+        })
+    }
+}
+
+impl<'debug> Debug for TokenSet {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let terminals: Vec<_> = self.iter().collect();
+        Debug::fmt(&terminals, fmt)
+    }
+}
+
+impl<'iter> IntoIterator for &'iter TokenSet {
+    type IntoIter = TokenSetIter<'iter>;
+    type Item = Token;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
+    }
+}
+
+impl Collection for TokenSet {
+    type Item = TokenSet;
+
+    fn push(&mut self, item: TokenSet) -> bool {
+        self.union_with(&item)
+    }
+}
+
+impl From<Token> for TokenSet {
+    fn from(token: Token) -> Self {
+        let mut set = TokenSet::new();
+        set.insert(token);
+        set
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/mod.rs
@@ -0,0 +1,43 @@
+//! Naive LR(1) generation algorithm.
+
+use grammar::repr::*;
+
+pub mod codegen;
+mod build;
+mod build_lalr;
+mod core;
+mod error;
+mod example;
+mod first;
+mod lane_table;
+mod lookahead;
+mod state_graph;
+mod tls;
+mod trace;
+mod report;
+use std::io::{self, Write};
+
+#[cfg(test)]
+mod interpret;
+
+pub use self::core::{LR1Result, LR1TableConstructionError};
+pub use self::error::report_error;
+pub use self::tls::Lr1Tls;
+
+pub fn build_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    if !grammar.algorithm.lalr {
+        build::build_lr1_states(grammar, start)
+    } else {
+        build_lalr::build_lalr_states(grammar, start)
+    }
+}
+
+pub fn generate_report<'grammar, W: Write + 'grammar>(
+    out: &'grammar mut W,
+    lr1result: &LR1Result<'grammar>,
+) -> io::Result<()> {
+    report::generate_report(out, lr1result)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/report/mod.rs
@@ -0,0 +1,446 @@
+use grammar::repr::*;
+use lr1::core::*;
+use std::io::{self, Write};
+use std::cmp::max;
+use collections::*;
+
+use super::lookahead::*;
+
+pub fn generate_report<'grammar, W: Write + 'grammar>(
+    out: &'grammar mut W,
+    lr1result: &LR1Result<'grammar>,
+) -> io::Result<()> {
+    let mut generator = ReportGenerator::new(out);
+    generator.report_lr_table_construction(lr1result)
+}
+
+static INDENT_STRING: &'static str = "    ";
+
+struct ReportGenerator<'report, W>
+where
+    W: Write + 'report,
+{
+    pub out: &'report mut W,
+}
+
+type ConflictStateMap<'report, 'grammar, L> = Map<StateIndex, Vec<&'report Conflict<'grammar, L>>>;
+
+impl<'report, W> ReportGenerator<'report, W>
+where
+    W: Write + 'report,
+{
+    pub fn new(out: &'report mut W) -> Self {
+        ReportGenerator { out: out }
+    }
+
+    pub fn report_lr_table_construction<'grammar: 'report, L>(
+        &mut self,
+        lr1result: &'report LRResult<'grammar, L>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(self.write_header());
+        try!(self.write_section_header("Summary"));
+        try!(writeln!(self.out, ""));
+        match lr1result {
+            &Ok(ref states) => {
+                try!(writeln!(self.out, "Constructed {} states", states.len()));
+                try!(self.report_states(&states, &Map::new()));
+            }
+            &Err(ref table_construction_error) => {
+                try!(writeln!(self.out, "Failure"));
+                try!(writeln!(
+                    self.out,
+                    "Constructed {} states",
+                    table_construction_error.states.len()
+                ));
+                try!(writeln!(
+                    self.out,
+                    "Has {} conflicts",
+                    table_construction_error.conflicts.len()
+                ));
+                let (sr, rr, conflict_map) =
+                    self.process_conflicts(&table_construction_error.conflicts);
+                if (sr > 0) {
+                    try!(writeln!(self.out, "{}shift/reduce:  {}", INDENT_STRING, sr));
+                }
+                if (rr > 0) {
+                    try!(writeln!(self.out, "{}reduce/reduce: {}", INDENT_STRING, rr));
+                }
+                try!(write!(self.out, "States with conflicts: "));
+                for state in conflict_map.keys() {
+                    try!(write!(self.out, " {}", state));
+                }
+                try!(writeln!(self.out, ""));
+                try!(self.report_states(&table_construction_error.states, &conflict_map));
+            }
+        };
+        Ok(())
+    }
+
+    fn process_conflicts<'grammar, L>(
+        &mut self,
+        conflicts: &'report Vec<Conflict<'grammar, L>>,
+    ) -> (usize, usize, ConflictStateMap<'report, 'grammar, L>)
+    where
+        L: Lookahead,
+    {
+        let mut sr: usize = 0;
+        let mut rr: usize = 0;
+        let mut conflict_map = Map::new();
+        for conflict in conflicts.iter() {
+            match conflict.action {
+                Action::Shift(_, _) => sr = sr + 1,
+                Action::Reduce(_) => rr = rr + 1,
+            }
+            conflict_map
+                .entry(conflict.state)
+                .or_insert(vec![])
+                .push(conflict);
+        }
+        (sr, rr, conflict_map)
+    }
+
+    fn report_states<'grammar, L>(
+        &mut self,
+        states: &Vec<State<'grammar, L>>,
+        conflict_map: &ConflictStateMap<'report, 'grammar, L>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(self.write_section_header("State Table"));
+        for ref state in states {
+            try!(writeln!(self.out, ""));
+            try!(self.report_state(&state, conflict_map.get(&state.index)));
+        }
+        Ok(())
+    }
+
+    fn report_state<'grammar, L>(
+        &mut self,
+        state: &State<'grammar, L>,
+        conflicts_opt: Option<&Vec<&'report Conflict<'grammar, L>>>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(writeln!(self.out, "State {} {{", state.index));
+        try!(self.write_items(&state.items));
+        if (state.reductions.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_reductions(&state.reductions));
+        }
+
+        let max_width = get_width_for_gotos(state);
+
+        if (!state.shifts.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_shifts(&state.shifts, max_width));
+        }
+
+        if (!state.gotos.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_gotos(&state.gotos, max_width));
+        }
+
+        if let Some(conflicts) = conflicts_opt {
+            for conflict in conflicts.iter() {
+                try!(self.write_conflict(conflict));
+            }
+        }
+
+        try!(writeln!(self.out, "}}"));
+        Ok(())
+    }
+
+    fn write_conflict<'grammar, L>(&mut self, conflict: &Conflict<'grammar, L>) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(writeln!(self.out, ""));
+        match conflict.action {
+            Action::Shift(ref terminal, state) => {
+                let max_width = max(
+                    terminal.display_len(),
+                    conflict.production.nonterminal.len(),
+                );
+                try!(writeln!(self.out, "{}shift/reduce conflict", INDENT_STRING));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(conflict.production, max_width));
+                let sterminal = format!("{}", terminal);
+                try!(writeln!(
+                    self.out,
+                    "{}{}shift     {:width$}    shift and goto {}",
+                    INDENT_STRING,
+                    INDENT_STRING,
+                    sterminal,
+                    state,
+                    width = max_width
+                ));
+            }
+            Action::Reduce(other_production) => {
+                let max_width = max(
+                    other_production.nonterminal.len(),
+                    conflict.production.nonterminal.len(),
+                );
+                try!(writeln!(
+                    self.out,
+                    "{}reduce/reduce conflict",
+                    INDENT_STRING
+                ));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(conflict.production, max_width));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(other_production, max_width));
+            }
+        }
+        try!(self.write_lookahead(&conflict.lookahead));
+        Ok(())
+    }
+
+    fn write_items<'grammar, L>(&mut self, items: &Items<'grammar, L>) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let max_width = get_max_length(items.vec.iter().map(|item| &item.production.nonterminal));
+
+        for item in items.vec.iter() {
+            try!(writeln!(self.out, ""));
+            try!(self.write_item(item, max_width));
+        }
+        Ok(())
+    }
+
+    fn write_item<'grammar, L>(
+        &mut self,
+        item: &Item<'grammar, L>,
+        max_width: usize,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(write!(self.out, "{}", INDENT_STRING));
+        // stringize it first to allow handle :width by Display for string
+        let s = format!("{}", item.production.nonterminal);
+        try!(write!(self.out, "{:width$} ->", s, width = max_width));
+        for i in 0..item.index {
+            try!(write!(self.out, " {}", item.production.symbols[i]));
+        }
+        try!(write!(self.out, " ."));
+        for i in item.index..item.production.symbols.len() {
+            try!(write!(self.out, " {}", item.production.symbols[i]));
+        }
+        try!(writeln!(self.out, ""));
+        try!(self.write_lookahead(&item.lookahead));
+        Ok(())
+    }
+
+    fn write_shifts(
+        &mut self,
+        shifts: &Map<TerminalString, StateIndex>,
+        max_width: usize,
+    ) -> io::Result<()> {
+        for entry in shifts {
+            try!(write!(self.out, "{}", INDENT_STRING));
+            // stringize it first to allow handle :width by Display for string
+            let s = format!("{}", entry.0);
+            try!(writeln!(
+                self.out,
+                "{:width$} shift and goto {}",
+                s,
+                entry.1,
+                width = max_width
+            ));
+        }
+        Ok(())
+    }
+
+    fn write_reductions<'grammar, L>(
+        &mut self,
+        reductions: &Vec<(L, &'grammar Production)>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let max_width = get_max_length(reductions.into_iter().map(|p| &p.1.nonterminal));
+        for reduction in reductions.iter() {
+            try!(writeln!(self.out, ""));
+            try!(self.write_reduction(reduction, max_width));
+        }
+        Ok(())
+    }
+
+    fn write_production<'grammar>(
+        &mut self,
+        production: &'grammar Production,
+        max_width: usize,
+    ) -> io::Result<()> {
+        try!(write!(
+            self.out,
+            "{:width$} ->",
+            production.nonterminal,
+            width = max_width
+        ));
+        for symbol in production.symbols.iter() {
+            try!(write!(self.out, " {}", symbol));
+        }
+        try!(writeln!(self.out, ""));
+        Ok(())
+    }
+
+    fn write_reduction<'grammar, L>(
+        &mut self,
+        reduction: &(L, &'grammar Production),
+        max_width: usize,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let ref production = reduction.1;
+        try!(write!(self.out, "{}reduction ", INDENT_STRING));
+        try!(self.write_production(production, max_width));
+        try!(self.write_lookahead(&reduction.0));
+        Ok(())
+    }
+
+    fn write_lookahead<L>(&mut self, lookahead: &L) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        if (lookahead.has_anything_to_print()) {
+            try!(write!(
+                self.out,
+                "{}{}lookahead",
+                INDENT_STRING, INDENT_STRING
+            ));
+            try!(lookahead.print(self.out));
+            try!(writeln!(self.out, ""));
+        }
+        Ok(())
+    }
+
+    fn write_gotos(
+        &mut self,
+        gotos: &Map<NonterminalString, StateIndex>,
+        max_width: usize,
+    ) -> io::Result<()> {
+        for entry in gotos {
+            try!(write!(self.out, "{}", INDENT_STRING));
+            // stringize it first to allow handle :width by Display for string
+            let s = format!("{}", entry.0);
+            try!(writeln!(
+                self.out,
+                "{:width$} goto {}",
+                s,
+                entry.1,
+                width = max_width
+            ));
+        }
+        Ok(())
+    }
+
+    fn write_section_header(&mut self, title: &str) -> io::Result<()> {
+        try!(writeln!(self.out, "\n{}", title));
+        try!(writeln!(
+            self.out,
+            "----------------------------------------"
+        ));
+        Ok(())
+    }
+
+    fn write_header(&mut self) -> io::Result<()> {
+        try!(writeln!(self.out, "Lalrpop Report File"));
+        try!(writeln!(
+            self.out,
+            "========================================"
+        ));
+        Ok(())
+    }
+}
+
+// helpers
+
+trait LookaheadPrinter<W>
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, out: &'report mut W) -> io::Result<()>;
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool;
+}
+
+impl<W> LookaheadPrinter<W> for Nil
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, _: &'report mut W) -> io::Result<()> {
+        Ok(())
+    }
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool {
+        false
+    }
+}
+
+impl<W> LookaheadPrinter<W> for TokenSet
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, out: &'report mut W) -> io::Result<()> {
+        for i in self.iter() {
+            try!(write!(out, " {}", i))
+        }
+        Ok(())
+    }
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool {
+        self.len() > 0
+    }
+}
+
+trait HasDisplayLen {
+    fn display_len(&self) -> usize;
+}
+
+impl<'a> HasDisplayLen for &'a TerminalString {
+    fn display_len(&self) -> usize {
+        TerminalString::display_len(self)
+    }
+}
+
+impl<'a> HasDisplayLen for &'a NonterminalString {
+    fn display_len(&self) -> usize {
+        self.len()
+    }
+}
+
+fn get_max_length<I>(m: I) -> usize
+where
+    I: Iterator,
+    I::Item: HasDisplayLen,
+{
+    m.map(|k| k.display_len()).fold(0, |acc, x| max(acc, x))
+}
+
+fn get_width_for_gotos<'grammar, L>(state: &State<'grammar, L>) -> usize
+where
+    L: Lookahead,
+{
+    let shifts_max_width = get_max_length(state.shifts.keys());
+    let gotos_max_width = get_max_length(state.gotos.keys());
+    max(shifts_max_width, gotos_max_width)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/state_graph.rs
@@ -0,0 +1,94 @@
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::lookahead::Lookahead;
+use petgraph::{EdgeDirection, Graph};
+use petgraph::graph::NodeIndex;
+use petgraph::prelude::*;
+
+// Each state `s` corresponds to the node in the graph with index
+// `s`. The edges are the shift transitions.
+pub struct StateGraph {
+    graph: Graph<(), Symbol>,
+}
+
+impl StateGraph {
+    pub fn new<'grammar, L>(states: &[State<'grammar, L>]) -> StateGraph
+    where
+        L: Lookahead,
+    {
+        let mut graph = Graph::new();
+
+        // First, create the nodes.
+        for i in 0..states.len() {
+            let j = graph.add_node(());
+            assert_eq!(i, j.index());
+        }
+
+        // Add in the edges.
+        for (i, state) in states.iter().enumerate() {
+            // Successors of a node arise from:
+            // - shifts (found in the `conflicts` and `tokens` maps)
+            // - gotos (found in the `gotos` map)
+            graph.extend_with_edges(
+                state
+                    .shifts
+                    .iter()
+                    .map(|(terminal, &state)| (Symbol::Terminal(terminal.clone()), state))
+                    .chain(
+                        state
+                            .gotos
+                            .iter()
+                            .map(|(nt, &state)| (Symbol::Nonterminal(nt.clone()), state)),
+                    )
+                    .map(|(symbol, successor)| {
+                        (NodeIndex::new(i), NodeIndex::new(successor.0), symbol)
+                    }),
+            );
+        }
+
+        StateGraph { graph: graph }
+    }
+
+    /// Given a list of symbols `[X, Y, Z]`, traces back from
+    /// `initial_state_index` to find the set of states whence we
+    /// could have arrived at `initial_state_index` after pushing `X`,
+    /// `Y`, and `Z`.
+    pub fn trace_back(
+        &self,
+        initial_state_index: StateIndex,
+        initial_symbols: &[Symbol],
+    ) -> Vec<StateIndex> {
+        let mut stack = vec![(initial_state_index, initial_symbols)];
+        let mut result = vec![];
+        while let Some((state_index, symbols)) = stack.pop() {
+            if let Some((head, tail)) = symbols.split_last() {
+                stack.extend(
+                    self.graph
+                        .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Incoming)
+                        .filter(|edge| edge.weight() == head)
+                        .map(|edge| (StateIndex(edge.source().index()), tail)),
+                );
+            } else {
+                result.push(state_index);
+            }
+        }
+        result.sort();
+        result.dedup();
+        result
+    }
+
+    pub fn successors(&self, state_index: StateIndex) -> Vec<StateIndex> {
+        self.graph
+            .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Outgoing)
+            .map(|edge| StateIndex(edge.target().index()))
+            .collect()
+    }
+
+    pub fn predecessors(&self, state_index: StateIndex, symbol: Symbol) -> Vec<StateIndex> {
+        self.graph
+            .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Incoming)
+            .filter(|edge| *edge.weight() == symbol)
+            .map(|edge| StateIndex(edge.source().index()))
+            .collect()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/tls.rs
@@ -0,0 +1,40 @@
+//! Thread-local data specific to LR(1) processing.
+
+use grammar::repr::TerminalSet;
+use std::cell::RefCell;
+use std::mem;
+use std::sync::Arc;
+
+thread_local! {
+    static TERMINALS: RefCell<Option<Arc<TerminalSet>>> = RefCell::new(None)
+}
+
+pub struct Lr1Tls {
+    old_value: Option<Arc<TerminalSet>>,
+}
+
+impl Lr1Tls {
+    pub fn install(terminals: TerminalSet) -> Lr1Tls {
+        let old_value = TERMINALS.with(|s| {
+            let mut s = s.borrow_mut();
+            mem::replace(&mut *s, Some(Arc::new(terminals)))
+        });
+
+        Lr1Tls {
+            old_value: old_value,
+        }
+    }
+
+    pub fn with<OP, RET>(op: OP) -> RET
+    where
+        OP: FnOnce(&TerminalSet) -> RET,
+    {
+        TERMINALS.with(|s| op(s.borrow().as_ref().expect("LR1 TLS not installed")))
+    }
+}
+
+impl Drop for Lr1Tls {
+    fn drop(&mut self) {
+        TERMINALS.with(|s| *s.borrow_mut() = self.old_value.take());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/mod.rs
@@ -0,0 +1,31 @@
+use collections::{set, Set};
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::state_graph::StateGraph;
+use grammar::repr::*;
+
+mod reduce;
+mod shift;
+mod trace_graph;
+
+pub struct Tracer<'trace, 'grammar: 'trace> {
+    states: &'trace [LR1State<'grammar>],
+    first_sets: &'trace FirstSets,
+    state_graph: StateGraph,
+    trace_graph: TraceGraph<'grammar>,
+    visited_set: Set<(StateIndex, NonterminalString)>,
+}
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn new(first_sets: &'trace FirstSets, states: &'trace [LR1State<'grammar>]) -> Self {
+        Tracer {
+            states: states,
+            first_sets: first_sets,
+            state_graph: StateGraph::new(states),
+            trace_graph: TraceGraph::new(),
+            visited_set: set(),
+        }
+    }
+}
+
+pub use self::trace_graph::TraceGraph;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/reduce/mod.rs
@@ -0,0 +1,111 @@
+use lr1::core::*;
+use grammar::repr::*;
+
+use super::Tracer;
+use super::trace_graph::*;
+
+#[cfg(test)]
+mod test;
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn backtrace_reduce(
+        mut self,
+        item_state: StateIndex,
+        item: LR0Item<'grammar>,
+    ) -> TraceGraph<'grammar> {
+        self.trace_reduce_item(item_state, item);
+        self.trace_graph
+    }
+
+    fn trace_reduce_item(&mut self, item_state: StateIndex, item: LR0Item<'grammar>) {
+        // We start out with an item
+        //
+        //     X = ...p (*) ...s
+        //
+        // which we can (eventually) reduce, though we may have to do
+        // some epsilon reductions first if ...s is non-empty. We want
+        // to trace back until we have (at least) one element of
+        // context for the reduction.
+        let nonterminal = &item.production.nonterminal; // X
+
+        // Add an edge
+        //
+        //     [X] -{...p,_,...s}-> [X = ...p (*) ...s]
+        //
+        // because to reach that item we pushed `...p` from the start
+        // of `X` and afterwards we expect to see `...s`.
+        self.trace_graph
+            .add_edge(nonterminal.clone(), item, item.symbol_sets());
+
+        // Walk back to the set of states S where we had:
+        //
+        //     X = (*) ...p
+        let pred_states = self.state_graph.trace_back(item_state, item.prefix());
+
+        // Add in edges from [X] to all the places [X] can be consumed.
+        for pred_state in pred_states {
+            self.trace_reduce_from_state(pred_state, nonterminal);
+        }
+    }
+
+    // We know that we can reduce the nonterminal `Y`. We want to find
+    // at least one element of context, so we search back to find out
+    // who will consume that reduced value. So search for those items
+    // that can shift a `Y`:
+    //
+    //     Z = ... (*) Y ...s
+    //
+    // If we find that `...s` is potentially empty, then we haven't
+    // actually found any context, and so we may have to keep
+    // searching.
+    fn trace_reduce_from_state(&mut self, item_state: StateIndex, nonterminal: &NonterminalString)
+    // "Y"
+    {
+        if !self.visited_set.insert((item_state, nonterminal.clone())) {
+            return;
+        }
+        for pred_item in self.states[item_state.0]
+            .items
+            .vec
+            .iter()
+            .filter(|i| i.can_shift_nonterminal(nonterminal))
+        {
+            // Found a state:
+            //
+            //     Z = ...p (*) Y ...s
+            //
+            // If `...s` does not match `\epsilon`, then we are done,
+            // because `FIRST(...s)` will provide a token of context.
+            // But otherwise we have to keep searching backwards.
+
+            let symbol_sets = pred_item.symbol_sets();
+
+            let first_suffix = self.first_sets.first0(symbol_sets.suffix);
+            let continue_tracing = first_suffix.contains_eof();
+
+            if !continue_tracing {
+                // Add an edge
+                //
+                //    [Z = ...p (*) Y ...s] -(...p,Y,...s)-> [Y]
+                //
+                // and stop.
+                self.trace_graph
+                    .add_edge(pred_item.to_lr0(), nonterminal.clone(), symbol_sets);
+            } else {
+                // Add an edge
+                //
+                //    [Z] -{..p}-> [Y]
+                //
+                // because we can reduce by consuming `...p`
+                // tokens, and continue tracing.
+                self.trace_graph.add_edge(
+                    pred_item.production.nonterminal.clone(),
+                    nonterminal.clone(),
+                    symbol_sets,
+                );
+
+                self.trace_reduce_item(item_state, pred_item.to_lr0());
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/reduce/test.rs
@@ -0,0 +1,364 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::core::Item;
+use lr1::first::FirstSets;
+use lr1::interpret::interpret_partial;
+use lr1::lookahead::{Token, TokenSet};
+use lr1::tls::Lr1Tls;
+use test_util::{expect_debug, normalized_grammar};
+use tls::Tls;
+
+use super::super::Tracer;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+macro_rules! terms {
+    ($($t:expr),*) => {
+        vec![$(term($t)),*]
+    }
+}
+
+fn test_grammar1() -> Grammar {
+    normalized_grammar(
+        r#"
+    grammar;
+
+    pub Start: () = Stmt;
+
+    pub Stmt: () = {
+        Exprs ";",
+        Exprs
+    };
+
+    Exprs: () = {
+        Expr,
+        Exprs "," Expr
+    };
+
+    Expr: () = {
+        "Int",
+        Expr "+" "Int",
+    };
+"#,
+    )
+}
+
+#[test]
+fn backtrace1() {
+    let _tls = Tls::test();
+    let grammar = test_grammar1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let states = build_states(&grammar, nt("Start")).unwrap();
+    let tracer = Tracer::new(&first_sets, &states);
+    let state_stack = interpret_partial(&states, terms!["Int"]).unwrap();
+    let top_state = *state_stack.last().unwrap();
+
+    // Top state will have items like:
+    //
+    // Expr = "Int" (*) [EOF],
+    // Expr = "Int" (*) ["+"],
+    // Expr = "Int" (*) [","],
+    // Expr = "Int" (*) [";"]
+    //
+    // Select the ";" one.
+    let semi = Token::Terminal(term(";"));
+    let semi_item = states[top_state.0]
+        .items
+        .vec
+        .iter()
+        .filter(|item| item.lookahead.contains(&semi))
+        .next()
+        .unwrap();
+
+    let backtrace = tracer.backtrace_reduce(top_state, semi_item.to_lr0());
+
+    println!("{:#?}", backtrace);
+
+    let pictures: Vec<_> = backtrace
+        .lr0_examples(semi_item.to_lr0())
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(
+        &pictures,
+        r#"
+[
+    [
+        "  Exprs "," "Int"  ╷ ";"",
+        "  │         └─Expr─┤   │",
+        "  ├─Exprs──────────┘   │",
+        "  └─Stmt───────────────┘"
+    ],
+    [
+        "  Exprs "," "Int"  ╷ "," Expr",
+        "  │         └─Expr─┤        │",
+        "  ├─Exprs──────────┘        │",
+        "  └─Exprs───────────────────┘"
+    ],
+    [
+        "  "Int"   ╷ ";"",
+        "  ├─Expr──┤   │",
+        "  ├─Exprs─┘   │",
+        "  └─Stmt──────┘"
+    ],
+    [
+        "  "Int"   ╷ "," Expr",
+        "  ├─Expr──┤        │",
+        "  ├─Exprs─┘        │",
+        "  └─Exprs──────────┘"
+    ],
+    [
+        "  "Int"  ╷ "+" "Int"",
+        "  ├─Expr─┘         │",
+        "  └─Expr───────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn backtrace2() {
+    let _tls = Tls::test();
+    // This grammar yields a S/R conflict. Is it (int -> int) -> int
+    // or int -> (int -> int)?
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+    let item = Item {
+        production: conflict.production,
+        index: conflict.production.symbols.len(),
+        lookahead: conflict.lookahead.clone(),
+    };
+    println!("item={:?}", item);
+    let backtrace = tracer.backtrace_reduce(conflict.state, item.to_lr0());
+    println!("{:#?}", backtrace);
+    expect_debug(
+        &backtrace,
+        r#"
+[
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Item(Ty = Ty "->" (*) Ty)),
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty, "->", Ty], None, [])-> Item(Ty = Ty "->" Ty (*))),
+    (Item(Ty = (*) Ty "->" Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    // Check that we can successfully enumerate and paint the examples
+    // here.
+    let pictures: Vec<_> = backtrace
+        .lr1_examples(&first_sets, &item)
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(
+        &pictures,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  ├─Ty─────┘       │",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn reduce_backtrace_3_graph() {
+    // This grammar yields a S/R conflict. Is it `(int -> int) -> int`
+    // or `int -> (int -> int)`?
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+    let item = Item {
+        production: conflict.production,
+        index: conflict.production.symbols.len(),
+        lookahead: conflict.lookahead.clone(),
+    };
+    println!("item={:?}", item);
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let graph = tracer.backtrace_reduce(conflict.state, item.to_lr0());
+    expect_debug(
+        &graph,
+        r#"
+[
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Item(Ty = Ty "->" (*) Ty)),
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty, "->", Ty], None, [])-> Item(Ty = Ty "->" Ty (*))),
+    (Item(Ty = (*) Ty "->" Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    let list: Vec<_> = graph
+        .lr1_examples(&first_sets, &item)
+        .map(|example| example.paint_unstyled())
+        .collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  ├─Ty─────┘       │",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn backtrace_filter() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+
+    pub Start: () = Stmt;
+
+    pub Stmt: () = {
+        Exprs ";"
+    };
+
+    Exprs: () = {
+        Expr,
+        Exprs "," Expr
+    };
+
+    Expr: () = {
+        ExprAtom ExprSuffix
+    };
+
+    ExprSuffix: () = {
+        (),
+        "?",
+    };
+
+    ExprAtom: () = {
+        "Int",
+    };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let states = build_states(&grammar, nt("Start")).unwrap();
+    let first_sets = FirstSets::new(&grammar);
+    let tracer = Tracer::new(&first_sets, &states);
+    let state_stack = interpret_partial(&states, terms!["Int"]).unwrap();
+    let top_state = *state_stack.last().unwrap();
+
+    // Top state will have an item like:
+    //
+    // Expr = "Int" (*) [",", ";"],
+    let semi = Token::Terminal(term(";"));
+    let lr1_item = states[top_state.0]
+        .items
+        .vec
+        .iter()
+        .filter(|item| item.lookahead.contains(&semi))
+        .next()
+        .unwrap();
+
+    let backtrace = tracer.backtrace_reduce(top_state, lr1_item.to_lr0());
+
+    println!("{:#?}", backtrace);
+
+    // With no filtering, we get examples with both `;` and `,` as
+    // lookahead (though `ExprSuffix` is in the way).
+    let pictures: Vec<_> = backtrace
+        .lr0_examples(lr1_item.to_lr0())
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(&pictures, r#"
+[
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix ";"",
+        "  │         ├─ExprAtom─┘          │   │",
+        "  │         └─Expr────────────────┤   │",
+        "  ├─Exprs─────────────────────────┘   │",
+        "  └─Stmt──────────────────────────────┘"
+    ],
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix "," Expr",
+        "  │         ├─ExprAtom─┘          │        │",
+        "  │         └─Expr────────────────┤        │",
+        "  ├─Exprs─────────────────────────┘        │",
+        "  └─Exprs──────────────────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix ";"",
+        "  ├─ExprAtom─┘          │   │",
+        "  ├─Expr────────────────┤   │",
+        "  ├─Exprs───────────────┘   │",
+        "  └─Stmt────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix "," Expr",
+        "  ├─ExprAtom─┘          │        │",
+        "  ├─Expr────────────────┤        │",
+        "  ├─Exprs───────────────┘        │",
+        "  └─Exprs────────────────────────┘"
+    ]
+]
+"#.trim());
+
+    // Select those with `;` as lookahead
+    let semi_item = lr1_item.with_lookahead(TokenSet::from(semi));
+    let pictures: Vec<_> = backtrace
+        .lr1_examples(&first_sets, &semi_item)
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(&pictures, r#"
+[
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix ";"",
+        "  │         ├─ExprAtom─┘          │   │",
+        "  │         └─Expr────────────────┤   │",
+        "  ├─Exprs─────────────────────────┘   │",
+        "  └─Stmt──────────────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix ";"",
+        "  ├─ExprAtom─┘          │   │",
+        "  ├─Expr────────────────┤   │",
+        "  ├─Exprs───────────────┘   │",
+        "  └─Stmt────────────────────┘"
+    ]
+]
+"#.trim());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/shift/mod.rs
@@ -0,0 +1,101 @@
+use lr1::core::*;
+use grammar::repr::*;
+
+use super::Tracer;
+use super::trace_graph::*;
+
+#[cfg(test)]
+mod test;
+
+/// A backtrace explaining how a particular shift:
+///
+///    X = ...p (*) Token ...
+///
+/// came to be in the list of items for some state S. This backtrace
+/// always has a particular form. First, we can walk back over the
+/// prefix, which will bring us to some set of states S1 all of which
+/// contain the same item, but with the cursor at the front:
+///
+///    X = (*) ...p Token ...
+///
+/// Then we can walk back within those states some number of epsilon
+/// moves, traversing nonterminals of the form:
+///
+///    Y = (*) X ...s
+///
+/// (Note that each nonterminal `Y` may potentially have many
+/// productions of this form. I am not sure yet if they all matter or
+/// not.)
+///
+/// Finally, either we are in the start state, or else we reach some
+/// production of the form:
+///
+///    Z = ...p (*) Y ...s
+///
+/// Ultimately this "trace" is best represented as a DAG. The problem
+/// is that some of those nonterminals could, for example, be
+/// optional.
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn backtrace_shift(
+        mut self,
+        item_state: StateIndex,
+        item: LR0Item<'grammar>,
+    ) -> TraceGraph<'grammar> {
+        let symbol_sets = item.symbol_sets();
+
+        // The states `S`
+        let pred_states = self.state_graph.trace_back(item_state, symbol_sets.prefix);
+
+        // Add the edge `[X] -{...p,Token,...s}-> [X = ...p (*) Token ...s]`
+        self.trace_graph
+            .add_edge(item.production.nonterminal.clone(), item, symbol_sets);
+
+        for pred_state in pred_states {
+            self.trace_epsilon_edges(pred_state, &item.production.nonterminal);
+        }
+
+        self.trace_graph
+    }
+
+    // Because item.index is 0, we know we are at an index
+    // like:
+    //
+    //     Y = (*) ...
+    //
+    // This can only arise if `Y` is the start nonterminal
+    // or if there is an epsilon move from another item
+    // like:
+    //
+    //     Z = ...p (*) Y ...
+    //
+    // So search for items like Z.
+    fn trace_epsilon_edges(&mut self, item_state: StateIndex, nonterminal: &NonterminalString) // "Y"
+    {
+        if self.visited_set.insert((item_state, nonterminal.clone())) {
+            for pred_item in self.states[item_state.0].items.vec.iter() {
+                if pred_item.can_shift_nonterminal(nonterminal) {
+                    if pred_item.index > 0 {
+                        // Add an edge:
+                        //
+                        //     [Z = ...p (*) Y ...s] -(...p,Y,...s)-> [Y]
+                        self.trace_graph.add_edge(
+                            pred_item,
+                            nonterminal.clone(),
+                            pred_item.symbol_sets(),
+                        );
+                    } else {
+                        // Trace back any incoming edges to [Z = ...p (*) Y ...].
+                        let pred_nonterminal = &pred_item.production.nonterminal;
+                        self.trace_graph.add_edge(
+                            pred_nonterminal.clone(),
+                            nonterminal.clone(),
+                            pred_item.symbol_sets(),
+                        );
+                        self.trace_epsilon_edges(item_state, pred_nonterminal);
+                    }
+                }
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/shift/test.rs
@@ -0,0 +1,78 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::tls::Lr1Tls;
+use test_util::{expect_debug, normalized_grammar};
+use tls::Tls;
+
+use super::super::Tracer;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+#[test]
+fn shift_backtrace_1() {
+    // This grammar yields a S/R conflict. Is it `(int -> int) -> int`
+    // or `int -> (int -> int)`?
+
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+
+    // Gin up the LR0 item involved in the shift/reduce conflict:
+    //
+    //     Ty = Ty (*) -> Ty (shift)
+    //
+    // from the item that we can reduce:
+    //
+    //     Ty = Ty -> Ty (*) (reduce)
+
+    assert!(conflict.production.symbols.len() == 3);
+    let item = Item::lr0(conflict.production, 1);
+    println!("item={:?}", item);
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let graph = tracer.backtrace_shift(conflict.state, item);
+    expect_debug(
+        &graph,
+        r#"
+[
+    (Nonterminal(Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty], Some("->"), [Ty])-> Item(Ty = Ty (*) "->" Ty)),
+    (Item(Ty = Ty "->" (*) Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    let list: Vec<_> = graph
+        .lr0_examples(item)
+        .map(|example| example.paint_unstyled())
+        .collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  │       └─Ty─────┤",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/trace_graph/mod.rs
@@ -0,0 +1,452 @@
+use collections::{map, Map};
+use lr1::core::*;
+use lr1::first::*;
+use lr1::lookahead::*;
+use lr1::example::*;
+use grammar::repr::*;
+use petgraph::{Directed, EdgeDirection, Graph};
+use petgraph::graph::{EdgeReference, Edges, NodeIndex};
+use petgraph::prelude::*;
+use std::fmt::{Debug, Error, Formatter};
+
+#[cfg(test)]
+mod test;
+
+/// Trace graphs are used to summarize how it is that we came to be in
+/// a state where we can take some particular shift/reduce action; put
+/// another way, how it is that we came to be in a state with some
+/// particular LR(1) item.
+///
+/// The nodes in the graph are each labeled with a TraceGraphNode and
+/// hence take one of two forms:
+///
+/// - TraceGraphNode::Item -- represents an LR0 item. These nodes are
+///   used for the starting/end points in the graph only.  Basically a
+///   complete trace stretches from the start item to some end item,
+///   and all intermediate nodes are nonterminals.
+/// - TraceGraphNode::Nonterminal -- if this graph is for a shift,
+///   then these represent items where the cursor is at the beginning:
+///   `X = (*) ...`. If the graph is for a reduce, they represent
+///   items where a reduce is possible without shifting any more
+///   terminals (though further reductions may be needed): `X =
+///   ... (*) ...s` where `FIRST(...s)` includes `\epsilon`.
+///
+/// The edges in the graph are also important. They are labeled with
+/// `SymbolSets` instances, meaning that each carries a (prefix,
+/// cursor, and suffix) tuple. The label on an edge `A -> B` means
+/// that transitioning from a state containing `A` to a state
+/// containing `B` is possible if you:
+///
+/// - shift the symbols in `prefix`
+/// - `B` will produce the symbol in `cursor`
+/// - shift the symbols in `suffix` after `B` is popped
+pub struct TraceGraph<'grammar> {
+    // A -L-> B means:
+    //
+    //     Transition from a state containing A to a state containing
+    //     B by (pushing|popping) the symbols L.
+    //
+    // If this trace graph represents a shift backtrace, then the
+    // labels are symbols that are pushed. Otherwise they are labels
+    // that are popped.
+    graph: Graph<TraceGraphNode<'grammar>, SymbolSets<'grammar>>,
+    indices: Map<TraceGraphNode<'grammar>, NodeIndex>,
+}
+
+#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub enum TraceGraphNode<'grammar> {
+    Nonterminal(NonterminalString),
+    Item(LR0Item<'grammar>),
+}
+
+impl<'grammar> TraceGraph<'grammar> {
+    pub fn new() -> Self {
+        TraceGraph {
+            graph: Graph::new(),
+            indices: map(),
+        }
+    }
+
+    pub fn add_node<T>(&mut self, node: T) -> NodeIndex
+    where
+        T: Into<TraceGraphNode<'grammar>>,
+    {
+        let node = node.into();
+        let graph = &mut self.graph;
+        *self.indices
+            .entry(node.clone())
+            .or_insert_with(|| graph.add_node(node))
+    }
+
+    pub fn add_edge<F, T>(&mut self, from: F, to: T, labels: SymbolSets<'grammar>)
+    where
+        F: Into<TraceGraphNode<'grammar>>,
+        T: Into<TraceGraphNode<'grammar>>,
+    {
+        let from = self.add_node(from.into());
+        let to = self.add_node(to.into());
+        if !self.graph
+            .edges_directed(from, EdgeDirection::Outgoing)
+            .any(|edge| edge.target() == to && *edge.weight() == labels)
+        {
+            self.graph.add_edge(from, to, labels);
+        }
+    }
+
+    pub fn lr0_examples<'graph>(
+        &'graph self,
+        lr0_item: LR0Item<'grammar>,
+    ) -> PathEnumerator<'graph, 'grammar> {
+        PathEnumerator::new(self, lr0_item)
+    }
+
+    pub fn lr1_examples<'trace>(
+        &'trace self,
+        first_sets: &'trace FirstSets,
+        item: &LR1Item<'grammar>,
+    ) -> FilteredPathEnumerator<'trace, 'grammar> {
+        FilteredPathEnumerator::new(first_sets, self, item.to_lr0(), item.lookahead.clone())
+    }
+}
+
+impl<'grammar> Into<TraceGraphNode<'grammar>> for NonterminalString {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        TraceGraphNode::Nonterminal(self)
+    }
+}
+
+impl<'grammar, L: Lookahead> Into<TraceGraphNode<'grammar>> for Item<'grammar, L> {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        (&self).into()
+    }
+}
+
+impl<'a, 'grammar, L: Lookahead> Into<TraceGraphNode<'grammar>> for &'a Item<'grammar, L> {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        TraceGraphNode::Item(self.to_lr0())
+    }
+}
+
+// This just exists to help with the `Debug` impl
+struct TraceGraphEdge<'grammar> {
+    from: TraceGraphNode<'grammar>,
+    to: TraceGraphNode<'grammar>,
+    label: (
+        &'grammar [Symbol],
+        Option<&'grammar Symbol>,
+        &'grammar [Symbol],
+    ),
+}
+
+impl<'grammar> Debug for TraceGraphEdge<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({:?} -{:?}-> {:?})", self.from, self.label, self.to)
+    }
+}
+
+impl<'grammar> Debug for TraceGraph<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let mut s = fmt.debug_list();
+        for (node, &index) in &self.indices {
+            for edge in self.graph.edges_directed(index, EdgeDirection::Outgoing) {
+                let label = edge.weight();
+                s.entry(&TraceGraphEdge {
+                    from: node.clone(),
+                    to: self.graph[edge.target()].clone(),
+                    label: (label.prefix, label.cursor, label.suffix),
+                });
+            }
+        }
+        s.finish()
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// PathEnumerator
+//
+// The path enumerater walks a trace graph searching for paths that
+// start at a given item and terminate at another item. If such a path
+// is found, you can then find the complete list of symbols by calling
+// `symbols_and_cursor` and also get access to the state.
+
+pub struct PathEnumerator<'graph, 'grammar: 'graph> {
+    graph: &'graph TraceGraph<'grammar>,
+    stack: Vec<EnumeratorState<'graph, 'grammar>>,
+}
+
+struct EnumeratorState<'graph, 'grammar: 'graph> {
+    index: NodeIndex,
+    symbol_sets: SymbolSets<'grammar>,
+    edges: Edges<'graph, SymbolSets<'grammar>, Directed>,
+}
+
+impl<'graph, 'grammar> PathEnumerator<'graph, 'grammar> {
+    fn new(graph: &'graph TraceGraph<'grammar>, lr0_item: LR0Item<'grammar>) -> Self {
+        let start_state = graph.indices[&TraceGraphNode::Item(lr0_item)];
+        let mut enumerator = PathEnumerator {
+            graph: graph,
+            stack: vec![],
+        };
+        let edges = enumerator.incoming_edges(start_state);
+        enumerator.stack.push(EnumeratorState {
+            index: start_state,
+            symbol_sets: SymbolSets::new(),
+            edges: edges,
+        });
+        enumerator.find_next_trace();
+        enumerator
+    }
+
+    /// Advance to the next example. Returns false if there are no more
+    /// examples.
+    pub fn advance(&mut self) -> bool {
+        // If we have not yet exhausted all the examples, then the top
+        // of the stack should be the last target item that we
+        // found. Pop it off.
+        match self.stack.pop() {
+            Some(top_state) => {
+                assert!(match self.graph.graph[top_state.index] {
+                    TraceGraphNode::Item(_) => true,
+                    TraceGraphNode::Nonterminal(_) => false,
+                });
+
+                self.find_next_trace()
+            }
+            None => false,
+        }
+    }
+
+    fn incoming_edges(&self, index: NodeIndex) -> Edges<'graph, SymbolSets<'grammar>, Directed> {
+        self.graph
+            .graph
+            .edges_directed(index, EdgeDirection::Incoming)
+    }
+
+    /// This is the main operation, written in CPS style and hence it
+    /// can seem a bit confusing. The idea is that `find_next_trace`
+    /// is called when we are ready to consider the next child of
+    /// whatever is on the top of the stack. It simply withdraws
+    /// that next child (if any) and hands it to `push_next`.
+    fn find_next_trace(&mut self) -> bool {
+        if !self.stack.is_empty() {
+            let next_edge = {
+                let top_of_stack = self.stack.last_mut().unwrap();
+                top_of_stack.edges.next()
+            };
+            self.push_next_child_if_any(next_edge)
+        } else {
+            false
+        }
+    }
+
+    /// Invoked with the next child (if any) of the node on the top of
+    /// the stack.
+    ///
+    /// If `next` is `Some`, we simply call `push_next_child`.
+    ///
+    /// If `next` is `None`, then the node on the top of
+    /// the stack *has* no next child, and so it is popped, and then
+    /// we call `find_next_trace` again to start with the next child
+    /// of the new top of the stack.
+    fn push_next_child_if_any(
+        &mut self,
+        next: Option<EdgeReference<'graph, SymbolSets<'grammar>>>,
+    ) -> bool {
+        if let Some(edge) = next {
+            let index = edge.source();
+            let symbol_sets = *edge.weight();
+            self.push_next_child(index, symbol_sets)
+        } else {
+            self.stack.pop();
+            self.find_next_trace()
+        }
+    }
+
+    /// Push the next child of the top of the stack onto the stack,
+    /// making the child the new top.
+    ///
+    /// If the child is an `Item` node, we have found the next trace,
+    /// and hence our search terminates. We push the symbols from this
+    /// item node into the symbols vector and then return true.
+    ///
+    /// Otherwise, we check whether this new node would cause a cycle.
+    /// If so, we do *not* push it, and instead just call
+    /// `find_next_trace` again to proceed to the next child of the
+    /// current top.
+    ///
+    /// Finally, if the new node would NOT cause a cycle, then we can
+    /// push it onto the stack so that it becomes the new top, and
+    /// call `find_next_trace` to start searching its children.
+    fn push_next_child(&mut self, index: NodeIndex, symbol_sets: SymbolSets<'grammar>) -> bool {
+        match self.graph.graph[index] {
+            TraceGraphNode::Item(_) => {
+                // If we reached an item like
+                //
+                //     X = ...p (*) ...s
+                //
+                // then we are done, but we still need to push on the
+                // symbols `...p`.
+                let edges = self.incoming_edges(index);
+                self.stack.push(EnumeratorState {
+                    index: index,
+                    symbol_sets: symbol_sets,
+                    edges: edges,
+                });
+                return true;
+            }
+            TraceGraphNode::Nonterminal(_) => {
+                // If this node already appears on the stack, do not
+                // visit its children.
+                if !self.stack.iter().any(|state| state.index == index) {
+                    let edges = self.incoming_edges(index);
+                    self.stack.push(EnumeratorState {
+                        index: index,
+                        symbol_sets: symbol_sets,
+                        edges: edges,
+                    });
+                }
+                self.find_next_trace()
+            }
+        }
+    }
+
+    pub fn found_trace(&self) -> bool {
+        !self.stack.is_empty()
+    }
+
+    /// Returns the 1-context for the current trace. In other words,
+    /// the set of tokens that may appear next in the input. If this
+    /// trace was derived from a shiftable item, this will always be
+    /// the terminal that was to be shifted; if derived from a reduce
+    /// item, this constitutes the set of lookaheads that will trigger
+    /// a reduce.
+    pub fn first0(&self, first_sets: &FirstSets) -> TokenSet {
+        assert!(self.found_trace());
+        first_sets.first0(
+            self.stack[1]
+                .symbol_sets
+                .cursor
+                .into_iter()
+                .chain(self.stack.iter().flat_map(|s| s.symbol_sets.suffix)),
+        )
+    }
+
+    pub fn example(&self) -> Example {
+        assert!(self.found_trace());
+
+        let mut symbols = vec![];
+
+        symbols.extend(
+            self.stack
+                .iter()
+                .rev()
+                .flat_map(|s| s.symbol_sets.prefix)
+                .cloned()
+                .map(ExampleSymbol::Symbol),
+        );
+
+        let cursor = symbols.len();
+
+        match self.stack[1].symbol_sets.cursor {
+            Some(s) => symbols.push(ExampleSymbol::Symbol(s.clone())),
+            None => if self.stack[1].symbol_sets.prefix.is_empty() {
+                symbols.push(ExampleSymbol::Epsilon)
+            } else {
+            },
+        }
+
+        symbols.extend(
+            self.stack
+                .iter()
+                .flat_map(|s| s.symbol_sets.suffix)
+                .cloned()
+                .map(ExampleSymbol::Symbol),
+        );
+
+        let mut cursors = (0, symbols.len());
+
+        let mut reductions: Vec<_> = self.stack[1..]
+            .iter()
+            .rev()
+            .map(|state| {
+                let nonterminal = match self.graph.graph[state.index] {
+                    TraceGraphNode::Nonterminal(ref nonterminal) => nonterminal.clone(),
+                    TraceGraphNode::Item(ref item) => item.production.nonterminal.clone(),
+                };
+                let reduction = Reduction {
+                    start: cursors.0,
+                    end: cursors.1,
+                    nonterminal: nonterminal,
+                };
+                cursors.0 += state.symbol_sets.prefix.len();
+                cursors.1 -= state.symbol_sets.suffix.len();
+                reduction
+            })
+            .collect();
+        reductions.reverse();
+
+        Example {
+            symbols: symbols,
+            cursor: cursor,
+            reductions: reductions,
+        }
+    }
+}
+
+impl<'graph, 'grammar> Iterator for PathEnumerator<'graph, 'grammar> {
+    type Item = Example;
+
+    fn next(&mut self) -> Option<Example> {
+        if self.found_trace() {
+            let example = self.example();
+            self.advance();
+            Some(example)
+        } else {
+            None
+        }
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// FilteredPathEnumerator
+//
+// Like the path enumerator, but tests for examples with some specific
+// lookahead
+
+pub struct FilteredPathEnumerator<'graph, 'grammar: 'graph> {
+    base: PathEnumerator<'graph, 'grammar>,
+    first_sets: &'graph FirstSets,
+    lookahead: TokenSet,
+}
+
+impl<'graph, 'grammar> FilteredPathEnumerator<'graph, 'grammar> {
+    fn new(
+        first_sets: &'graph FirstSets,
+        graph: &'graph TraceGraph<'grammar>,
+        lr0_item: LR0Item<'grammar>,
+        lookahead: TokenSet,
+    ) -> Self {
+        FilteredPathEnumerator {
+            base: PathEnumerator::new(graph, lr0_item),
+            first_sets: first_sets,
+            lookahead: lookahead,
+        }
+    }
+}
+
+impl<'graph, 'grammar> Iterator for FilteredPathEnumerator<'graph, 'grammar> {
+    type Item = Example;
+
+    fn next(&mut self) -> Option<Example> {
+        while self.base.found_trace() {
+            let firsts = self.base.first0(self.first_sets);
+            if firsts.is_intersecting(&self.lookahead) {
+                let example = self.base.example();
+                self.base.advance();
+                return Some(example);
+            }
+            self.base.advance();
+        }
+        None
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/lr1/trace/trace_graph/test.rs
@@ -0,0 +1,162 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::core::*;
+use test_util::expect_debug;
+use tls::Tls;
+
+macro_rules! nt {
+    ($x:ident) => {
+        NonterminalString(Atom::from(stringify!($x)))
+    }
+}
+
+macro_rules! syms {
+    ($($x:ident),*) => {
+        vec![$(Symbol::Nonterminal(nt!($x))),*]
+    }
+}
+
+macro_rules! production {
+    ($x:ident = $($y:ident)*) => {
+        Production {
+            nonterminal: nt!($x),
+            symbols: syms![$($y),*],
+            action: ActionFn::new(0),
+            span: Span(0, 0)
+        }
+    }
+}
+
+use super::TraceGraph;
+
+#[test]
+fn enumerator() {
+    let _tls = Tls::test();
+
+    // Build this graph:
+    //
+    //     X = X0 (*) X1
+    //     ^
+    //     |
+    //   {X0}
+    //     |
+    // +-> X <-- Z = Z0 (*) X Z1
+    // |
+    // Y = Y0 (*) X Y1
+    //
+    // which enumerates out to:
+    //
+    //    [Y0 X0 (*) X1 Y1]
+    //    [Z0 X0 (*) X1 Z1]
+
+    let productions = vec![
+        production![X = X0 X1],
+        production![Y = Y0 X Y1],
+        production![Z = Z0 X Z1],
+    ];
+
+    let mut graph = TraceGraph::new();
+
+    let item0 = Item::lr0(&productions[0], 1); // X = X0 (*) X1
+    graph.add_edge(nt!(X), item0, item0.symbol_sets());
+
+    let item1 = Item::lr0(&productions[1], 1); // Y = Y0 (*) X Y1
+    graph.add_edge(item1, nt!(X), item1.symbol_sets());
+
+    let item2 = Item::lr0(&productions[2], 1); // Z = Z0 (*) X Z1
+    graph.add_edge(item2, nt!(X), item2.symbol_sets());
+
+    let enumerator = graph.lr0_examples(Item::lr0(&productions[0], 1));
+    let list: Vec<_> = enumerator.map(|example| example.paint_unstyled()).collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Z0 X0 X1 Z1",
+        "  │  └─X─┘  │",
+        "  └─Z───────┘"
+    ],
+    [
+        "  Y0 X0 X1 Y1",
+        "  │  └─X─┘  │",
+        "  └─Y───────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn enumerator1() {
+    let _tls = Tls::test();
+
+    // Build this graph:
+    //
+    //     W = W0 W1 (*)
+    //     ^
+    //  {W0,W1}
+    //     |
+    //     W
+    //     ^
+    //   {X0}
+    //     |
+    // +-> X <-- Z = Z0 (*) X Z1
+    // |
+    // Y = Y0 (*) X Y1
+    //
+    // which enumerates out to:
+    //
+    //    [Y0 X0 (*) X1 Y1]
+    //    [Z0 X0 (*) X1 Z1]
+
+    let productions = vec![
+        production![W = W0 W1],
+        production![X = X0 W X1], // where X1 may be empty
+        production![Y = Y0 X Y1],
+        production![Z = Z0 X Z1],
+    ];
+
+    let mut graph = TraceGraph::new();
+
+    let item0 = Item::lr0(&productions[0], 2); // W = W0 W1 (*)
+    graph.add_edge(nt!(W), item0, item0.symbol_sets());
+
+    graph.add_edge(
+        nt!(X),
+        nt!(W),
+        SymbolSets {
+            prefix: &productions[1].symbols[..1],
+            cursor: Some(&productions[1].symbols[1]),
+            suffix: &productions[1].symbols[2..],
+        },
+    );
+
+    let item1 = Item::lr0(&productions[2], 1);
+    graph.add_edge(item1, nt!(X), item1.symbol_sets());
+
+    let item2 = Item::lr0(&productions[3], 1);
+    graph.add_edge(item2, nt!(X), item2.symbol_sets());
+
+    let enumerator = graph.lr0_examples(Item::lr0(&productions[0], 2));
+    let list: Vec<_> = enumerator.map(|example| example.paint_unstyled()).collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Z0 X0 W0 W1 X1 Z1",
+        "  │  │  └─W─┘  │  │",
+        "  │  └─X───────┘  │",
+        "  └─Z─────────────┘"
+    ],
+    [
+        "  Y0 X0 W0 W1 X1 Y1",
+        "  │  │  └─W─┘  │  │",
+        "  │  └─X───────┘  │",
+        "  └─Y─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/builder.rs
@@ -0,0 +1,309 @@
+use grammar::parse_tree::Span;
+use message::{Content, Message};
+use message::indent::Indent;
+use message::horiz::Horiz;
+use message::styled::Styled;
+use message::text::Text;
+use message::vert::Vert;
+use message::wrap::Wrap;
+use style::Style;
+
+pub struct MessageBuilder {
+    span: Span,
+    heading: Option<Box<Content>>,
+    body: Option<Box<Content>>,
+}
+
+pub struct HeadingCharacter {
+    message: MessageBuilder,
+}
+
+pub struct BodyCharacter {
+    message: MessageBuilder,
+}
+
+impl MessageBuilder {
+    pub fn new(span: Span) -> Self {
+        MessageBuilder {
+            span: span,
+            heading: None,
+            body: None,
+        }
+    }
+
+    pub fn heading(self) -> Builder<HeadingCharacter> {
+        Builder::new(HeadingCharacter { message: self })
+    }
+
+    pub fn body(self) -> Builder<BodyCharacter> {
+        Builder::new(BodyCharacter { message: self })
+    }
+
+    pub fn end(self) -> Message {
+        Message::new(
+            self.span,
+            self.heading.expect("never defined a heading"),
+            self.body.expect("never defined a body"),
+        )
+    }
+}
+
+impl Character for HeadingCharacter {
+    type End = MessageBuilder;
+
+    fn end(mut self, items: Vec<Box<Content>>) -> MessageBuilder {
+        assert!(
+            self.message.heading.is_none(),
+            "already defined a heading for this message"
+        );
+        self.message.heading = Some(Box::new(Vert::new(items, 1)));
+        self.message
+    }
+}
+
+impl Character for BodyCharacter {
+    type End = MessageBuilder;
+
+    fn end(mut self, items: Vec<Box<Content>>) -> MessageBuilder {
+        assert!(
+            self.message.body.is_none(),
+            "already defined a body for this message"
+        );
+        self.message.body = Some(Box::new(Vert::new(items, 2)));
+        self.message
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Inline builder: Useful for constructing little bits of content: for
+// example, converting an Example into something renderable. Using an
+// inline builder, if you push exactly one item, then when you call
+// `end` that is what you get; otherwise, you get items laid out
+// adjacent to one another horizontally (no spaces in between).
+
+pub struct InlineBuilder;
+
+impl InlineBuilder {
+    pub fn new() -> Builder<InlineBuilder> {
+        Builder::new(InlineBuilder)
+    }
+}
+
+impl Character for InlineBuilder {
+    type End = Box<Content>;
+
+    fn end(self, mut items: Vec<Box<Content>>) -> Box<Content> {
+        if items.len() == 1 {
+            items.pop().unwrap()
+        } else {
+            Box::new(Horiz::new(items, 1))
+        }
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Builder -- generic helper for multi-part items
+
+/// The builder is used to construct multi-part items. It is intended
+/// to be used in a "method-call chain" style. The base method is
+/// called `push`, and it simply pushes a new child of the current
+/// parent.
+///
+/// Methods whose name like `begin_foo` are used to create a new
+/// multi-part child; they return a fresh builder corresponding to the
+/// child. When the child is completely constructed, call `end` to
+/// finish the child builder and return to the parent builder.
+///
+/// Methods whose name ends in "-ed", such as `styled`, post-process
+/// the last item pushed. They will panic if invoked before any items
+/// have been pushed.
+///
+/// Example:
+///
+/// ```
+/// let node =
+///    InlineBuilder::new()
+///        .begin_lines() // starts a child builder for adjacent lines
+///        .text("foo")   // add a text node "foo" to the child builder
+///        .text("bar")   // add a text node "bar" to the child builder
+///        .end()         // finish the lines builder, return to the parent
+///        .end();        // finish the parent `InlineBuilder`, yielding up the
+///                       // `lines` child that was pushed (see `InlineBuilder`
+///                       // for more details)
+/// ```
+pub struct Builder<C: Character> {
+    items: Vec<Box<Content>>,
+    character: C,
+}
+
+impl<C: Character> Builder<C> {
+    fn new(character: C) -> Self {
+        Builder {
+            items: vec![],
+            character: character,
+        }
+    }
+
+    pub fn push<I>(mut self, item: I) -> Self
+    where
+        I: Into<Box<Content>>,
+    {
+        self.items.push(item.into());
+        self
+    }
+
+    fn pop(&mut self) -> Option<Box<Content>> {
+        self.items.pop()
+    }
+
+    pub fn begin_vert(self, separate: usize) -> Builder<VertCharacter<C>> {
+        Builder::new(VertCharacter {
+            base: self,
+            separate: separate,
+        })
+    }
+
+    pub fn begin_lines(self) -> Builder<VertCharacter<C>> {
+        self.begin_vert(1)
+    }
+
+    pub fn begin_paragraphs(self) -> Builder<VertCharacter<C>> {
+        self.begin_vert(2)
+    }
+
+    pub fn begin_horiz(self, separate: usize) -> Builder<HorizCharacter<C>> {
+        Builder::new(HorizCharacter {
+            base: self,
+            separate: separate,
+        })
+    }
+
+    // "item1item2"
+    pub fn begin_adjacent(self) -> Builder<HorizCharacter<C>> {
+        self.begin_horiz(1)
+    }
+
+    // "item1 item2"
+    pub fn begin_spaced(self) -> Builder<HorizCharacter<C>> {
+        self.begin_horiz(2)
+    }
+
+    pub fn begin_wrap(self) -> Builder<WrapCharacter<C>> {
+        Builder::new(WrapCharacter { base: self })
+    }
+
+    pub fn styled(mut self, style: Style) -> Self {
+        let content = self.pop().expect("bold must be applied to an item");
+        self.push(Box::new(Styled::new(style, content)))
+    }
+
+    pub fn indented_by(mut self, amount: usize) -> Self {
+        let content = self.pop().expect("indent must be applied to an item");
+        self.push(Box::new(Indent::new(amount, content)))
+    }
+
+    pub fn indented(self) -> Self {
+        self.indented_by(2)
+    }
+
+    pub fn text<T: ToString>(self, text: T) -> Self {
+        self.push(Box::new(Text::new(text.to_string())))
+    }
+
+    /// Take the item just pushed and makes some text adjacent to it.
+    /// E.g. `builder.wrap().text("foo").adjacent_text(".").end()`
+    /// result in `"foo."` being printed without any wrapping in
+    /// between.
+    pub fn adjacent_text<T: ToString, U: ToString>(mut self, prefix: T, suffix: U) -> Self {
+        let item = self.pop().expect("adjacent text must be added to an item");
+        let prefix = prefix.to_string();
+        let suffix = suffix.to_string();
+        if !prefix.is_empty() && !suffix.is_empty() {
+            self.begin_adjacent()
+                .text(prefix)
+                .push(item)
+                .text(suffix)
+                .end()
+        } else if !suffix.is_empty() {
+            self.begin_adjacent().push(item).text(suffix).end()
+        } else if !prefix.is_empty() {
+            self.begin_adjacent().text(prefix).push(item).end()
+        } else {
+            self.push(item)
+        }
+    }
+
+    pub fn verbatimed(self) -> Self {
+        self.adjacent_text("`", "`")
+    }
+
+    pub fn punctuated<T: ToString>(self, text: T) -> Self {
+        self.adjacent_text("", text)
+    }
+
+    pub fn wrap_text<T: ToString>(self, text: T) -> Self {
+        self.begin_wrap().text(text).end()
+    }
+
+    pub fn end(self) -> C::End {
+        self.character.end(self.items)
+    }
+}
+
+pub trait Character {
+    type End;
+    fn end(self, items: Vec<Box<Content>>) -> Self::End;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct HorizCharacter<C: Character> {
+    base: Builder<C>,
+    separate: usize,
+}
+
+impl<C: Character> Character for HorizCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Horiz::new(items, self.separate)))
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct VertCharacter<C: Character> {
+    base: Builder<C>,
+    separate: usize,
+}
+
+impl<C: Character> Character for VertCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Vert::new(items, self.separate)))
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct WrapCharacter<C: Character> {
+    base: Builder<C>,
+}
+
+impl<C: Character> Character for WrapCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Wrap::new(items)))
+    }
+}
+
+impl<T> From<Box<T>> for Box<Content>
+where
+    T: Content + 'static,
+{
+    fn from(b: Box<T>) -> Box<Content> {
+        b
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/horiz.rs
@@ -0,0 +1,44 @@
+use ascii_canvas::AsciiView;
+use itertools::Itertools;
+use super::*;
+
+#[derive(Debug)]
+pub struct Horiz {
+    items: Vec<Box<Content>>,
+    separate: usize, // 0 => overlapping, 1 => each on its own line, 2 => paragraphs
+}
+
+impl Horiz {
+    pub fn new(items: Vec<Box<Content>>, separate: usize) -> Self {
+        Horiz {
+            items: items,
+            separate: separate,
+        }
+    }
+}
+
+impl Content for Horiz {
+    fn min_width(&self) -> usize {
+        self.items
+            .iter()
+            .map(|c| c.min_width())
+            .intersperse(self.separate)
+            .fold(0, |a, b| a + b)
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        emit_horiz(view, &self.items, self.separate);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+pub fn emit_horiz(view: &mut AsciiView, items: &[Box<Content>], separate: usize) {
+    let mut column = 0;
+    for item in items {
+        let (_, end_column) = item.emit_at(view, 0, column);
+        column = end_column + separate;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/indent.rs
@@ -0,0 +1,32 @@
+use ascii_canvas::AsciiView;
+use super::*;
+
+#[derive(Debug)]
+pub struct Indent {
+    amount: usize,
+    content: Box<Content>,
+}
+
+impl Indent {
+    pub fn new(amount: usize, content: Box<Content>) -> Self {
+        Indent {
+            amount: amount,
+            content: content,
+        }
+    }
+}
+
+impl Content for Indent {
+    fn min_width(&self) -> usize {
+        self.content.min_width() + self.amount
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let mut subview = view.shift(0, self.amount);
+        self.content.emit(&mut subview);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/message.rs
@@ -0,0 +1,84 @@
+use ascii_canvas::AsciiView;
+use grammar::parse_tree::Span;
+use message::Content;
+use std::cmp;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use tls::Tls;
+
+/// The top-level message display like this:
+///
+/// ```
+/// <span>: <heading>
+///
+/// <body>
+/// ```
+///
+/// This is equivalent to a
+///
+/// ```
+/// Vert[separate=2] {
+///     Horiz[separate=1] {
+///         Horiz[separate=0] {
+///             Citation { span },
+///             Text { ":" },
+///         },
+///         <heading>,
+///     },
+///     <body>
+/// }
+/// ```
+pub struct Message {
+    span: Span,
+    heading: Box<Content>,
+    body: Box<Content>,
+}
+
+impl Message {
+    pub fn new(span: Span, heading: Box<Content>, body: Box<Content>) -> Self {
+        Message {
+            span: span,
+            heading: heading,
+            body: body,
+        }
+    }
+}
+
+impl Content for Message {
+    fn min_width(&self) -> usize {
+        let file_text = Tls::file_text();
+        let span = file_text.span_str(self.span).chars().count();
+        let heading = self.heading.min_width();
+        let body = self.body.min_width();
+        cmp::max(span + heading + 2, body + 2)
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let session = Tls::session();
+        let file_text = Tls::file_text();
+
+        let span = file_text.span_str(self.span);
+        view.write_chars(0, 0, span.chars(), Style::new());
+        let count = span.chars().count();
+        view.write_chars(0, count, ":".chars(), Style::new());
+
+        let (row, _) = self.heading
+            .emit_at(&mut view.styled(session.heading), 0, count + 2);
+
+        self.body.emit_at(view, row + 2, 2);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+impl Debug for Message {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        fmt.debug_struct("Message")
+            .field("span", &self.span)
+            .field("heading", &self.heading)
+            .field("body", &self.body)
+            .finish()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/mod.rs
@@ -0,0 +1,79 @@
+use ascii_canvas::{AsciiCanvas, AsciiView};
+
+use std::cmp;
+use std::fmt::Debug;
+
+pub mod builder;
+pub mod horiz;
+pub mod message;
+pub mod indent;
+pub mod styled;
+#[cfg(test)]
+mod test;
+pub mod text;
+pub mod vert;
+pub mod wrap;
+
+/// Content which can be rendered.
+pub trait Content: Debug {
+    fn min_width(&self) -> usize;
+
+    fn emit(&self, view: &mut AsciiView);
+
+    /// Creates a canvas at least `min_width` in width (it may be
+    /// larger if the content requires that) and fills it with the
+    /// current content. Returns the canvas. Typically `min_width`
+    /// would be 80 or the width of the current terminal.
+    fn emit_to_canvas(&self, min_width: usize) -> AsciiCanvas {
+        let computed_min = self.min_width();
+        let min_width = cmp::max(min_width, computed_min);
+        debug!(
+            "emit_to_canvas: min_width={} computed_min={} self={:#?}",
+            min_width, computed_min, self
+        );
+        let mut canvas = AsciiCanvas::new(0, min_width);
+        self.emit(&mut canvas);
+        canvas
+    }
+
+    /// Emit at a particular upper-left corner, returning the
+    /// lower-right corner that was emitted.
+    fn emit_at(&self, view: &mut AsciiView, row: usize, column: usize) -> (usize, usize) {
+        debug!(
+            "emit_at({},{}) self={:?} min_width={:?}",
+            row,
+            column,
+            self,
+            self.min_width()
+        );
+        let mut shifted_view = view.shift(row, column);
+        self.emit(&mut shifted_view);
+        let (r, c) = shifted_view.close();
+        (r, c)
+    }
+
+    /// When items are enclosed into a wrap, this method deconstructs
+    /// them into their indivisible components.
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>);
+}
+
+/// Helper function: convert `content` into wrap items and then map
+/// those with `op`, appending the final result into `wrap_items`.
+/// Useful for "modifier" content items like `Styled` that do not
+/// affect wrapping.
+fn into_wrap_items_map<OP, C>(content: Box<Content>, wrap_items: &mut Vec<Box<Content>>, op: OP)
+where
+    OP: FnMut(Box<Content>) -> C,
+    C: Content + 'static,
+{
+    let mut subvector = vec![];
+    content.into_wrap_items(&mut subvector);
+    wrap_items.extend(
+        subvector
+            .into_iter()
+            .map(op)
+            .map(|item| Box::new(item) as Box<Content>),
+    );
+}
+
+pub use self::message::Message;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/styled.rs
@@ -0,0 +1,41 @@
+use ascii_canvas::AsciiView;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use super::*;
+
+pub struct Styled {
+    style: Style,
+    content: Box<Content>,
+}
+
+impl Styled {
+    pub fn new(style: Style, content: Box<Content>) -> Self {
+        Styled {
+            style: style,
+            content: content,
+        }
+    }
+}
+
+impl Content for Styled {
+    fn min_width(&self) -> usize {
+        self.content.min_width()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        self.content.emit(&mut view.styled(self.style))
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        let style = self.style;
+        super::into_wrap_items_map(self.content, wrap_items, |item| Styled::new(style, item))
+    }
+}
+
+impl Debug for Styled {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        fmt.debug_struct("Styled")
+            .field("content", &self.content)
+            .finish()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/test.rs
@@ -0,0 +1,142 @@
+use ascii_canvas::AsciiCanvas;
+use grammar::parse_tree::Span;
+use message::builder::MessageBuilder;
+use test_util::expect_debug;
+use tls::Tls;
+
+use super::*;
+
+fn install_tls() -> Tls {
+    Tls::test_string(
+        r#"foo
+bar
+baz
+"#,
+    )
+}
+
+#[test]
+fn hello_world() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end()
+        .body()
+        .begin_wrap()
+        .text(
+            "This is a very, very, very, very long sentence. \
+             OK, not THAT long!",
+        )
+        .end()
+        .indented_by(4)
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "      This is a very, very,",
+    "      very, very long sentence.",
+    "      OK, not THAT long!"
+]
+"#.trim(),
+    );
+}
+
+/// Test a case where the body in the message is longer than the
+/// header (which used to mess up the `min_width` computation).
+#[test]
+fn long_body() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end()
+        .body()
+        .text(
+            "This is a very, very, very, very long sentence. \
+             OK, not THAT long!",
+        )
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "  This is a very, very, very, very long sentence. OK, not THAT long!"
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn paragraphs() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end() // heading
+        .body()
+        .begin_paragraphs()
+        .begin_wrap()
+        .text("This is the first paragraph. It contains a lot of really interesting \
+               information that the reader will no doubt peruse with care.")
+        .end()
+        .begin_wrap()
+        .text("This is the second paragraph. It contains even more really interesting \
+               information that the reader will no doubt skip over with wild abandon.")
+        .end()
+        .begin_wrap()
+        .text("This is the final paragraph. The reader won't even spare this one \
+               a second glance, despite it containing just waht they need to know \
+               to solve their problem and to derive greater pleasure from life. \
+               The secret: All you need is love! Dum da da dum.")
+        .end()
+        .end()
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "  This is the first paragraph.",
+    "  It contains a lot of really",
+    "  interesting information that",
+    "  the reader will no doubt",
+    "  peruse with care.",
+    "",
+    "  This is the second paragraph.",
+    "  It contains even more really",
+    "  interesting information that",
+    "  the reader will no doubt skip",
+    "  over with wild abandon.",
+    "",
+    "  This is the final paragraph.",
+    "  The reader won't even spare",
+    "  this one a second glance,",
+    "  despite it containing just",
+    "  waht they need to know to",
+    "  solve their problem and to",
+    "  derive greater pleasure from",
+    "  life. The secret: All you",
+    "  need is love! Dum da da dum."
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/text.rs
@@ -0,0 +1,37 @@
+use ascii_canvas::AsciiView;
+use style::Style;
+
+use super::*;
+
+/// Text to be display. This will be flowed appropriately depending on
+/// the container; e.g., in a Horiz, it will be one unit, but in a
+/// Wrap, it will be broken up word by word.
+#[derive(Debug)]
+pub struct Text {
+    text: String,
+}
+
+impl Text {
+    pub fn new(text: String) -> Self {
+        Text { text: text }
+    }
+}
+
+impl Content for Text {
+    fn min_width(&self) -> usize {
+        self.text.chars().count()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        view.write_chars(0, 0, self.text.chars(), Style::new())
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.extend(
+            self.text
+                .split_whitespace()
+                .map(|word| Text::new(word.to_string()))
+                .map(|item| Box::new(item) as Box<Content>),
+        );
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/vert.rs
@@ -0,0 +1,39 @@
+use ascii_canvas::AsciiView;
+use super::*;
+
+#[derive(Debug)]
+pub struct Vert {
+    items: Vec<Box<Content>>,
+    separate: usize, // 0 => overlapping, 1 => each on its own line, 2 => paragraphs
+}
+
+impl Vert {
+    pub fn new(items: Vec<Box<Content>>, separate: usize) -> Self {
+        Vert {
+            items: items,
+            separate: separate,
+        }
+    }
+}
+
+impl Content for Vert {
+    fn min_width(&self) -> usize {
+        self.items.iter().map(|c| c.min_width()).max().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        emit_vert(view, &self.items, self.separate);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+pub fn emit_vert(view: &mut AsciiView, items: &[Box<Content>], separate: usize) {
+    let mut row = 0;
+    for item in items {
+        let (end_row, _) = item.emit_at(view, row, 0);
+        row = end_row + separate;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/message/wrap.rs
@@ -0,0 +1,54 @@
+use ascii_canvas::AsciiView;
+use std::cmp;
+use super::*;
+
+#[derive(Debug)]
+pub struct Wrap {
+    items: Vec<Box<Content>>,
+}
+
+impl Wrap {
+    pub fn new(items: Vec<Box<Content>>) -> Self {
+        let mut wrap_items = vec![];
+        for item in items {
+            item.into_wrap_items(&mut wrap_items);
+        }
+        Wrap { items: wrap_items }
+    }
+}
+
+impl Content for Wrap {
+    fn min_width(&self) -> usize {
+        self.items.iter().map(|c| c.min_width()).max().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let columns = view.columns();
+        let mut row = 0; // current row
+        let mut height = 1; // max height of anything in this row
+        let mut column = 0; // current column in this row
+
+        for item in &self.items {
+            let len = item.min_width();
+
+            // If we don't have enough space for this content,
+            // then move to the next line.
+            if column + len > columns {
+                column = 0;
+                row += height;
+                height = 1;
+            }
+
+            assert!(column + len <= columns);
+
+            let (c_row, c_column) = item.emit_at(view, row, column);
+            assert!(c_column >= column);
+            column = c_column + 2;
+            height = cmp::max(c_row - row + 1, height);
+        }
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.extend(self.items); // `items` are already subdivided
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/inline/graph/mod.rs
@@ -0,0 +1,119 @@
+#![allow(dead_code)]
+
+use string_cache::DefaultAtom as Atom;
+use normalize::{NormError, NormResult};
+use petgraph::graph::{Graph, NodeIndex};
+use grammar::consts::INLINE;
+use grammar::repr::*;
+use collections::{map, Map};
+
+#[cfg(test)]
+mod test;
+
+/// Computes the proper order to inline the various nonterminals in
+/// `grammar`. Reports an error if there is an inline
+/// cycle. Otherwise, yields an ordering such that we inline X before
+/// Y if Y references X.  I actually think it doesn't matter what
+/// order we do the inlining, really, but this order seems better
+/// somehow. :) (That is, inline into something before we inline it.)
+pub fn inline_order(grammar: &Grammar) -> NormResult<Vec<NonterminalString>> {
+    let mut graph = NonterminalGraph::new(grammar);
+    graph.create_nodes();
+    graph.add_edges();
+    graph.inline_order()
+}
+
+struct NonterminalGraph<'grammar> {
+    grammar: &'grammar Grammar,
+    graph: Graph<NonterminalString, ()>,
+    nonterminal_map: Map<NonterminalString, NodeIndex>,
+}
+
+#[derive(Copy, Clone)]
+enum WalkState {
+    NotVisited,
+    Visiting,
+    Visited,
+}
+
+impl<'grammar> NonterminalGraph<'grammar> {
+    fn new(grammar: &'grammar Grammar) -> NonterminalGraph<'grammar> {
+        NonterminalGraph {
+            grammar: grammar,
+            graph: Graph::new(),
+            nonterminal_map: map(),
+        }
+    }
+
+    fn create_nodes(&mut self) {
+        let inline = Atom::from(INLINE);
+        for (name, data) in &self.grammar.nonterminals {
+            if data.annotations.iter().any(|a| a.id == inline) {
+                let index = self.graph.add_node(name.clone());
+                self.nonterminal_map.insert(name.clone(), index);
+            }
+        }
+    }
+
+    fn add_edges(&mut self) {
+        for production in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|d| &d.productions)
+        {
+            let from_index = match self.nonterminal_map.get(&production.nonterminal) {
+                Some(&index) => index,
+                None => continue, // this is not an inlined nonterminal
+            };
+
+            for symbol in &production.symbols {
+                match *symbol {
+                    Symbol::Nonterminal(ref to) => {
+                        if let Some(&to_index) = self.nonterminal_map.get(to) {
+                            self.graph.add_edge(from_index, to_index, ());
+                        }
+                    }
+                    Symbol::Terminal(_) => {}
+                }
+            }
+        }
+    }
+
+    fn inline_order(&self) -> NormResult<Vec<NonterminalString>> {
+        let mut states = vec![WalkState::NotVisited; self.graph.node_count()];
+        let mut result = vec![];
+        for node in self.nonterminal_map.values().cloned() {
+            try!(self.walk(&mut states, &mut result, node));
+        }
+        Ok(result)
+    }
+
+    fn walk(
+        &self,
+        states: &mut Vec<WalkState>,
+        result: &mut Vec<NonterminalString>,
+        source: NodeIndex,
+    ) -> NormResult<()> {
+        let nt = self.graph.node_weight(source).unwrap();
+
+        match states[source.index()] {
+            WalkState::NotVisited => {
+                states[source.index()] = WalkState::Visiting;
+                for target in self.graph.neighbors(source) {
+                    try!(self.walk(states, result, target));
+                }
+                states[source.index()] = WalkState::Visited;
+                result.push(nt.clone());
+                Ok(())
+            }
+            WalkState::Visited => Ok(()),
+            WalkState::Visiting => {
+                return_err!(
+                    self.grammar.nonterminals[&nt].span,
+                    "cyclic inline directive: `{}` would have to be inlined into itself",
+                    nt
+                );
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/inline/graph/test.rs
@@ -0,0 +1,52 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::NonterminalString;
+use normalize::lower_helper;
+use parser;
+use session::Session;
+use super::inline_order;
+
+#[test]
+fn test_inline_self_cycle() {
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    assert!(inline_order(&grammar).is_err());
+}
+
+#[test]
+fn test_inline_cycle_3() {
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = B;
+    #[inline] B: () = C;
+    #[inline] C: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    assert!(inline_order(&grammar).is_err());
+}
+
+#[test]
+fn test_inline_order() {
+    // because C references A, we inline A first.
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = B;
+    B: () = C;
+    #[inline] C: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    let a = NonterminalString(Atom::from("A"));
+    let c = NonterminalString(Atom::from("C"));
+    assert_eq!(inline_order(&grammar).unwrap(), vec![a, c]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/inline/mod.rs
@@ -0,0 +1,156 @@
+/*!
+ * Inlining of nonterminals
+ */
+
+use grammar::repr::*;
+use normalize::NormResult;
+
+mod graph;
+
+#[cfg(test)]
+mod test;
+
+pub fn inline(mut grammar: Grammar) -> NormResult<Grammar> {
+    let order = try!(graph::inline_order(&grammar));
+    for nt in order {
+        inline_nt(&mut grammar, &nt);
+    }
+    Ok(grammar)
+}
+
+fn inline_nt(grammar: &mut Grammar, inline_nt: &NonterminalString) {
+    let inline_productions: Vec<_> = grammar.productions_for(inline_nt).iter().cloned().collect();
+    for (_, data) in &mut grammar.nonterminals {
+        let mut new_productions = vec![];
+        let mut new_action_fn_defns = vec![];
+
+        for into_production in &data.productions {
+            if !into_production
+                .symbols
+                .contains(&Symbol::Nonterminal(inline_nt.clone()))
+            {
+                new_productions.push(into_production.clone());
+                continue;
+            }
+
+            let mut inliner = Inliner {
+                action_fn_defns: &grammar.action_fn_defns,
+                inline_nonterminal: inline_nt.clone(),
+                into_production: into_production,
+                inline_fallible: 0,
+                inline_productions: &inline_productions,
+                new_symbols: vec![],
+                new_productions: &mut new_productions,
+                new_action_fn_defns: &mut new_action_fn_defns,
+            };
+
+            inliner.inline(&into_production.symbols);
+        }
+
+        data.productions = new_productions;
+        grammar.action_fn_defns.extend(new_action_fn_defns);
+    }
+}
+
+struct Inliner<'a> {
+    /// Action fn defns
+    action_fn_defns: &'a [ActionFnDefn],
+
+    /// The nonterminal `A` being inlined
+    inline_nonterminal: NonterminalString,
+
+    /// The full set of productions `A = B C D | E F G` for the
+    /// nonterminal `A` being inlined
+    inline_productions: &'a [Production],
+
+    /// Number of actions that we have inlined for `A` so far which
+    /// have been fallible. IOW, if we are inlining `A` into `X = Y A
+    /// A Z`, and in the first instance of `A` we used a fallible
+    /// action, but the second we used an infallible one, count would
+    /// be 1.
+    inline_fallible: u32,
+
+    /// The `X = Y A Z` being inlined into
+    into_production: &'a Production,
+
+    /// The list of symbols we building up for the new production.
+    /// For example, this would (eventually) contain `Y B C D Z`,
+    /// given our running example.
+    new_symbols: Vec<InlinedSymbol>,
+
+    /// The output vector of all productions for `X` that we have created
+    new_productions: &'a mut Vec<Production>,
+
+    /// Vector of all action fn defns from the grammar.
+    new_action_fn_defns: &'a mut Vec<ActionFnDefn>,
+}
+
+impl<'a> Inliner<'a> {
+    fn inline(&mut self, into_symbols: &[Symbol]) {
+        if into_symbols.is_empty() {
+            // create an action fn for the result of inlining
+            let into_action = self.into_production.action;
+            let into_fallible = self.action_fn_defns[into_action.index()].fallible;
+            let into_ret_type = self.action_fn_defns[into_action.index()].ret_type.clone();
+            let inline_fallible = self.inline_fallible != 0;
+            let index = self.action_fn_defns.len() + self.new_action_fn_defns.len();
+            let action_fn = ActionFn::new(index);
+            let inline_defn = InlineActionFnDefn {
+                action: into_action,
+                symbols: self.new_symbols.clone(),
+            };
+            self.new_action_fn_defns.push(ActionFnDefn {
+                fallible: into_fallible || inline_fallible,
+                ret_type: into_ret_type,
+                kind: ActionFnDefnKind::Inline(inline_defn),
+            });
+            let prod_symbols: Vec<Symbol> = self.new_symbols
+                .iter()
+                .flat_map(|sym| match *sym {
+                    InlinedSymbol::Original(ref s) => vec![s.clone()],
+                    InlinedSymbol::Inlined(_, ref s) => s.clone(),
+                })
+                .collect();
+            self.new_productions.push(Production {
+                nonterminal: self.into_production.nonterminal.clone(),
+                span: self.into_production.span,
+                symbols: prod_symbols,
+                action: action_fn,
+            });
+        } else {
+            let next_symbol = &into_symbols[0];
+            match *next_symbol {
+                Symbol::Nonterminal(ref n) if *n == self.inline_nonterminal => {
+                    // Replace the current symbol with each of the
+                    // `inline_productions` in turn.
+                    for inline_production in self.inline_productions {
+                        // If this production is fallible, increment
+                        // count of fallible actions.
+                        let inline_action = inline_production.action;
+                        let fallible = self.action_fn_defns[inline_action.index()].fallible;
+                        self.inline_fallible += fallible as u32;
+
+                        // Push the symbols of the production inline.
+                        self.new_symbols.push(InlinedSymbol::Inlined(
+                            inline_production.action,
+                            inline_production.symbols.clone(),
+                        ));
+
+                        // Inline remaining symbols:
+                        self.inline(&into_symbols[1..]);
+
+                        // Reset state after we have inlined remaining symbols:
+                        self.new_symbols.pop();
+                        self.inline_fallible -= fallible as u32;
+                    }
+                }
+                _ => {
+                    self.new_symbols
+                        .push(InlinedSymbol::Original(next_symbol.clone()));
+                    self.inline(&into_symbols[1..]);
+                    self.new_symbols.pop();
+                }
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/inline/test.rs
@@ -0,0 +1,102 @@
+use grammar::parse_tree::NonterminalString;
+use grammar::repr::Grammar;
+use string_cache::DefaultAtom as Atom;
+use normalize::{self, NormResult};
+use parser;
+use session::Session;
+
+use super::inline;
+
+fn inlined_grammar(text: &str) -> NormResult<Grammar> {
+    let g = parser::parse_grammar(text).unwrap();
+    let g = normalize::lower_helper(&Session::test(), g, true).unwrap();
+    inline(g)
+}
+
+#[test]
+fn sri() {
+    // This grammar gets a shift-reduce conflict because if the input
+    // is "&" (*) "L", then we see two possibilities, and we must decide
+    // between them:
+    //
+    // "&" (*) "L" E
+    //  |       |  |
+    //  +-------+--|
+    //          |
+    //          E
+    //
+    // or
+    //
+    // "&"      (*) "L"
+    //  |            |
+    //  |  OPT_L     E
+    //  |   |        |
+    //  +---+---+----+
+    //          |
+    //          E
+    //
+    // to some extent this may be a false conflict, in that inlined
+    // rules would address it, but it's an interesting one for
+    // producing a useful error message.
+
+    let grammar = inlined_grammar(
+        r#"
+        grammar;
+
+        E: () = {
+            "L",
+            "&" OPT_L E
+        };
+
+        #[inline] OPT_L: () = {
+            (),
+            "L"
+        };
+    "#,
+    ).unwrap();
+
+    let nt = NonterminalString(Atom::from("E"));
+
+    // After inlining, we expect:
+    //
+    // E = "L"
+    // E = "&" E
+    // E = "&" "L" E
+    //
+    // Note that the `()` also gets inlined.
+    let e_productions = grammar.productions_for(&nt);
+    assert_eq!(e_productions.len(), 3);
+    assert_eq!(format!("{:?}", e_productions[0].symbols), r#"["L"]"#);
+    assert_eq!(format!("{:?}", e_productions[1].symbols), r#"["&", E]"#);
+    assert_eq!(
+        format!("{:?}", e_productions[2].symbols),
+        r#"["&", "L", E]"#
+    );
+}
+
+#[test]
+fn issue_55() {
+    let grammar = inlined_grammar(
+        r#"
+grammar;
+
+pub E: () = {
+    "X" "{" <a:AT*> <e:ET> <b:AT*> "}" => ()
+};
+
+AT: () = {
+    "type" ";" => ()
+};
+
+ET: () = {
+    "enum" "{" "}" => ()
+};
+    "#,
+    ).unwrap();
+    let nt = NonterminalString(Atom::from("E"));
+
+    // The problem in issue #55 was that we would inline both `AT*`
+    // the same way, so we ended up with `E = X { ET }` and `E = X {
+    // AT+ ET AT+ }` but not `E = X { AT+ ET }` or `E = X { ET AT+ }`.
+    assert!(grammar.productions_for(&nt).len() == 4);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/lower/mod.rs
@@ -0,0 +1,459 @@
+//! Lower
+//!
+
+use string_cache::DefaultAtom as Atom;
+use normalize::NormResult;
+use normalize::norm_util::{self, Symbols};
+use grammar::consts::*;
+use grammar::pattern::{Pattern, PatternKind};
+use grammar::parse_tree as pt;
+use grammar::parse_tree::{read_algorithm, InternToken, NonterminalString, Path, TerminalString};
+use grammar::repr as r;
+use session::Session;
+use collections::{map, Map};
+
+pub fn lower(session: &Session, grammar: pt::Grammar, types: r::Types) -> NormResult<r::Grammar> {
+    let state = LowerState::new(session, types, &grammar);
+    state.lower(grammar)
+}
+
+struct LowerState<'s> {
+    session: &'s Session,
+    prefix: String,
+    action_fn_defns: Vec<r::ActionFnDefn>,
+    nonterminals: Map<NonterminalString, r::NonterminalData>,
+    conversions: Vec<(TerminalString, Pattern<r::TypeRepr>)>,
+    intern_token: Option<InternToken>,
+    types: r::Types,
+    uses_error_recovery: bool,
+}
+
+impl<'s> LowerState<'s> {
+    fn new(session: &'s Session, types: r::Types, grammar: &pt::Grammar) -> Self {
+        LowerState {
+            session: session,
+            prefix: grammar.prefix.clone(),
+            action_fn_defns: vec![],
+            nonterminals: map(),
+            conversions: vec![],
+            types: types,
+            intern_token: None,
+            uses_error_recovery: false,
+        }
+    }
+
+    fn lower(mut self, grammar: pt::Grammar) -> NormResult<r::Grammar> {
+        let start_symbols = self.synthesize_start_symbols(&grammar);
+
+        let mut uses = vec![];
+        let mut token_span = None;
+        let internal_token_path = Path {
+            absolute: false,
+            ids: vec![Atom::from("Token")],
+        };
+
+        for item in grammar.items {
+            match item {
+                pt::GrammarItem::Use(data) => {
+                    uses.push(data);
+                }
+
+                pt::GrammarItem::MatchToken(_) => {
+                    // The declarations in the match token are handled
+                    // fully by the `token_check` when it constructs the
+                    //  `InternToken` -- there is nothing left to do here.
+                }
+
+                pt::GrammarItem::InternToken(data) => {
+                    token_span = Some(grammar.span);
+                    let span = grammar.span;
+                    let input_str = r::TypeRepr::Ref {
+                        lifetime: Some(Atom::from(INPUT_LIFETIME)),
+                        mutable: false,
+                        referent: Box::new(r::TypeRepr::Nominal(r::NominalTypeRepr {
+                            path: r::Path::str(),
+                            types: vec![],
+                        })),
+                    };
+                    self.conversions
+                        .extend(data.match_entries.iter().enumerate().map(
+                            |(index, match_entry)| {
+                                let pattern = Pattern {
+                                    span: span,
+                                    kind: PatternKind::TupleStruct(
+                                        internal_token_path.clone(),
+                                        vec![
+                                            Pattern {
+                                                span: span,
+                                                kind: PatternKind::Usize(index),
+                                            },
+                                            Pattern {
+                                                span: span,
+                                                kind: PatternKind::Choose(input_str.clone()),
+                                            },
+                                        ],
+                                    ),
+                                };
+
+                                (match_entry.user_name.clone(), pattern)
+                            },
+                        ));
+                    self.intern_token = Some(data);
+                }
+
+                pt::GrammarItem::ExternToken(data) => {
+                    if let Some(enum_token) = data.enum_token {
+                        token_span = Some(enum_token.type_span);
+                        self.conversions
+                            .extend(enum_token.conversions.iter().map(|conversion| {
+                                (
+                                    conversion.from.clone(),
+                                    conversion.to.map(&mut |t| t.type_repr()),
+                                )
+                            }));
+                    }
+                }
+
+                pt::GrammarItem::Nonterminal(nt) => {
+                    let nt_name = &nt.name;
+                    let productions: Vec<_> = nt.alternatives
+                        .into_iter()
+                        .map(|alt| {
+                            let nt_type = self.types.nonterminal_type(nt_name).clone();
+                            let symbols = self.symbols(&alt.expr.symbols);
+                            let action = self.action_kind(nt_type, &alt.expr, &symbols, alt.action);
+                            r::Production {
+                                nonterminal: nt_name.clone(),
+                                span: alt.span,
+                                symbols: symbols,
+                                action: action,
+                            }
+                        })
+                        .collect();
+                    self.nonterminals.insert(
+                        nt_name.clone(),
+                        r::NonterminalData {
+                            name: nt_name.clone(),
+                            visibility: nt.visibility.clone(),
+                            annotations: nt.annotations,
+                            span: nt.span,
+                            productions: productions,
+                        },
+                    );
+                }
+            }
+        }
+
+        let parameters = grammar
+            .parameters
+            .iter()
+            .map(|p| r::Parameter {
+                name: p.name.clone(),
+                ty: p.ty.type_repr(),
+            })
+            .collect();
+
+        let where_clauses = grammar
+            .where_clauses
+            .iter()
+            .map(|wc| wc.map(pt::TypeRef::type_repr))
+            .collect();
+
+        let mut algorithm = r::Algorithm::default();
+
+        // FIXME Error recovery only works for parse tables so temporarily only generate parse tables for
+        // testing
+        if self.session.unit_test && !self.uses_error_recovery {
+            algorithm.codegen = r::LrCodeGeneration::TestAll;
+        }
+
+        read_algorithm(&grammar.annotations, &mut algorithm);
+
+        let mut all_terminals: Vec<_> = self.conversions
+            .iter()
+            .map(|c| c.0.clone())
+            .chain(if self.uses_error_recovery {
+                Some(TerminalString::Error)
+            } else {
+                None
+            })
+            .collect();
+        all_terminals.sort();
+
+        let terminal_bits: Map<_, _> = all_terminals.iter().cloned().zip(0..).collect();
+
+        Ok(r::Grammar {
+            uses_error_recovery: self.uses_error_recovery,
+            prefix: self.prefix,
+            start_nonterminals: start_symbols,
+            uses: uses,
+            action_fn_defns: self.action_fn_defns,
+            nonterminals: self.nonterminals,
+            conversions: self.conversions.into_iter().collect(),
+            types: self.types,
+            token_span: token_span.unwrap(),
+            type_parameters: grammar.type_parameters,
+            parameters: parameters,
+            where_clauses: where_clauses,
+            algorithm: algorithm,
+            intern_token: self.intern_token,
+            terminals: r::TerminalSet {
+                all: all_terminals,
+                bits: terminal_bits,
+            },
+            module_attributes: grammar.module_attributes,
+        })
+    }
+
+    fn synthesize_start_symbols(
+        &mut self,
+        grammar: &pt::Grammar,
+    ) -> Map<NonterminalString, NonterminalString> {
+        grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .filter(|nt| nt.visibility.is_pub())
+            .map(|nt| {
+                // create a synthetic symbol `__Foo` for each public symbol `Foo`
+                // with a rule like:
+                //
+                //     __Foo = Foo;
+                let fake_name =
+                    pt::NonterminalString(Atom::from(format!("{}{}", self.prefix, nt.name)));
+                let nt_type = self.types.nonterminal_type(&nt.name).clone();
+                self.types.add_type(fake_name.clone(), nt_type.clone());
+                let expr = pt::ExprSymbol {
+                    symbols: vec![
+                        pt::Symbol::new(nt.span, pt::SymbolKind::Nonterminal(fake_name.clone())),
+                    ],
+                };
+                let symbols = vec![r::Symbol::Nonterminal(nt.name.clone())];
+                let action_fn = self.action_fn(nt_type, false, &expr, &symbols, None);
+                let production = r::Production {
+                    nonterminal: fake_name.clone(),
+                    symbols: symbols,
+                    action: action_fn,
+                    span: nt.span,
+                };
+                self.nonterminals.insert(
+                    fake_name.clone(),
+                    r::NonterminalData {
+                        name: fake_name.clone(),
+                        visibility: nt.visibility.clone(),
+                        annotations: vec![],
+                        span: nt.span,
+                        productions: vec![production],
+                    },
+                );
+                (nt.name.clone(), fake_name)
+            })
+            .collect()
+    }
+
+    fn action_kind(
+        &mut self,
+        nt_type: r::TypeRepr,
+        expr: &pt::ExprSymbol,
+        symbols: &[r::Symbol],
+        action: Option<pt::ActionKind>,
+    ) -> r::ActionFn {
+        match action {
+            Some(pt::ActionKind::Lookahead) => self.lookahead_action_fn(),
+            Some(pt::ActionKind::Lookbehind) => self.lookbehind_action_fn(),
+            Some(pt::ActionKind::User(string)) => {
+                self.action_fn(nt_type, false, &expr, &symbols, Some(string))
+            }
+            Some(pt::ActionKind::Fallible(string)) => {
+                self.action_fn(nt_type, true, &expr, &symbols, Some(string))
+            }
+            None => self.action_fn(nt_type, false, &expr, &symbols, None),
+        }
+    }
+
+    fn lookahead_action_fn(&mut self) -> r::ActionFn {
+        let action_fn_defn = r::ActionFnDefn {
+            fallible: false,
+            ret_type: self.types.terminal_loc_type(),
+            kind: r::ActionFnDefnKind::Lookaround(r::LookaroundActionFnDefn::Lookahead),
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn lookbehind_action_fn(&mut self) -> r::ActionFn {
+        let action_fn_defn = r::ActionFnDefn {
+            fallible: false,
+            ret_type: self.types.terminal_loc_type(),
+            kind: r::ActionFnDefnKind::Lookaround(r::LookaroundActionFnDefn::Lookbehind),
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn action_fn(
+        &mut self,
+        nt_type: r::TypeRepr,
+        fallible: bool,
+        expr: &pt::ExprSymbol,
+        symbols: &[r::Symbol],
+        action: Option<String>,
+    ) -> r::ActionFn {
+        let action = match action {
+            Some(s) => s,
+            None => {
+                // If the user declared a type `()`, or we inferred
+                // it, then there is only one possible action that
+                // will type-check (`()`), so supply that. Otherwise,
+                // default is to include all selected items.
+                if nt_type.is_unit() {
+                    format!("()")
+                } else {
+                    format!("(<>)")
+                }
+            }
+        };
+
+        // Note that the action fn takes ALL of the symbols in `expr`
+        // as arguments, and some of them are simply dropped based on
+        // the user's selections.
+
+        // The set of argument types is thus the type of all symbols:
+        let arg_types: Vec<r::TypeRepr> =
+            symbols.iter().map(|s| s.ty(&self.types)).cloned().collect();
+
+        let action_fn_defn = match norm_util::analyze_expr(expr) {
+            Symbols::Named(names) => {
+                // if there are named symbols, we want to give the
+                // arguments the names that the user gave them:
+                let arg_patterns = patterns(
+                    names
+                        .iter()
+                        .map(|&(index, ref name, _)| (index, name.clone())),
+                    symbols.len(),
+                );
+
+                let action = {
+                    match norm_util::check_between_braces(&action) {
+                        norm_util::Presence::None => action,
+                        norm_util::Presence::Normal => {
+                            let name_str: String = {
+                                let name_strs: Vec<_> = names
+                                    .iter()
+                                    .map(|&(_, ref name, _)| name.as_ref())
+                                    .collect();
+                                name_strs.join(", ")
+                            };
+                            action.replace("<>", &name_str)
+                        }
+                        norm_util::Presence::InCurlyBrackets => {
+                            let name_str = {
+                                let name_strs: Vec<_> = names
+                                    .iter()
+                                    .map(|&(_, ref name, _)| format!("{0}:{0}", &*name))
+                                    .collect();
+                                name_strs.join(", ")
+                            };
+                            action.replace("<>", &name_str)
+                        }
+                    }
+                };
+
+                r::ActionFnDefn {
+                    fallible: fallible,
+                    ret_type: nt_type,
+                    kind: r::ActionFnDefnKind::User(r::UserActionFnDefn {
+                        arg_patterns: arg_patterns,
+                        arg_types: arg_types,
+                        code: action,
+                    }),
+                }
+            }
+            Symbols::Anon(indices) => {
+                let names: Vec<_> = (0..indices.len()).map(|i| self.fresh_name(i)).collect();
+                let arg_patterns = patterns(
+                    indices
+                        .iter()
+                        .map(|&(index, _)| index)
+                        .zip(names.iter().cloned()),
+                    symbols.len(),
+                );
+                let name_str = {
+                    let name_strs: Vec<_> = names.iter().map(|n| n.as_ref()).collect();
+                    name_strs.join(", ")
+                };
+                let action = action.replace("<>", &name_str);
+                r::ActionFnDefn {
+                    fallible: fallible,
+                    ret_type: nt_type,
+                    kind: r::ActionFnDefnKind::User(r::UserActionFnDefn {
+                        arg_patterns: arg_patterns,
+                        arg_types: arg_types,
+                        code: action,
+                    }),
+                }
+            }
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn add_action_fn(&mut self, action_fn_defn: r::ActionFnDefn) -> r::ActionFn {
+        let index = r::ActionFn::new(self.action_fn_defns.len());
+        self.action_fn_defns.push(action_fn_defn);
+        index
+    }
+
+    fn symbols(&mut self, symbols: &[pt::Symbol]) -> Vec<r::Symbol> {
+        symbols.iter().map(|sym| self.symbol(sym)).collect()
+    }
+
+    fn symbol(&mut self, symbol: &pt::Symbol) -> r::Symbol {
+        match symbol.kind {
+            pt::SymbolKind::Terminal(ref id) => r::Symbol::Terminal(id.clone()),
+            pt::SymbolKind::Nonterminal(ref id) => r::Symbol::Nonterminal(id.clone()),
+            pt::SymbolKind::Choose(ref s) | pt::SymbolKind::Name(_, ref s) => self.symbol(s),
+            pt::SymbolKind::Error => {
+                self.uses_error_recovery = true;
+                r::Symbol::Terminal(TerminalString::Error)
+            }
+
+            pt::SymbolKind::Macro(..)
+            | pt::SymbolKind::Repeat(..)
+            | pt::SymbolKind::Expr(..)
+            | pt::SymbolKind::AmbiguousId(_)
+            | pt::SymbolKind::Lookahead
+            | pt::SymbolKind::Lookbehind => unreachable!(
+                "symbol `{}` should have been normalized away by now",
+                symbol
+            ),
+        }
+    }
+
+    fn fresh_name(&self, i: usize) -> Atom {
+        Atom::from(format!("{}{}", self.prefix, i))
+    }
+}
+
+fn patterns<I>(mut chosen: I, num_args: usize) -> Vec<Atom>
+where
+    I: Iterator<Item = (usize, Atom)>,
+{
+    let blank = Atom::from("_");
+
+    let mut next_chosen = chosen.next();
+
+    let result = (0..num_args)
+        .map(|index| match next_chosen.clone() {
+            Some((chosen_index, ref chosen_name)) if chosen_index == index => {
+                next_chosen = chosen.next();
+                chosen_name.clone()
+            }
+            _ => blank.clone(),
+        })
+        .collect();
+
+    debug_assert!(next_chosen.is_none());
+
+    result
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/macro_expand/mod.rs
@@ -0,0 +1,603 @@
+use std::collections::{HashMap, HashSet};
+use string_cache::DefaultAtom as Atom;
+use grammar::consts::INLINE;
+use grammar::parse_tree::{ActionKind, Alternative, Annotation, Condition, ConditionOp, ExprSymbol,
+                          Grammar, GrammarItem, MacroSymbol, NonterminalData, NonterminalString,
+                          Path, RepeatOp, RepeatSymbol, Span, Symbol, SymbolKind, TerminalLiteral,
+                          TerminalString, TypeRef, Visibility};
+use normalize::resolve;
+use normalize::{NormError, NormResult};
+use normalize::norm_util::{self, Symbols};
+use regex::Regex;
+use std::mem;
+
+#[cfg(test)]
+mod test;
+
+pub fn expand_macros(input: Grammar) -> NormResult<Grammar> {
+    let input = try!(resolve::resolve(input));
+
+    let items = input.items;
+
+    let (macro_defs, mut items): (Vec<_>, Vec<_>) =
+        items.into_iter().partition(|mi| mi.is_macro_def());
+
+    let macro_defs: HashMap<_, _> = macro_defs
+        .into_iter()
+        .map(|md| match md {
+            GrammarItem::Nonterminal(ref data) => (data.name.clone(), data.clone()),
+            _ => unreachable!(),
+        })
+        .collect();
+
+    let mut expander = MacroExpander::new(macro_defs);
+    try!(expander.expand(&mut items));
+
+    Ok(Grammar {
+        items: items,
+        ..input
+    })
+}
+
+struct MacroExpander {
+    macro_defs: HashMap<NonterminalString, NonterminalData>,
+    expansion_set: HashSet<NonterminalString>,
+    expansion_stack: Vec<Symbol>,
+}
+
+impl MacroExpander {
+    fn new(macro_defs: HashMap<NonterminalString, NonterminalData>) -> MacroExpander {
+        MacroExpander {
+            macro_defs: macro_defs,
+            expansion_stack: Vec::new(),
+            expansion_set: HashSet::new(),
+        }
+    }
+
+    fn expand(&mut self, items: &mut Vec<GrammarItem>) -> NormResult<()> {
+        let mut counter = 0;
+        loop {
+            // Find any macro uses in items added since last round and
+            // replace them in place with the expanded version:
+            for item in &mut items[counter..] {
+                self.replace_item(item);
+            }
+            counter = items.len();
+
+            // No more expansion to do.
+            if self.expansion_stack.is_empty() {
+                return Ok(());
+            }
+
+            // Drain expansion stack:
+            while let Some(sym) = self.expansion_stack.pop() {
+                match sym.kind {
+                    SymbolKind::Macro(msym) => {
+                        items.push(try!(self.expand_macro_symbol(sym.span, msym)))
+                    }
+                    SymbolKind::Expr(expr) => {
+                        items.push(try!(self.expand_expr_symbol(sym.span, expr)))
+                    }
+                    SymbolKind::Repeat(repeat) => {
+                        items.push(try!(self.expand_repeat_symbol(sym.span, *repeat)))
+                    }
+                    SymbolKind::Lookahead => items.push(try!(self.expand_lookaround_symbol(
+                        sym.span,
+                        "@L",
+                        ActionKind::Lookahead
+                    ))),
+                    SymbolKind::Lookbehind => items.push(try!(self.expand_lookaround_symbol(
+                        sym.span,
+                        "@R",
+                        ActionKind::Lookbehind
+                    ))),
+                    _ => assert!(false, "don't know how to expand `{:?}`", sym),
+                }
+            }
+        }
+    }
+
+    fn replace_item(&mut self, item: &mut GrammarItem) {
+        match *item {
+            GrammarItem::MatchToken(..) => {}
+            GrammarItem::ExternToken(..) => {}
+            GrammarItem::InternToken(..) => {}
+            GrammarItem::Use(..) => {}
+            GrammarItem::Nonterminal(ref mut data) => {
+                // Should not encounter macro definitions here,
+                // they've already been siphoned off.
+                assert!(!data.is_macro_def());
+
+                for alternative in &mut data.alternatives {
+                    self.replace_symbols(&mut alternative.expr.symbols);
+                }
+            }
+        }
+    }
+
+    fn replace_symbols(&mut self, symbols: &mut [Symbol]) {
+        for symbol in symbols {
+            self.replace_symbol(symbol);
+        }
+    }
+
+    fn replace_symbol(&mut self, symbol: &mut Symbol) {
+        match symbol.kind {
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+            SymbolKind::Macro(ref mut m) => for sym in &mut m.args {
+                self.replace_symbol(sym);
+            },
+            SymbolKind::Expr(ref mut expr) => {
+                self.replace_symbols(&mut expr.symbols);
+            }
+            SymbolKind::Repeat(ref mut repeat) => {
+                self.replace_symbol(&mut repeat.symbol);
+            }
+            SymbolKind::Terminal(_) | SymbolKind::Nonterminal(_) | SymbolKind::Error => {
+                return;
+            }
+            SymbolKind::Choose(ref mut sym) | SymbolKind::Name(_, ref mut sym) => {
+                self.replace_symbol(sym);
+                return;
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind => {}
+        }
+
+        // only symbols we intend to expand fallthrough to here
+
+        let key = NonterminalString(Atom::from(symbol.canonical_form()));
+        let replacement = Symbol {
+            span: symbol.span,
+            kind: SymbolKind::Nonterminal(key.clone()),
+        };
+        let to_expand = mem::replace(symbol, replacement);
+        if self.expansion_set.insert(key) {
+            self.expansion_stack.push(to_expand);
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Macro expansion
+
+    fn expand_macro_symbol(&mut self, span: Span, msym: MacroSymbol) -> NormResult<GrammarItem> {
+        let msym_name = NonterminalString(Atom::from(msym.canonical_form()));
+
+        let mdef = match self.macro_defs.get(&msym.name) {
+            Some(v) => v,
+            None => return_err!(span, "no macro definition found for `{}`", msym.name),
+        };
+
+        if mdef.args.len() != msym.args.len() {
+            return_err!(
+                span,
+                "expected {} arguments to `{}` but found {}",
+                mdef.args.len(),
+                msym.name,
+                msym.args.len()
+            );
+        }
+
+        let args: HashMap<NonterminalString, SymbolKind> = mdef.args
+            .iter()
+            .cloned()
+            .zip(msym.args.into_iter().map(|s| s.kind))
+            .collect();
+
+        let type_decl = mdef.type_decl
+            .as_ref()
+            .map(|tr| self.macro_expand_type_ref(&args, tr));
+
+        // due to the use of `try!`, it's a bit awkward to write this with an iterator
+        let mut alternatives: Vec<Alternative> = vec![];
+
+        for alternative in &mdef.alternatives {
+            if !try!(self.evaluate_cond(&args, &alternative.condition)) {
+                continue;
+            }
+            alternatives.push(Alternative {
+                span: span,
+                expr: self.macro_expand_expr_symbol(&args, &alternative.expr),
+                condition: None,
+                action: alternative.action.clone(),
+            });
+        }
+
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: mdef.visibility.clone(),
+            span: span,
+            name: msym_name,
+            annotations: mdef.annotations.clone(),
+            args: vec![],
+            type_decl: type_decl,
+            alternatives: alternatives,
+        }))
+    }
+
+    fn macro_expand_type_refs(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        type_refs: &[TypeRef],
+    ) -> Vec<TypeRef> {
+        type_refs
+            .iter()
+            .map(|tr| self.macro_expand_type_ref(args, tr))
+            .collect()
+    }
+
+    fn macro_expand_type_ref(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        type_ref: &TypeRef,
+    ) -> TypeRef {
+        match *type_ref {
+            TypeRef::Tuple(ref trs) => TypeRef::Tuple(self.macro_expand_type_refs(args, trs)),
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => TypeRef::Nominal {
+                path: path.clone(),
+                types: self.macro_expand_type_refs(args, types),
+            },
+            TypeRef::Lifetime(ref id) => TypeRef::Lifetime(id.clone()),
+            TypeRef::OfSymbol(ref sym) => TypeRef::OfSymbol(sym.clone()),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => TypeRef::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(self.macro_expand_type_ref(args, referent)),
+            },
+            TypeRef::Id(ref id) => match args.get(&NonterminalString(id.clone())) {
+                Some(sym) => TypeRef::OfSymbol(sym.clone()),
+                None => TypeRef::Nominal {
+                    path: Path::from_id(id.clone()),
+                    types: vec![],
+                },
+            },
+        }
+    }
+
+    fn evaluate_cond(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        opt_cond: &Option<Condition>,
+    ) -> NormResult<bool> {
+        if let Some(ref c) = *opt_cond {
+            match args[&c.lhs] {
+                SymbolKind::Terminal(TerminalString::Literal(TerminalLiteral::Quoted(ref lhs))) => {
+                    match c.op {
+                        ConditionOp::Equals => Ok(lhs == &c.rhs),
+                        ConditionOp::NotEquals => Ok(lhs != &c.rhs),
+                        ConditionOp::Match => self.re_match(c.span, lhs, &c.rhs),
+                        ConditionOp::NotMatch => Ok(!try!(self.re_match(c.span, lhs, &c.rhs))),
+                    }
+                }
+                ref lhs => {
+                    return_err!(
+                        c.span,
+                        "invalid condition LHS `{}`, expected a string literal, not `{}`",
+                        c.lhs,
+                        lhs
+                    );
+                }
+            }
+        } else {
+            Ok(true)
+        }
+    }
+
+    fn re_match(&self, span: Span, lhs: &Atom, regex: &Atom) -> NormResult<bool> {
+        let re = match Regex::new(&regex) {
+            Ok(re) => re,
+            Err(err) => return_err!(span, "invalid regular expression `{}`: {}", regex, err),
+        };
+        Ok(re.is_match(&lhs))
+    }
+
+    fn macro_expand_symbols(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        expr: &[Symbol],
+    ) -> Vec<Symbol> {
+        expr.iter()
+            .map(|s| self.macro_expand_symbol(args, s))
+            .collect()
+    }
+
+    fn macro_expand_expr_symbol(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        expr: &ExprSymbol,
+    ) -> ExprSymbol {
+        ExprSymbol {
+            symbols: self.macro_expand_symbols(args, &expr.symbols),
+        }
+    }
+
+    fn macro_expand_symbol(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        symbol: &Symbol,
+    ) -> Symbol {
+        let kind = match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                SymbolKind::Expr(self.macro_expand_expr_symbol(args, expr))
+            }
+            SymbolKind::Terminal(ref id) => SymbolKind::Terminal(id.clone()),
+            SymbolKind::Nonterminal(ref id) => match args.get(id) {
+                Some(sym) => sym.clone(),
+                None => SymbolKind::Nonterminal(id.clone()),
+            },
+            SymbolKind::Macro(ref msym) => SymbolKind::Macro(MacroSymbol {
+                name: msym.name.clone(),
+                args: self.macro_expand_symbols(args, &msym.args),
+            }),
+            SymbolKind::Repeat(ref r) => SymbolKind::Repeat(Box::new(RepeatSymbol {
+                op: r.op,
+                symbol: self.macro_expand_symbol(args, &r.symbol),
+            })),
+            SymbolKind::Choose(ref sym) => {
+                SymbolKind::Choose(Box::new(self.macro_expand_symbol(args, sym)))
+            }
+            SymbolKind::Name(ref id, ref sym) => {
+                SymbolKind::Name(id.clone(), Box::new(self.macro_expand_symbol(args, sym)))
+            }
+            SymbolKind::Lookahead => SymbolKind::Lookahead,
+            SymbolKind::Lookbehind => SymbolKind::Lookbehind,
+            SymbolKind::Error => SymbolKind::Error,
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+        };
+
+        Symbol {
+            span: symbol.span,
+            kind: kind,
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Expr expansion
+
+    fn expand_expr_symbol(&mut self, span: Span, expr: ExprSymbol) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(expr.canonical_form()));
+
+        let ty_ref =
+            match norm_util::analyze_expr(&expr) {
+                Symbols::Named(names) => {
+                    let (_, ref ex_id, ex_sym) = names[0];
+                    return_err!(
+                    span,
+                    "named symbols like `{}:{}` are only allowed at the top-level of a nonterminal",
+                    ex_id, ex_sym)
+                }
+                Symbols::Anon(syms) => maybe_tuple(
+                    syms.into_iter()
+                        .map(|(_, s)| TypeRef::OfSymbol(s.kind.clone()))
+                        .collect(),
+                ),
+            };
+
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: Visibility::Priv,
+            span: span,
+            name: name,
+            annotations: inline(span),
+            args: vec![],
+            type_decl: Some(ty_ref),
+            alternatives: vec![
+                Alternative {
+                    span: span,
+                    expr: expr,
+                    condition: None,
+                    action: action("(<>)"),
+                },
+            ],
+        }))
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Expr expansion
+
+    fn expand_repeat_symbol(
+        &mut self,
+        span: Span,
+        repeat: RepeatSymbol,
+    ) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(repeat.canonical_form()));
+        let v = Atom::from("v");
+        let e = Atom::from("e");
+
+        let base_symbol_ty = TypeRef::OfSymbol(repeat.symbol.kind.clone());
+
+        match repeat.op {
+            RepeatOp::Star => {
+                let path = Path::vec();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                let plus_repeat = Box::new(RepeatSymbol {
+                    op: RepeatOp::Plus,
+                    symbol: repeat.symbol.clone(),
+                });
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name,
+                    annotations: inline(span),
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X* =
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol { symbols: vec![] },
+                            condition: None,
+                            action: action("vec![]"),
+                        },
+                        // X* = <v:X+>
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(
+                                            v,
+                                            Box::new(Symbol::new(
+                                                span,
+                                                SymbolKind::Repeat(plus_repeat),
+                                            )),
+                                        ),
+                                    ),
+                                ],
+                            },
+                            condition: None,
+                            action: action("v"),
+                        },
+                    ],
+                }))
+            }
+
+            RepeatOp::Plus => {
+                let path = Path::vec();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name.clone(),
+                    annotations: vec![],
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X+ = X
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![repeat.symbol.clone()],
+                            },
+                            condition: None,
+                            action: action("vec![<>]"),
+                        },
+                        // X+ = <v:X+> <e:X>
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(
+                                            v,
+                                            Box::new(Symbol::new(
+                                                span,
+                                                SymbolKind::Nonterminal(name),
+                                            )),
+                                        ),
+                                    ),
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(e, Box::new(repeat.symbol.clone())),
+                                    ),
+                                ],
+                            },
+                            condition: None,
+                            action: action("{ let mut v = v; v.push(e); v }"),
+                        },
+                    ],
+                }))
+            }
+
+            RepeatOp::Question => {
+                let path = Path::option();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name,
+                    annotations: inline(span),
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X? = X => Some(<>)
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![repeat.symbol.clone()],
+                            },
+                            condition: None,
+                            action: action("Some(<>)"),
+                        },
+                        // X? = { => None; }
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol { symbols: vec![] },
+                            condition: None,
+                            action: action("None"),
+                        },
+                    ],
+                }))
+            }
+        }
+    }
+
+    fn expand_lookaround_symbol(
+        &mut self,
+        span: Span,
+        name: &str,
+        action: ActionKind,
+    ) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(name));
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: Visibility::Priv,
+            span: span,
+            name: name,
+            annotations: inline(span),
+            args: vec![],
+            type_decl: None,
+            alternatives: vec![
+                Alternative {
+                    span: span,
+                    expr: ExprSymbol { symbols: vec![] },
+                    condition: None,
+                    action: Some(action),
+                },
+            ],
+        }))
+    }
+}
+
+fn maybe_tuple(v: Vec<TypeRef>) -> TypeRef {
+    if v.len() == 1 {
+        v.into_iter().next().unwrap()
+    } else {
+        TypeRef::Tuple(v)
+    }
+}
+
+fn action(s: &str) -> Option<ActionKind> {
+    Some(ActionKind::User(s.to_string()))
+}
+
+fn inline(span: Span) -> Vec<Annotation> {
+    vec![
+        Annotation {
+            id_span: span,
+            id: Atom::from(INLINE),
+        },
+    ]
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/macro_expand/test.rs
@@ -0,0 +1,112 @@
+use parser;
+use test_util::compare;
+
+use super::expand_macros;
+
+#[test]
+fn test_comma() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    Comma<E>: Vec<E> =
+       <v:(<E> ",")*> <e:E?> =>
+           v.into_iter().chain(e.into_iter()).collect();
+
+    Ids = Comma<"Id">;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r##"
+grammar;
+    Ids = `Comma<"Id">`;
+
+    `Comma<"Id">`: Vec<#"Id"#> =
+        <v:`(<"Id"> ",")*`> <e:`"Id"?`> => v.into_iter().chain(e.into_iter()).collect();
+
+    #[inline]
+    `"Id"?`: ::std::option::Option<#"Id"#> = {
+        "Id" => Some(<>),
+        => None
+    };
+
+    #[inline]
+    `(<"Id"> ",")*`: ::std::vec::Vec<#`(<"Id"> ",")`#> = {
+        => vec![],
+        <v:`(<"Id"> ",")+`> => v,
+    };
+
+    #[inline]
+    `(<"Id"> ",")`: #"Id"# = {
+        <"Id"> "," => (<>),
+    };
+
+    `(<"Id"> ",")+`: ::std::vec::Vec<#`(<"Id"> ",")`#> = {
+        `(<"Id"> ",")` => vec![<>],
+        <v:`(<"Id"> ",")+`> <e:`(<"Id"> ",")`> => { let mut v = v; v.push(e); v },
+    };
+"##,
+    ).unwrap();
+
+    compare(actual, expected);
+}
+
+#[test]
+fn test_if_match() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    Expr<E> = {
+       "A" if E == "A*C",
+       "B" if E ~~ "^A*C$",
+       "C" if E != "A*C",
+       "D" if E !~ "^A*C$"
+    };
+
+    Expr1 = Expr<"A*C">;
+    Expr2 = Expr<"AAC">;
+    Expr3 = Expr<"ABC">;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r#"
+grammar;
+    Expr1 = `Expr<"A*C">`;
+    Expr2 = `Expr<"AAC">`;
+    Expr3 = `Expr<"ABC">`;
+
+    `Expr<"ABC">` = { "C", "D" };
+    `Expr<"AAC">` = { "B", "C" };
+    `Expr<"A*C">` = { "A", "D" };
+"#,
+    ).unwrap();
+
+    compare(actual, expected);
+}
+
+#[test]
+fn test_lookahead() {
+    let grammar = parser::parse_grammar(
+        r#"
+        grammar;
+        Expr = @L;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r#"
+        grammar;
+        Expr = `@L`;
+        #[inline] `@L` = =>@L;
+"#,
+    ).unwrap();
+
+    compare(actual, expected);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/mod.rs
@@ -0,0 +1,119 @@
+/*!
+ * Normalization processes a parse tree until it is in suitable form to
+ * be converted to the more canonical form. This is done as a series of
+ * passes, each contained in their own module below.
+ */
+
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use session::Session;
+
+pub type NormResult<T> = Result<T, NormError>;
+
+#[derive(Clone, Debug)]
+pub struct NormError {
+    pub message: String,
+    pub span: pt::Span,
+}
+
+macro_rules! return_err {
+    ($span: expr, $($args:expr),+) => {
+        return Err(NormError {
+            message: format!($($args),+),
+            span: $span
+        });
+    }
+}
+
+pub fn normalize(session: &Session, grammar: pt::Grammar) -> NormResult<r::Grammar> {
+    normalize_helper(session, grammar, true)
+}
+
+/// for unit tests, it is convenient to skip the validation step, and supply a dummy session
+#[cfg(test)]
+pub fn normalize_without_validating(grammar: pt::Grammar) -> NormResult<r::Grammar> {
+    normalize_helper(&Session::new(), grammar, false)
+}
+
+fn normalize_helper(
+    session: &Session,
+    grammar: pt::Grammar,
+    validate: bool,
+) -> NormResult<r::Grammar> {
+    let grammar = try!(lower_helper(session, grammar, validate));
+    let grammar = profile!(session, "Inlining", try!(inline::inline(grammar)));
+    Ok(grammar)
+}
+
+fn lower_helper(session: &Session, grammar: pt::Grammar, validate: bool) -> NormResult<r::Grammar> {
+    profile!(
+        session,
+        "Grammar validation",
+        if validate {
+            try!(prevalidate::validate(&grammar));
+        }
+    );
+    let grammar = profile!(
+        session,
+        "Grammar resolution",
+        try!(resolve::resolve(grammar))
+    );
+    let grammar = profile!(
+        session,
+        "Macro expansion",
+        try!(macro_expand::expand_macros(grammar))
+    );
+    let grammar = profile!(session, "Token check", try!(token_check::validate(grammar)));
+    let types = profile!(session, "Infer types", try!(tyinfer::infer_types(&grammar)));
+    let grammar = profile!(
+        session,
+        "Lowering",
+        try!(lower::lower(session, grammar, types))
+    );
+    Ok(grammar)
+}
+
+// These are executed *IN ORDER*:
+
+// Check most safety conditions.
+mod prevalidate;
+
+// Resolve identifiers into terminals/nonterminals etc.
+mod resolve;
+
+// Expands macros and expressions
+//
+//     X = ...1 Comma<X> (X Y Z) ...2
+//
+// to
+//
+//     X = ...1 `Comma<X>` `(X Y Z)` ...2
+//     `Comma_X`: Vec<<X>> = ...;
+//     `(X Y Z)` = X Y Z;
+//
+// AFTER THIS POINT: No more macros, macro references, guarded
+// alternatives, repeats, or expr symbols, though type indirections
+// may occur.
+mod macro_expand;
+
+// Check if there is an extern token and all terminals have have a
+// conversion; if no extern token, synthesize an intern token.
+mod token_check;
+
+// Computes types where the user omitted them (or from macro
+// byproducts).
+//
+// AFTER THIS POINT: there is a separate `repr::Types` table
+// providing all nonterminals with an explicit type.
+mod tyinfer;
+
+// Lowers the parse tree to the repr notation.
+mod lower;
+
+// Inline nonterminals that have requested it.
+mod inline;
+
+///////////////////////////////////////////////////////////////////////////
+// Shared routines
+
+mod norm_util;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/norm_util.rs
@@ -0,0 +1,134 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::{ActionKind, Alternative, ExprSymbol, Symbol, SymbolKind};
+
+#[derive(Debug)]
+pub enum AlternativeAction<'a> {
+    User(&'a ActionKind),
+    Default(Symbols<'a>),
+}
+
+#[derive(Debug)]
+pub enum Symbols<'a> {
+    Named(Vec<(usize, Atom, &'a Symbol)>),
+    Anon(Vec<(usize, &'a Symbol)>),
+}
+
+pub fn analyze_action<'a>(alt: &'a Alternative) -> AlternativeAction<'a> {
+    // We can't infer types for alternatives with actions
+    if let Some(ref code) = alt.action {
+        return AlternativeAction::User(code);
+    }
+
+    AlternativeAction::Default(analyze_expr(&alt.expr))
+}
+
+pub fn analyze_expr<'a>(expr: &'a ExprSymbol) -> Symbols<'a> {
+    // First look for named symbols.
+    let named_symbols: Vec<_> = expr.symbols
+        .iter()
+        .enumerate()
+        .filter_map(|(idx, sym)| match sym.kind {
+            SymbolKind::Name(ref id, ref sub) => Some((idx, id.clone(), &**sub)),
+            _ => None,
+        })
+        .collect();
+    if !named_symbols.is_empty() {
+        return Symbols::Named(named_symbols);
+    }
+
+    // Otherwise, make a tuple of the items they chose with `<>`.
+    let chosen_symbol_types: Vec<_> = expr.symbols
+        .iter()
+        .enumerate()
+        .filter_map(|(idx, sym)| match sym.kind {
+            SymbolKind::Choose(ref sub) => Some((idx, &**sub)),
+            _ => None,
+        })
+        .collect();
+    if !chosen_symbol_types.is_empty() {
+        return Symbols::Anon(chosen_symbol_types);
+    }
+
+    // If they didn't choose anything with `<>`, make a tuple of everything.
+    Symbols::Anon(expr.symbols.iter().enumerate().collect())
+}
+
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Presence {
+    None,
+    InCurlyBrackets,
+    Normal,
+}
+
+impl Presence {
+    pub fn is_in_curly_brackets(&self) -> bool {
+        *self == Presence::InCurlyBrackets
+    }
+}
+
+pub fn check_between_braces(action: &str) -> Presence {
+    if let Some(funky_index) = action.find("<>") {
+        let (before, after) = {
+            let (before, after) = action.split_at(funky_index);
+            (before.trim(), after[2..].trim())
+        };
+
+        let last_before = before.chars().last();
+        let next_after = after.chars().next();
+        if let (Some('{'), Some('}')) = (last_before, next_after) {
+            Presence::InCurlyBrackets
+        } else {
+            Presence::Normal
+        }
+    } else {
+        Presence::None
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn detecting_normal_funky_expression() {
+        assert_eq!(Presence::Normal, check_between_braces("<>"));
+        assert_eq!(Presence::Normal, check_between_braces("ble <> blaa"));
+        assert_eq!(Presence::Normal, check_between_braces("ble <> } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <> } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <>} b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ <> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{<> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{<>"));
+        assert_eq!(Presence::Normal, check_between_braces("<>}"));
+    }
+
+    #[test]
+    fn detecting_nopresence_of_funky_expression() {
+        assert_eq!(Presence::None, check_between_braces("< >"));
+        assert_eq!(Presence::None, check_between_braces("ble <b> blaa"));
+    }
+
+    #[test]
+    fn detecting_incurlybrackets_funky_expression() {
+        assert_eq!(Presence::InCurlyBrackets, check_between_braces("{<>}"));
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("ble{<> }blaa")
+        );
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("ble{ <> } b")
+        );
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("bl{         <>} b")
+        );
+        assert_eq!(Presence::InCurlyBrackets, check_between_braces("bl{<>} b"));
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("bl{<>         } b")
+        );
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/prevalidate/mod.rs
@@ -0,0 +1,296 @@
+//! Validate checks some basic safety conditions.
+
+use super::{NormError, NormResult};
+use super::norm_util::{self, Symbols};
+
+use grammar::consts::*;
+use grammar::parse_tree::*;
+use grammar::repr as r;
+use string_cache::DefaultAtom as Atom;
+use collections::{set, Multimap};
+use util::Sep;
+
+#[cfg(test)]
+mod test;
+
+pub fn validate(grammar: &Grammar) -> NormResult<()> {
+    let match_token: Option<&MatchToken> = grammar
+        .items
+        .iter()
+        .filter_map(|item| item.as_match_token())
+        .next();
+
+    let extern_token: Option<&ExternToken> = grammar
+        .items
+        .iter()
+        .filter_map(|item| item.as_extern_token())
+        .next();
+
+    let validator = Validator {
+        grammar: grammar,
+        match_token: match_token,
+        extern_token: extern_token,
+    };
+
+    validator.validate()
+}
+
+struct Validator<'grammar> {
+    grammar: &'grammar Grammar,
+    match_token: Option<&'grammar MatchToken>,
+    extern_token: Option<&'grammar ExternToken>,
+}
+
+impl<'grammar> Validator<'grammar> {
+    fn validate(&self) -> NormResult<()> {
+        let allowed_names = vec![
+            Atom::from(LALR),
+            Atom::from(TABLE_DRIVEN),
+            Atom::from(RECURSIVE_ASCENT),
+            Atom::from(TEST_ALL),
+        ];
+        for annotation in &self.grammar.annotations {
+            if !allowed_names.contains(&annotation.id) {
+                return_err!(
+                    annotation.id_span,
+                    "unrecognized annotation `{}`",
+                    annotation.id
+                );
+            }
+        }
+
+        for item in &self.grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+
+                GrammarItem::MatchToken(ref data) => {
+                    if data.span != self.match_token.unwrap().span {
+                        return_err!(data.span, "multiple match definitions are not permitted");
+                    }
+
+                    // Only error if a custom lexer is specified, having a custom types is ok
+                    if let Some(d) = self.extern_token {
+                        if d.enum_token.is_some() {
+                            return_err!(
+                                d.span,
+                                "extern (with custom tokens) and match definitions are mutually exclusive");
+                        }
+                    }
+
+                    // Ensure that the catch all is final item of final block
+                    for (contents_idx, match_contents) in data.contents.iter().enumerate() {
+                        for (item_idx, item) in match_contents.items.iter().enumerate() {
+                            if item.is_catch_all()
+                                && (contents_idx != &data.contents.len() - 1
+                                    || item_idx != &match_contents.items.len() - 1)
+                            {
+                                return_err!(item.span(), "Catch all must be final item");
+                            } else {
+                                println!("ok");
+                            }
+                        }
+                    }
+                }
+
+                GrammarItem::ExternToken(ref data) => {
+                    if data.span != self.extern_token.unwrap().span {
+                        return_err!(data.span, "multiple extern definitions are not permitted");
+                    }
+
+                    // Only error if a custom lexer is specified, having a custom types is ok
+                    if let Some(d) = self.match_token {
+                        if data.enum_token.is_some() {
+                            return_err!(
+                                d.span,
+                                "match and extern (with custom tokens) definitions are mutually exclusive");
+                        }
+                    }
+
+                    let allowed_names = vec![Atom::from(LOCATION), Atom::from(ERROR)];
+                    let mut new_names = set();
+                    for associated_type in &data.associated_types {
+                        if !allowed_names.contains(&associated_type.type_name) {
+                            return_err!(
+                                associated_type.type_span,
+                                "associated type `{}` not recognized, \
+                                 try one of the following: {}",
+                                associated_type.type_name,
+                                Sep(", ", &allowed_names)
+                            );
+                        } else if !new_names.insert(associated_type.type_name.clone()) {
+                            return_err!(
+                                associated_type.type_span,
+                                "associated type `{}` already specified",
+                                associated_type.type_name
+                            );
+                        }
+                    }
+                }
+                GrammarItem::Nonterminal(ref data) => {
+                    if data.visibility.is_pub() && !data.args.is_empty() {
+                        return_err!(data.span, "macros cannot be marked public");
+                    }
+                    let inline_annotation = Atom::from(INLINE);
+                    let known_annotations = vec![inline_annotation.clone()];
+                    let mut found_annotations = set();
+                    for annotation in &data.annotations {
+                        if !known_annotations.contains(&annotation.id) {
+                            return_err!(
+                                annotation.id_span,
+                                "unrecognized annotation `{}`",
+                                annotation.id
+                            );
+                        } else if !found_annotations.insert(annotation.id.clone()) {
+                            return_err!(
+                                annotation.id_span,
+                                "duplicate annotation `{}`",
+                                annotation.id
+                            );
+                        } else if annotation.id == inline_annotation && data.visibility.is_pub() {
+                            return_err!(
+                                annotation.id_span,
+                                "public items cannot be marked #[inline]"
+                            );
+                        }
+                    }
+
+                    for alternative in &data.alternatives {
+                        try!(self.validate_alternative(alternative));
+                    }
+                }
+                GrammarItem::InternToken(..) => {}
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_alternative(&self, alternative: &Alternative) -> NormResult<()> {
+        try!(self.validate_expr(&alternative.expr));
+
+        match norm_util::analyze_expr(&alternative.expr) {
+            Symbols::Named(syms) => {
+                if alternative.action.is_none() {
+                    let sym = syms.iter().map(|&(_, _, sym)| sym).next().unwrap();
+                    return_err!(
+                        sym.span,
+                        "named symbols (like `{}`) require a custom action",
+                        sym
+                    );
+                }
+            }
+            Symbols::Anon(_) => {
+                let empty_string = "".to_string();
+                let action = {
+                    match alternative.action {
+                        Some(ActionKind::User(ref action)) => action,
+                        Some(ActionKind::Fallible(ref action)) => action,
+                        _ => &empty_string,
+                    }
+                };
+                if norm_util::check_between_braces(action).is_in_curly_brackets() {
+                    return_err!(
+                        alternative.span,
+                        "Using `<>` between curly braces (e.g., `{{<>}}`) only works when your parsed values have been given names (e.g., `<x:Foo>`, not just `<Foo>`)");
+                }
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_expr(&self, expr: &ExprSymbol) -> NormResult<()> {
+        for symbol in &expr.symbols {
+            try!(self.validate_symbol(symbol));
+        }
+
+        let chosen: Vec<&Symbol> = expr.symbols
+            .iter()
+            .filter(|sym| match sym.kind {
+                SymbolKind::Choose(_) => true,
+                _ => false,
+            })
+            .collect();
+
+        let named: Multimap<Atom, Vec<&Symbol>> = expr.symbols
+            .iter()
+            .filter_map(|sym| match sym.kind {
+                SymbolKind::Name(ref nt, _) => Some((nt.clone(), sym)),
+                _ => None,
+            })
+            .collect();
+
+        if !chosen.is_empty() && !named.is_empty() {
+            return_err!(
+                chosen[0].span,
+                "anonymous symbols like this one cannot be combined with \
+                 named symbols like `{}`",
+                named.into_iter().next().unwrap().1[0]
+            );
+        }
+
+        for (name, syms) in named.into_iter() {
+            if syms.len() > 1 {
+                return_err!(
+                    syms[1].span,
+                    "multiple symbols named `{}` are not permitted",
+                    name
+                );
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_symbol(&self, symbol: &Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                try!(self.validate_expr(expr));
+            }
+            SymbolKind::AmbiguousId(_) => { /* see resolve */ }
+            SymbolKind::Terminal(_) => { /* see postvalidate! */ }
+            SymbolKind::Nonterminal(_) => { /* see resolve */ }
+            SymbolKind::Error => {
+                let mut algorithm = r::Algorithm::default();
+                read_algorithm(&self.grammar.annotations, &mut algorithm);
+                if algorithm.codegen == r::LrCodeGeneration::RecursiveAscent {
+                    return_err!(
+                        symbol.span,
+                        "error recovery is not yet supported by recursive ascent parsers"
+                    );
+                }
+            }
+            SymbolKind::Macro(ref msym) => {
+                debug_assert!(msym.args.len() > 0);
+                for arg in &msym.args {
+                    try!(self.validate_symbol(arg));
+                }
+            }
+            SymbolKind::Repeat(ref repeat) => {
+                try!(self.validate_symbol(&repeat.symbol));
+            }
+            SymbolKind::Choose(ref sym) | SymbolKind::Name(_, ref sym) => {
+                try!(self.validate_symbol(sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind => {
+                // if using an internal tokenizer, lookahead/lookbehind are ok.
+                if let Some(extern_token) = self.extern_token {
+                    if extern_token.enum_token.is_some() {
+                        // otherwise, the Location type must be specified.
+                        let loc = Atom::from(LOCATION);
+                        if self.extern_token.unwrap().associated_type(loc).is_none() {
+                            return_err!(
+                                symbol.span,
+                                "lookahead/lookbehind require you to declare the type of \
+                                 a location; add a `type {} = ..` statement to the extern token \
+                                 block",
+                                LOCATION
+                            );
+                        }
+                    }
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/prevalidate/test.rs
@@ -0,0 +1,151 @@
+use parser;
+use test_util;
+
+fn check_err(expected_err: &str, grammar: &str, span: &str) {
+    let parsed_grammar = parser::parse_grammar(&grammar).unwrap();
+    let err = super::validate(&parsed_grammar).unwrap_err();
+    test_util::check_norm_err(expected_err, span, err);
+}
+
+#[test]
+fn named_symbols() {
+    check_err(
+        r#"named symbols \(like `"Num"`\) require a custom action"#,
+        r#"grammar; Term = { <n:"Num"> };"#,
+        r#"                     ~~~~~    "#,
+    );
+}
+
+#[test]
+fn bad_assoc_type() {
+    check_err(
+        r#"associated type `Foo` not recognized"#,
+        r#"grammar; extern { type Foo = i32; enum Tok { } }"#,
+        r#"                       ~~~                      "#,
+    );
+}
+
+#[test]
+fn dup_assoc_type() {
+    check_err(
+        r#"associated type `Location` already specified"#,
+        r#"grammar; extern { type Location = i32; type Location = u32; enum Tok { } }"#,
+        r#"                                            ~~~~~~~~                      "#,
+    );
+}
+
+#[test]
+fn lookahead_without_loc_type() {
+    check_err(
+        r#"lookahead/lookbehind require you to declare the type of a location"#,
+        r#"grammar; extern { enum Tok { } } Foo = @L;"#,
+        r#"                                       ~~ "#,
+    );
+}
+
+#[test]
+fn multiple_extern_token() {
+    check_err(
+        r#"multiple extern definitions are not permitted"#,
+        r#"grammar; extern { enum Tok { } } extern { enum Tok { } }"#,
+        r#"                                 ~~~~~~                 "#,
+    );
+}
+
+#[test]
+fn unrecognized_annotation() {
+    check_err(
+        r#"unrecognized annotation `foo`"#,
+        r#"grammar; #[foo] Term = ();"#,
+        r#"           ~~~            "#,
+    );
+}
+
+#[test]
+fn duplicate_annotation() {
+    check_err(
+        r#"duplicate annotation `inline`"#,
+        r#"grammar; #[inline] #[inline] Term = ();"#,
+        r#"                     ~~~~~~            "#,
+    );
+}
+
+#[test]
+fn pub_inline_annotation() {
+    check_err(
+        r#"public items cannot be marked #\[inline\]"#,
+        r#"grammar; #[inline] pub Term = ();"#,
+        r#"           ~~~~~~            "#,
+    );
+}
+
+#[test]
+fn multiple_match_token() {
+    check_err(
+        r#"multiple match definitions are not permitted"#,
+        r#"grammar; match { _ } match { _ }"#,
+        r#"                     ~~~~~      "#,
+    );
+}
+
+#[test]
+fn match_after_extern_token() {
+    check_err(
+        r#"match and extern \(with custom tokens\) definitions are mutually exclusive"#,
+        r#"grammar; extern { enum Tok { } } match { _ }"#,
+        r#"                                 ~~~~~      "#,
+    );
+}
+
+#[test]
+fn extern_after_match_token() {
+    check_err(
+        r#"extern \(with custom tokens\) and match definitions are mutually exclusive"#,
+        r#"grammar; match { _ } extern { enum Tok { } }"#,
+        r#"                     ~~~~~~                 "#,
+    );
+}
+
+#[test]
+fn match_catch_all_first_of_last() {
+    check_err(
+        r#"Catch all must be final item"#,
+        r#"grammar; match { _, "abc" }"#,
+        r#"                 ~         "#,
+    );
+}
+
+#[test]
+fn match_catch_all_last_of_first() {
+    check_err(
+        r#"Catch all must be final item"#,
+        r#"grammar; match { "abc", _ } else { "foo" }"#,
+        r#"                        ~                 "#,
+    );
+}
+
+#[test]
+fn expandable_expression_requires_named_variables() {
+    check_err(
+        r#"Using `<>` between curly braces \(e.g., `\{<>\}`\) only works when your parsed values have been given names \(e.g., `<x:Foo>`, not just `<Foo>`\)"#,
+        r#"grammar; Term = { <A> => Foo {<>} };"#,
+        r#"                  ~~~~~~~~~~~~~~~~  "#);
+}
+
+#[test]
+fn mixing_names_and_anonymous_values() {
+    check_err(
+        r#"anonymous symbols like this one cannot be combined with named symbols like `b:B`"#,
+        r#"grammar; Term = { <A> <b:B> => Alien: Eighth passanger of Nostromo};"#,
+        r#"                  ~~~                                               "#,
+    );
+}
+
+#[test]
+fn public_macros() {
+    check_err(
+        r#"macros cannot be marked public"#,
+        r#"grammar; pub Comma<T> = (T ",")* T?;"#,
+        r#"             ~~~~~~~~               "#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/resolve/mod.rs
@@ -0,0 +1,298 @@
+//! Resolves identifiers to decide if they are macros, terminals, or
+//! nonterminals. Rewrites the parse tree accordingly.
+
+use super::{NormError, NormResult};
+
+use grammar::parse_tree::*;
+use string_cache::DefaultAtom as Atom;
+use collections::{map, Map};
+
+#[cfg(test)]
+mod test;
+
+pub fn resolve(mut grammar: Grammar) -> NormResult<Grammar> {
+    try!(resolve_in_place(&mut grammar));
+    Ok(grammar)
+}
+
+fn resolve_in_place(grammar: &mut Grammar) -> NormResult<()> {
+    let globals = {
+        let nonterminal_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .map(|nt| {
+                (
+                    nt.span.clone(),
+                    nt.name.0.clone(),
+                    Def::Nonterminal(nt.args.len()),
+                )
+            });
+
+        let terminal_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_extern_token())
+            .flat_map(|extern_token| extern_token.enum_token.as_ref())
+            .flat_map(|enum_token| &enum_token.conversions)
+            .filter_map(|conversion| match conversion.from {
+                TerminalString::Literal(..) | TerminalString::Error => None,
+                TerminalString::Bare(ref id) => Some((conversion.span, id.clone(), Def::Terminal)),
+            });
+
+        // Extract all the bare identifiers that appear in the RHS of a `match` declaration.
+        // Example:
+        //     match {
+        //         r"(?)begin" => "BEGIN",
+        //     } else {
+        //         r"[a-zA-Z_][a-zA-Z0-9_]*" => ID,
+        //     }
+        // This would result in `vec![ID]`.
+        let match_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_match_token())
+            .flat_map(|match_token| &match_token.contents)
+            .flat_map(|match_contents| &match_contents.items)
+            .filter_map(|item| match *item {
+                MatchItem::Mapped(_, TerminalString::Bare(ref id), _) => {
+                    Some((item.span(), id.clone(), Def::Terminal))
+                }
+                _ => None,
+            });
+
+        let all_identifiers = nonterminal_identifiers
+            .chain(terminal_identifiers)
+            .chain(match_identifiers);
+
+        let mut identifiers = map();
+        for (span, id, def) in all_identifiers {
+            if let Some(old_def) = identifiers.insert(id.clone(), def) {
+                let description = def.description();
+                let old_description = old_def.description();
+                if description == old_description {
+                    return_err!(span, "two {}s declared with the name `{}`", description, id);
+                } else {
+                    return_err!(
+                        span,
+                        "{} and {} both declared with the name `{}`",
+                        description,
+                        old_description,
+                        id
+                    );
+                }
+            }
+        }
+
+        ScopeChain {
+            previous: None,
+            identifiers: identifiers,
+        }
+    };
+
+    let validator = Validator { globals: globals };
+
+    validator.validate(grammar)
+}
+
+struct Validator {
+    globals: ScopeChain<'static>,
+}
+
+#[derive(Copy, Clone, Debug)]
+enum Def {
+    Terminal,
+    Nonterminal(usize), // argument is the number of macro arguments
+    MacroArg,
+}
+
+#[derive(Debug)]
+struct ScopeChain<'scope> {
+    previous: Option<&'scope ScopeChain<'scope>>,
+    identifiers: Map<Atom, Def>,
+}
+
+impl Def {
+    fn description(&self) -> &'static str {
+        match *self {
+            Def::Terminal => "terminal",
+            Def::Nonterminal(0) => "nonterminal",
+            Def::Nonterminal(_) => "macro",
+            Def::MacroArg => "macro argument",
+        }
+    }
+}
+
+impl Validator {
+    fn validate(&self, grammar: &mut Grammar) -> NormResult<()> {
+        for item in &mut grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+                GrammarItem::MatchToken(..) => {}
+                GrammarItem::InternToken(..) => {}
+                GrammarItem::ExternToken(..) => {}
+                GrammarItem::Nonterminal(ref mut data) => {
+                    let identifiers = try!(self.validate_macro_args(data.span, &data.args));
+                    let locals = ScopeChain {
+                        previous: Some(&self.globals),
+                        identifiers: identifiers,
+                    };
+                    for alternative in &mut data.alternatives {
+                        try!(self.validate_alternative(&locals, alternative));
+                    }
+                }
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_macro_args(
+        &self,
+        span: Span,
+        args: &[NonterminalString],
+    ) -> NormResult<Map<Atom, Def>> {
+        for (index, arg) in args.iter().enumerate() {
+            if args[..index].contains(&arg) {
+                return_err!(
+                    span,
+                    "multiple macro arguments declared with the name `{}`",
+                    arg
+                );
+            }
+        }
+        Ok(args.iter()
+            .map(|nt| (nt.0.clone(), Def::MacroArg))
+            .collect())
+    }
+
+    fn validate_alternative(
+        &self,
+        scope: &ScopeChain,
+        alternative: &mut Alternative,
+    ) -> NormResult<()> {
+        if let Some(ref condition) = alternative.condition {
+            let def = try!(self.validate_id(scope, condition.span.clone(), &condition.lhs.0));
+            match def {
+                Def::MacroArg => { /* OK */ }
+                _ => {
+                    return_err!(
+                        condition.span,
+                        "only macro arguments can be used in conditions, \
+                         not {}s like `{}`",
+                        def.description(),
+                        condition.lhs
+                    );
+                }
+            }
+        }
+
+        try!(self.validate_expr(scope, &mut alternative.expr));
+
+        Ok(())
+    }
+
+    fn validate_expr(&self, scope: &ScopeChain, expr: &mut ExprSymbol) -> NormResult<()> {
+        for symbol in &mut expr.symbols {
+            try!(self.validate_symbol(scope, symbol));
+        }
+
+        Ok(())
+    }
+
+    fn validate_symbol(&self, scope: &ScopeChain, symbol: &mut Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref mut expr) => {
+                try!(self.validate_expr(scope, expr));
+            }
+            SymbolKind::AmbiguousId(_) => {
+                try!(self.rewrite_ambiguous_id(scope, symbol));
+            }
+            SymbolKind::Terminal(_) => { /* see postvalidate! */ }
+            SymbolKind::Nonterminal(ref id) => {
+                // in normal operation, the parser never produces Nonterminal(_) entries,
+                // but during testing we do produce nonterminal entries
+                let def = try!(self.validate_id(scope, symbol.span, &id.0));
+                match def {
+                    Def::Nonterminal(0) | Def::MacroArg => {
+                        // OK
+                    }
+                    Def::Terminal | Def::Nonterminal(_) => {
+                        return_err!(
+                            symbol.span,
+                            "`{}` is a {}, not a nonterminal",
+                            def.description(),
+                            id
+                        );
+                    }
+                }
+            }
+            SymbolKind::Macro(ref mut msym) => {
+                debug_assert!(msym.args.len() > 0);
+                let def = try!(self.validate_id(scope, symbol.span, &msym.name.0));
+                match def {
+                    Def::Nonterminal(0) | Def::Terminal | Def::MacroArg => return_err!(
+                        symbol.span,
+                        "`{}` is a {}, not a macro",
+                        def.description(),
+                        msym.name
+                    ),
+                    Def::Nonterminal(arity) => {
+                        if arity != msym.args.len() {
+                            return_err!(
+                                symbol.span,
+                                "wrong number of arguments to `{}`: \
+                                 expected {}, found {}",
+                                msym.name,
+                                arity,
+                                msym.args.len()
+                            );
+                        }
+                    }
+                }
+
+                for arg in &mut msym.args {
+                    try!(self.validate_symbol(scope, arg));
+                }
+            }
+            SymbolKind::Repeat(ref mut repeat) => {
+                try!(self.validate_symbol(scope, &mut repeat.symbol));
+            }
+            SymbolKind::Choose(ref mut sym) | SymbolKind::Name(_, ref mut sym) => {
+                try!(self.validate_symbol(scope, sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind | SymbolKind::Error => {}
+        }
+
+        Ok(())
+    }
+
+    fn rewrite_ambiguous_id(&self, scope: &ScopeChain, symbol: &mut Symbol) -> NormResult<()> {
+        let id = if let SymbolKind::AmbiguousId(ref name) = symbol.kind {
+            name.clone()
+        } else {
+            panic!("Should never happen.");
+        };
+        symbol.kind = match try!(self.validate_id(scope, symbol.span, &id)) {
+            Def::MacroArg | Def::Nonterminal(0) => SymbolKind::Nonterminal(NonterminalString(id)),
+            Def::Terminal => SymbolKind::Terminal(TerminalString::Bare(id)),
+            Def::Nonterminal(_) => return_err!(symbol.span, "`{}` is a macro", id),
+        };
+        Ok(())
+    }
+
+    fn validate_id(&self, scope: &ScopeChain, span: Span, id: &Atom) -> NormResult<Def> {
+        match scope.def(id) {
+            Some(def) => Ok(def),
+            None => return_err!(span, "no definition found for `{}`", id),
+        }
+    }
+}
+
+impl<'scope> ScopeChain<'scope> {
+    fn def(&self, id: &Atom) -> Option<Def> {
+        self.identifiers
+            .get(id)
+            .cloned()
+            .or_else(|| self.previous.and_then(|s| s.def(id)))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/resolve/test.rs
@@ -0,0 +1,82 @@
+use parser;
+use grammar::parse_tree::Span;
+use regex::Regex;
+
+fn check_err(expected_err: &str, grammar: &str) {
+    let expected_err = Regex::new(expected_err).unwrap();
+
+    // the string will have a `>>>` and `<<<` in it, which serve to
+    // indicate the span where an error is expected.
+    let start_index = grammar.find(">>>").unwrap();
+    let grammar = grammar.replace(">>>", ""); // remove the `>>>` marker
+    let end_index = grammar.rfind("<<<").unwrap();
+    let grammar = grammar.replace("<<<", "");
+
+    assert!(start_index <= end_index);
+
+    let parsed_grammar = parser::parse_grammar(&grammar).unwrap();
+    match super::resolve(parsed_grammar) {
+        Ok(_) => {
+            panic!("expected error for grammar");
+        }
+        Err(err) => {
+            assert_eq!(err.span, Span(start_index, end_index));
+            assert!(
+                expected_err.is_match(&err.message),
+                "unexpected error text `{}`, did not match `{}`",
+                err.message,
+                expected_err
+            );
+        }
+    }
+}
+
+#[test]
+fn unknown_nonterminal() {
+    check_err("no definition found for `Y`", r#"grammar; X = X >>>Y<<<;"#);
+}
+
+#[test]
+fn unknown_nonterminal_in_macro_arg() {
+    check_err(
+        "no definition found for `Y`",
+        r#"grammar; X = X Id<>>>Y<<<>; Id<T> = T;"#,
+    );
+}
+
+#[test]
+fn unknown_nonterminal_in_repeat_question() {
+    check_err("no definition found for `Y`", r#"grammar; X = >>>Y<<<?;"#);
+}
+
+#[test]
+fn unknown_nonterminal_two() {
+    check_err(
+        "no definition found for `Expr`",
+        r#"grammar; Term = { <n:"Num"> => n.as_num(), "A" <>>>Expr<<<> "B" };"#,
+    );
+}
+
+#[test]
+fn double_nonterminal() {
+    check_err(
+        "two nonterminals declared with the name `A`",
+        r#"grammar; A = "Foo"; >>>A<<< = "Bar";"#,
+    );
+}
+
+#[test]
+fn repeated_macro_arg() {
+    check_err(
+        "multiple macro arguments declared with the name `Y`",
+        r#"grammar; >>>X<Y,Y><<< = "foo";"#,
+    );
+}
+
+#[test]
+fn overlapping_terminal_and_nonterminal() {
+    check_err(
+        "terminal and nonterminal both declared with the name `A`",
+        r#"grammar; A = "Foo"; extern { enum Foo { >>>A => Foo::A(..) <<<} }"#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/token_check/mod.rs
@@ -0,0 +1,424 @@
+//! If an extern token is provided, then this pass validates that
+//! terminal IDs have conversions. Otherwise, it generates a
+//! tokenizer. This can only be done after macro expansion because
+//! some macro arguments never make it into an actual production and
+//! are only used in `if` conditions; we use string literals for
+//! those, but they do not have to have a defined conversion.
+
+use super::{NormError, NormResult};
+
+use string_cache::DefaultAtom as Atom;
+use lexer::re;
+use lexer::dfa::{self, DFAConstructionError, Precedence};
+use lexer::nfa::NFAConstructionError::*;
+use grammar::consts::*;
+use grammar::parse_tree::*;
+use collections::{Map, Set};
+
+#[cfg(test)]
+mod test;
+
+pub fn validate(mut grammar: Grammar) -> NormResult<Grammar> {
+    let mode = {
+        let mode = if let Some(enum_token) = grammar.enum_token() {
+            assert!(
+                grammar.match_token().is_none(),
+                "validator permitted both an extern/match section"
+            );
+
+            TokenMode::Extern {
+                conversions: enum_token
+                    .conversions
+                    .iter()
+                    .map(|conversion| conversion.from.clone())
+                    .collect(),
+            }
+        } else {
+            TokenMode::Internal {
+                match_block: MatchBlock::new(grammar.match_token())?,
+            }
+        };
+
+        let mut validator = Validator {
+            grammar: &grammar,
+            mode: mode,
+        };
+
+        validator.validate()?;
+
+        validator.mode
+    };
+
+    match mode {
+        TokenMode::Extern { .. } => {
+            // If using an external tokenizer, we're all done at this point.
+        }
+        TokenMode::Internal { match_block } => {
+            // Otherwise, construct the `InternToken` item.
+            construct(&mut grammar, match_block)?;
+        }
+    }
+
+    Ok(grammar)
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Validation phase -- this phase walks the grammar and visits all
+// terminals. If using an external set of tokens, it checks that all
+// terminals have a defined conversion to some pattern. Otherwise,
+// it collects all terminals into the `all_literals` set for later use.
+
+struct Validator<'grammar> {
+    grammar: &'grammar Grammar,
+    mode: TokenMode,
+}
+
+enum TokenMode {
+    /// If there is an `extern { ... }` section that defines
+    /// conversions of the form `TERMINAL => PATTERN`, then this is a
+    /// set of those terminals. These are the only terminals that the
+    /// user should be using.
+    Extern { conversions: Set<TerminalString> },
+
+    /// Otherwise, we are synthesizing the tokenizer. In that case,
+    /// `match_block` summarizes the data from the `match { ... }`
+    /// section, if any. If there was no `match` section, or the
+    /// section contains a wildcard, the user can also use additional
+    /// terminals in the grammar.
+    Internal { match_block: MatchBlock },
+}
+
+/// Data summarizing the `match { }` block, along with any literals we
+/// scraped up.
+#[derive(Default)]
+struct MatchBlock {
+    /// This map stores the `match { }` entries. If `match_catch_all`
+    /// is true, then we will grow this set with "identity mappings"
+    /// for new literals that we find.
+    match_entries: Vec<MatchEntry>,
+
+    /// The names of all terminals the user can legally type. If
+    /// `match_catch_all` is true, then if we encounter additional
+    /// terminal literals in the grammar, we will add them to this
+    /// set.
+    match_user_names: Set<TerminalString>,
+
+    /// For each terminal literal that we have to match, the span
+    /// where it appeared in user's source.  This can either be in the
+    /// `match { }` section or else in the grammar somewhere (if added
+    /// due to a catch-all, or there is no match section).
+    spans: Map<TerminalLiteral, Span>,
+
+    /// True if we should permit unrecognized literals to be used.
+    catch_all: bool,
+}
+
+impl MatchBlock {
+    /// Creates a `MatchBlock` by reading the data out of the `match {
+    /// ... }` block that the user provided (if any).
+    fn new(opt_match_token: Option<&MatchToken>) -> NormResult<Self> {
+        let mut match_block = Self::default();
+        if let Some(match_token) = opt_match_token {
+            for (idx, mc) in match_token.contents.iter().enumerate() {
+                let precedence = &match_token.contents.len() - idx;
+                for item in &mc.items {
+                    match *item {
+                        MatchItem::Unmapped(ref sym, span) => {
+                            match_block.add_match_entry(
+                                precedence,
+                                sym.clone(),
+                                TerminalString::Literal(sym.clone()),
+                                span,
+                            )?;
+                        }
+                        MatchItem::Mapped(ref sym, ref user, span) => {
+                            match_block.add_match_entry(
+                                precedence,
+                                sym.clone(),
+                                user.clone(),
+                                span,
+                            )?;
+                        }
+                        MatchItem::CatchAll(_) => {
+                            match_block.catch_all = true;
+                        }
+                    }
+                }
+            }
+        } else {
+            // no match block is equivalent to `match { _ }`
+            match_block.catch_all = true;
+        }
+        Ok(match_block)
+    }
+
+    fn add_match_entry(
+        &mut self,
+        match_group_precedence: usize,
+        sym: TerminalLiteral,
+        user_name: TerminalString,
+        span: Span,
+    ) -> NormResult<()> {
+        if let Some(_old_span) = self.spans.insert(sym.clone(), span) {
+            return_err!(span, "multiple match entries for `{}`", sym);
+        }
+
+        // NB: It's legal for multiple regex to produce same terminal.
+        self.match_user_names.insert(user_name.clone());
+
+        self.match_entries.push(MatchEntry {
+            precedence: match_group_precedence * 2 + sym.base_precedence(),
+            match_literal: sym,
+            user_name: user_name,
+        });
+        Ok(())
+    }
+
+    fn add_literal_from_grammar(&mut self, sym: TerminalLiteral, span: Span) -> NormResult<()> {
+        // Already saw this literal, maybe in a match entry, maybe in the grammar.
+        if self.match_user_names
+            .contains(&TerminalString::Literal(sym.clone()))
+        {
+            return Ok(());
+        }
+
+        if !self.catch_all {
+            return_err!(
+                span,
+                "terminal `{}` does not have a match mapping defined for it",
+                sym
+            );
+        }
+
+        self.match_user_names
+            .insert(TerminalString::Literal(sym.clone()));
+
+        self.match_entries.push(MatchEntry {
+            precedence: sym.base_precedence(),
+            match_literal: sym.clone(),
+            user_name: TerminalString::Literal(sym.clone()),
+        });
+
+        self.spans.insert(sym, span);
+
+        Ok(())
+    }
+}
+
+impl<'grammar> Validator<'grammar> {
+    fn validate(&mut self) -> NormResult<()> {
+        for item in &self.grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+                GrammarItem::MatchToken(..) => {}
+                GrammarItem::ExternToken(_) => {}
+                GrammarItem::InternToken(_) => {}
+                GrammarItem::Nonterminal(ref data) => for alternative in &data.alternatives {
+                    try!(self.validate_alternative(alternative));
+                },
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_alternative(&mut self, alternative: &Alternative) -> NormResult<()> {
+        assert!(alternative.condition.is_none()); // macro expansion should have removed these
+        try!(self.validate_expr(&alternative.expr));
+        Ok(())
+    }
+
+    fn validate_expr(&mut self, expr: &ExprSymbol) -> NormResult<()> {
+        for symbol in &expr.symbols {
+            try!(self.validate_symbol(symbol));
+        }
+        Ok(())
+    }
+
+    fn validate_symbol(&mut self, symbol: &Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                try!(self.validate_expr(expr));
+            }
+            SymbolKind::Terminal(ref term) => {
+                try!(self.validate_terminal(symbol.span, term));
+            }
+            SymbolKind::Nonterminal(_) => {}
+            SymbolKind::Repeat(ref repeat) => {
+                try!(self.validate_symbol(&repeat.symbol));
+            }
+            SymbolKind::Choose(ref sym) | SymbolKind::Name(_, ref sym) => {
+                try!(self.validate_symbol(sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind | SymbolKind::Error => {}
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+            SymbolKind::Macro(..) => {
+                panic!("macro not removed: {:?}", symbol);
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_terminal(&mut self, span: Span, term: &TerminalString) -> NormResult<()> {
+        match self.mode {
+            // If there is an extern token definition, validate that
+            // this terminal has a defined conversion.
+            TokenMode::Extern { ref conversions } => {
+                if !conversions.contains(term) {
+                    return_err!(
+                        span,
+                        "terminal `{}` does not have a pattern defined for it",
+                        term
+                    );
+                }
+            }
+
+            // If there is no extern token definition, then collect
+            // the terminal literals ("class", r"[a-z]+") into a set.
+            TokenMode::Internal {
+                ref mut match_block,
+            } => {
+                match *term {
+                    TerminalString::Bare(_) => assert!(
+                        match_block.match_user_names.contains(term),
+                        "bare terminal without match entry: {}",
+                        term
+                    ),
+
+                    TerminalString::Literal(ref l) => {
+                        match_block.add_literal_from_grammar(l.clone(), span)?
+                    }
+
+                    // Error is a builtin terminal that always exists
+                    TerminalString::Error => (),
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Construction phase -- if we are constructing a tokenizer, this
+// phase builds up an internal token DFA.
+
+fn construct(grammar: &mut Grammar, match_block: MatchBlock) -> NormResult<()> {
+    let MatchBlock {
+        mut match_entries,
+        spans,
+        ..
+    } = match_block;
+
+    // Sort match entries by order of increasing precedence.
+    match_entries.sort();
+
+    // Build up two vectors, one of parsed regular expressions and
+    // one of precedences, that are parallel with `literals`.
+    let mut regexs = Vec::with_capacity(match_entries.len());
+    let mut precedences = Vec::with_capacity(match_entries.len());
+    try!({
+        for match_entry in &match_entries {
+            precedences.push(Precedence(match_entry.precedence));
+            match match_entry.match_literal {
+                TerminalLiteral::Quoted(ref s) => {
+                    regexs.push(re::parse_literal(&s));
+                }
+                TerminalLiteral::Regex(ref s) => {
+                    match re::parse_regex(&s) {
+                        Ok(regex) => regexs.push(regex),
+                        Err(error) => {
+                            let literal_span = spans[&match_entry.match_literal];
+                            // FIXME -- take offset into account for
+                            // span; this requires knowing how many #
+                            // the user used, which we do not track
+                            return_err!(literal_span, "invalid regular expression: {}", error);
+                        }
+                    }
+                }
+            }
+        }
+        Ok(())
+    });
+
+    let dfa = match dfa::build_dfa(&regexs, &precedences) {
+        Ok(dfa) => dfa,
+        Err(DFAConstructionError::NFAConstructionError { index, error }) => {
+            let feature = match error {
+                NamedCaptures => r#"named captures (`(?P<foo>...)`)"#,
+                NonGreedy => r#""non-greedy" repetitions (`*?` or `+?`)"#,
+                WordBoundary => r#"word boundaries (`\b` or `\B`)"#,
+                LineBoundary => r#"line boundaries (`^` or `$`)"#,
+                TextBoundary => r#"text boundaries (`^` or `$`)"#,
+                ByteRegex => r#"byte-based matches"#,
+            };
+            let literal = &match_entries[index.index()].match_literal;
+            return_err!(
+                spans[literal],
+                "{} are not supported in regular expressions",
+                feature
+            )
+        }
+        Err(DFAConstructionError::Ambiguity { match0, match1 }) => {
+            let literal0 = &match_entries[match0.index()].match_literal;
+            let literal1 = &match_entries[match1.index()].match_literal;
+            // FIXME(#88) -- it'd be nice to give an example here
+            return_err!(
+                spans[literal0],
+                "ambiguity detected between the terminal `{}` and the terminal `{}`",
+                literal0,
+                literal1
+            )
+        }
+    };
+
+    grammar.items.push(GrammarItem::InternToken(InternToken {
+        match_entries: match_entries,
+        dfa: dfa,
+    }));
+
+    // we need to inject a `'input` lifetime and `input: &'input str` parameter as well:
+
+    let input_lifetime = Atom::from(INPUT_LIFETIME);
+    for parameter in &grammar.type_parameters {
+        match *parameter {
+            TypeParameter::Lifetime(ref i) if *i == input_lifetime => {
+                return_err!(
+                    grammar.span,
+                    "since there is no external token enum specified, \
+                     the `'input` lifetime is implicit and cannot be declared"
+                );
+            }
+            _ => {}
+        }
+    }
+
+    let input_parameter = Atom::from(INPUT_PARAMETER);
+    for parameter in &grammar.parameters {
+        if parameter.name == input_parameter {
+            return_err!(
+                grammar.span,
+                "since there is no external token enum specified, \
+                 the `input` parameter is implicit and cannot be declared"
+            );
+        }
+    }
+
+    grammar
+        .type_parameters
+        .insert(0, TypeParameter::Lifetime(input_lifetime.clone()));
+
+    let parameter = Parameter {
+        name: input_parameter,
+        ty: TypeRef::Ref {
+            lifetime: Some(input_lifetime),
+            mutable: false,
+            referent: Box::new(TypeRef::Id(Atom::from("str"))),
+        },
+    };
+    grammar.parameters.push(parameter);
+
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/token_check/test.rs
@@ -0,0 +1,203 @@
+use parser;
+use normalize::resolve::resolve;
+use normalize::NormResult;
+use lexer::dfa::interpret;
+use grammar::parse_tree::Grammar;
+use test_util;
+
+fn validate_grammar(grammar: &str) -> NormResult<Grammar> {
+    let parsed_grammar = parser::parse_grammar(&grammar).expect("parse grammar");
+    let parsed_grammar = resolve(parsed_grammar).expect("resolve");
+    super::validate(parsed_grammar)
+}
+
+fn check_err(expected_err: &str, grammar: &str, span: &str) {
+    let err = validate_grammar(&grammar).unwrap_err();
+    test_util::check_norm_err(expected_err, span, err);
+}
+
+fn check_intern_token(grammar: &str, expected_tokens: Vec<(&'static str, &'static str)>) {
+    let parsed_grammar = validate_grammar(&grammar).expect("validate");
+    let intern_token = parsed_grammar.intern_token().expect("intern_token");
+    println!("intern_token: {:?}", intern_token);
+    for (input, expected_user_name) in expected_tokens {
+        let actual_user_name =
+            interpret::interpret(&intern_token.dfa, input).map(|(index, text)| {
+                let user_name = &intern_token.match_entries[index.index()].user_name;
+                (user_name.clone(), text)
+            });
+        let actual_user_name = format!("{:?}", actual_user_name);
+        if expected_user_name != actual_user_name {
+            panic!(
+                "input `{}` matched `{}` but we expected `{}`",
+                input, actual_user_name, expected_user_name
+            );
+        }
+    }
+}
+
+#[test]
+fn unknown_terminal() {
+    check_err(
+        r#"terminal `"\+"` does not have a pattern defined for it"#,
+        r#"grammar; extern { enum Term { } } X = X "+";"#,
+        r#"                                        ~~~ "#,
+    );
+}
+
+#[test]
+fn unknown_id_terminal() {
+    check_err(
+        r#"terminal `"foo"` does not have a pattern defined for it"#,
+        r#"grammar; extern { enum Term { } } X = X "foo";"#,
+        r#"                                        ~~~~~ "#,
+    );
+}
+
+#[test]
+fn tick_input_lifetime_already_declared() {
+    check_err(
+        r#".*the `'input` lifetime is implicit and cannot be declared"#,
+        r#"grammar<'input>; X = X "foo";"#,
+        r#"~~~~~~~                      "#,
+    );
+}
+
+#[test]
+fn input_parameter_already_declared() {
+    check_err(
+        r#".*the `input` parameter is implicit and cannot be declared"#,
+        r#"grammar(input:u32); X = X "foo";"#,
+        r#"~~~~~~~                         "#,
+    );
+}
+
+#[test]
+fn invalid_regular_expression_unterminated_group() {
+    check_err(
+        r#"Unclosed parenthesis"#,
+        r#"grammar; X = X r"(123";"#,
+        r#"               ~~~~~~~ "#,
+    );
+}
+
+#[test]
+fn quoted_literals() {
+    check_intern_token(
+        r#"grammar; X = X "+" "-" "foo" "(" ")";"#,
+        vec![
+            ("+", r#"Some(("+", "+"))"#),
+            ("-", r#"Some(("-", "-"))"#),
+            ("(", r#"Some(("(", "("))"#),
+            (")", r#"Some((")", ")"))"#),
+            ("foo", r#"Some(("foo", "foo"))"#),
+            ("<", r#"None"#),
+        ],
+    );
+}
+
+#[test]
+fn regex_literals() {
+    check_intern_token(
+        r#"grammar; X = X r"[a-z]+" r"[0-9]+";"#,
+        vec![
+            ("a", r##"Some((r#"[a-z]+"#, "a"))"##),
+            ("def", r##"Some((r#"[a-z]+"#, "def"))"##),
+            ("1", r##"Some((r#"[0-9]+"#, "1"))"##),
+            ("9123456", r##"Some((r#"[0-9]+"#, "9123456"))"##),
+        ],
+    );
+}
+
+/// Basic test for match mappings.
+#[test]
+fn match_mappings() {
+    check_intern_token(
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } else { "abc" => ALPHA } X = "BEGIN" ALPHA;"#,
+        vec![
+            ("BEGIN", r##"Some(("BEGIN", "BEGIN"))"##),
+            ("begin", r##"Some(("BEGIN", "begin"))"##),
+            ("abc", r#"Some((ALPHA, "abc"))"#),
+        ],
+    );
+}
+
+/// Match mappings, exercising precedence. Here the ID regex *would*
+/// be ambiguous with the begin regex.
+#[test]
+fn match_precedence() {
+    check_intern_token(
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } else { r"\w+" => ID } X = ();"#,
+        vec![
+            ("BEGIN", r##"Some(("BEGIN", "BEGIN"))"##),
+            ("begin", r##"Some(("BEGIN", "begin"))"##),
+            ("abc", r#"Some((ID, "abc"))"#),
+        ],
+    );
+}
+
+/// Test that, without a `catch-all`, using unrecognized literals is an error.
+#[test]
+fn invalid_match_literal() {
+    check_err(
+        r#"terminal `"foo"` does not have a match mapping defined for it"#,
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } X = "foo";"#,
+        r#"                                               ~~~~~ "#,
+    );
+}
+
+/// Test that, without a `catch-all`, using unrecognized literals is an error.
+#[test]
+fn invalid_match_regex_literal() {
+    check_err(
+        r##"terminal `r#"foo"#` does not have a match mapping defined for it"##,
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } X = r"foo";"#,
+        r#"                                               ~~~~~~ "#,
+    );
+}
+
+/// Test that, with a catch-all, the previous two examples work.
+#[test]
+fn match_catch_all() {
+    let grammar = r#"grammar; match { r"(?i)begin" => "BEGIN", _ } X = { "foo", r"foo" };"#;
+    assert!(validate_grammar(&grammar).is_ok())
+}
+
+#[test]
+fn complex_match() {
+    let grammar = r##"
+        grammar;
+        match {
+            "abc"        => "ABC",
+            r"(?i)begin" => BEGIN
+        }
+
+        pub Query: String = {
+            "ABC" BEGIN => String::from("Success")
+        };
+"##;
+    assert!(validate_grammar(&grammar).is_ok())
+}
+
+/// Test that overlapping regular expressions are still forbidden within one level
+/// of a match declaration.
+#[test]
+fn ambiguity_within_match() {
+    check_err(
+        r##"ambiguity detected between the terminal `r#"b"#` and the terminal `r#"\(\?i\)b"#`"##,
+        r#"grammar; match { r"(?i)b" => "B", r"b" => "b" }"#,
+        r#"                                  ~~~~~~~~~~~~ "#,
+    );
+}
+
+/// Test that using the **exact same regular expression** twice is
+/// forbidden, even across multiple levels of the match expression.
+/// No good reason to do that.
+#[test]
+fn same_literal_twice() {
+    check_err(
+        r##"multiple match entries for `r#"\(\?i\)b"#`"##,
+        r#"grammar; match { r"(?i)b" => "B" } else { r"(?i)b" => "b" }"#,
+        r#"                                          ~~~~~~~~~~~~~~~~ "#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/tyinfer/mod.rs
@@ -0,0 +1,356 @@
+use super::{NormError, NormResult};
+use super::norm_util::{self, AlternativeAction, Symbols};
+
+use std::collections::{HashMap, HashSet};
+use grammar::consts::{ERROR, INPUT_LIFETIME, LOCATION};
+use grammar::parse_tree::{ActionKind, Alternative, Grammar, NonterminalData, NonterminalString,
+                          Path, Span, SymbolKind, TypeParameter, TypeRef};
+use grammar::repr::{NominalTypeRepr, TypeRepr, Types};
+use string_cache::DefaultAtom as Atom;
+
+#[cfg(test)]
+mod test;
+
+pub fn infer_types(grammar: &Grammar) -> NormResult<Types> {
+    let inferencer = try!(TypeInferencer::new(&grammar));
+    inferencer.infer_types()
+}
+
+struct TypeInferencer<'grammar> {
+    stack: Vec<NonterminalString>,
+    nonterminals: HashMap<NonterminalString, NT<'grammar>>,
+    types: Types,
+    type_parameters: HashSet<Atom>,
+}
+
+#[derive(Copy, Clone)]
+struct NT<'grammar> {
+    span: Span,
+    type_decl: &'grammar Option<TypeRef>,
+    alternatives: &'grammar Vec<Alternative>,
+}
+
+impl<'grammar> TypeInferencer<'grammar> {
+    fn new(grammar: &'grammar Grammar) -> NormResult<TypeInferencer<'grammar>> {
+        let types = TypeInferencer::make_types(grammar);
+
+        let nonterminals = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .map(|data| {
+                assert!(!data.is_macro_def()); // normalized away by now
+                (data.name.clone(), NT::new(data))
+            })
+            .collect();
+
+        let type_parameters = grammar
+            .type_parameters
+            .iter()
+            .filter_map(|p| match *p {
+                TypeParameter::Lifetime(_) => None,
+                TypeParameter::Id(ref ty) => Some(ty.clone()),
+            })
+            .collect();
+
+        Ok(TypeInferencer {
+            stack: vec![],
+            nonterminals: nonterminals,
+            types: types,
+            type_parameters: type_parameters,
+        })
+    }
+
+    fn make_types(grammar: &Grammar) -> Types {
+        let opt_extern_token = grammar.extern_token();
+
+        // Determine error type (if any).
+        let error_type = opt_extern_token.and_then(|extern_token| {
+            extern_token
+                .associated_type(Atom::from(ERROR))
+                .map(|tr| tr.type_ref.type_repr())
+        });
+
+        // Determine location type and enum type. If using an internal
+        // token, that's specified by us, not user.
+        if let Some(intern_token) = grammar.intern_token() {
+            let loc_type = // usize
+                TypeRepr::usize();
+            let input_str = // &'input str
+                TypeRepr::Ref {
+                    lifetime: Some(Atom::from(INPUT_LIFETIME)),
+                    mutable: false,
+                    referent: Box::new(TypeRepr::str())
+                };
+            let enum_type = // Token<'input>
+                TypeRepr::Nominal(NominalTypeRepr {
+                    path: Path {
+                        absolute: false,
+                        ids: vec![Atom::from("Token")],
+                    },
+                    types: vec![TypeRepr::Lifetime(Atom::from(INPUT_LIFETIME))]
+                });
+
+            let mut types = Types::new(&grammar.prefix, Some(loc_type), error_type, enum_type);
+
+            for match_entry in &intern_token.match_entries {
+                types.add_term_type(match_entry.user_name.clone(), input_str.clone());
+            }
+
+            types
+        } else {
+            let extern_token = opt_extern_token.unwrap();
+            let loc_type = extern_token
+                .associated_type(Atom::from(LOCATION))
+                .map(|tr| tr.type_ref.type_repr());
+            let enum_type = extern_token
+                .enum_token
+                .as_ref()
+                .unwrap()
+                .type_name
+                .type_repr();
+            let mut types = Types::new(&grammar.prefix, loc_type, error_type, enum_type);
+
+            // For each defined conversion, figure out the type of the
+            // terminal and enter it into `types` by hand if it is not the
+            // default. For terminals with custom types, the user should
+            // have one or more bindings in the pattern -- if more than
+            // one, make a tuple.
+            //
+            // e.g. "(" => Lparen(..) ==> no custom type
+            //      "Num" => Num(<u32>) ==> custom type is u32
+            //      "Fraction" => Real(<u32>,<u32>) ==> custom type is (u32, u32)
+            for conversion in grammar
+                .enum_token()
+                .into_iter()
+                .flat_map(|et| &et.conversions)
+            {
+                let mut tys = Vec::new();
+                conversion
+                    .to
+                    .for_each_binding(&mut |ty| tys.push(ty.type_repr()));
+                if tys.is_empty() {
+                    continue;
+                }
+                let ty = maybe_tuple(tys);
+                types.add_term_type(conversion.from.clone(), ty);
+            }
+
+            types
+        }
+    }
+
+    fn infer_types(mut self) -> NormResult<Types> {
+        let ids: Vec<NonterminalString> =
+            self.nonterminals.iter().map(|(id, _)| id.clone()).collect();
+
+        for id in ids {
+            try!(self.nonterminal_type(&id));
+            debug_assert!(self.types.lookup_nonterminal_type(&id).is_some());
+        }
+
+        Ok(self.types)
+    }
+
+    fn nonterminal_type(&mut self, id: &NonterminalString) -> NormResult<TypeRepr> {
+        if let Some(repr) = self.types.lookup_nonterminal_type(id) {
+            return Ok(repr.clone());
+        }
+
+        let nt = self.nonterminals[&id];
+        if self.stack.contains(&id) {
+            return_err!(
+                nt.span,
+                "cannot infer type of `{}` because it references itself",
+                id
+            );
+        }
+
+        let ty = try!(self.push(id, |this| {
+            if let &Some(ref type_decl) = nt.type_decl {
+                return this.type_ref(type_decl);
+            }
+
+            // Try to compute the types of all alternatives; note that
+            // some may result in an error. Don't report these errors
+            // (yet).
+            let mut alternative_types = vec![];
+            let mut alternative_errors = vec![];
+            for alt in nt.alternatives.iter() {
+                match this.alternative_type(alt) {
+                    Ok(t) => alternative_types.push(t),
+                    Err(e) => alternative_errors.push(e),
+                }
+            }
+
+            // if it never succeeded, report first error
+            if alternative_types.is_empty() {
+                match alternative_errors.into_iter().next() {
+                    Some(err) => {
+                        return Err(err);
+                    }
+                    None => {
+                        // if nothing succeeded, and nothing errored,
+                        // must have been nothing to start with
+                        return_err!(
+                            nt.span,
+                            "nonterminal `{}` has no alternatives and hence parse cannot succeed",
+                            id
+                        );
+                    }
+                }
+            }
+
+            // otherwise, check that all the cases where we had success agree
+            for ((ty, alt), i) in alternative_types[1..]
+                .iter()
+                .zip(&nt.alternatives[1..])
+                .zip(1..)
+            {
+                if &alternative_types[0] != ty {
+                    return_err!(
+                        alt.span,
+                        "type of alternative #{} is `{}`, \
+                         but type of first alternative is `{}`",
+                        i + 1,
+                        ty,
+                        alternative_types[0]
+                    );
+                }
+            }
+
+            // and use that type
+            Ok(alternative_types.pop().unwrap())
+        }));
+
+        self.types.add_type(id.clone(), ty.clone());
+        Ok(ty)
+    }
+
+    fn push<F, R>(&mut self, id: &NonterminalString, f: F) -> NormResult<R>
+    where
+        F: FnOnce(&mut TypeInferencer) -> NormResult<R>,
+    {
+        self.stack.push(id.clone());
+        let r = f(self);
+        assert_eq!(self.stack.pop().unwrap(), *id);
+        r
+    }
+
+    fn type_ref(&mut self, type_ref: &TypeRef) -> NormResult<TypeRepr> {
+        match *type_ref {
+            TypeRef::Tuple(ref types) => {
+                let types = try! {
+                    types.iter().map(|t| self.type_ref(t)).collect()
+                };
+                Ok(TypeRepr::Tuple(types))
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => {
+                if path.ids.len() == 2 && self.type_parameters.contains(&path.ids[0]) {
+                    return Ok(TypeRepr::Associated {
+                        type_parameter: path.ids[0].clone(),
+                        id: path.ids[1].clone(),
+                    });
+                }
+
+                let types = try! {
+                    types.iter().map(|t| self.type_ref(t)).collect()
+                };
+                Ok(TypeRepr::Nominal(NominalTypeRepr {
+                    path: path.clone(),
+                    types: types,
+                }))
+            }
+            TypeRef::Lifetime(ref id) => Ok(TypeRepr::Lifetime(id.clone())),
+            TypeRef::Id(ref id) => Ok(TypeRepr::Nominal(NominalTypeRepr {
+                path: Path::from_id(id.clone()),
+                types: vec![],
+            })),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => Ok(TypeRepr::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(try!(self.type_ref(referent))),
+            }),
+            TypeRef::OfSymbol(ref symbol) => self.symbol_type(symbol),
+        }
+    }
+
+    fn alternative_type(&mut self, alt: &Alternative) -> NormResult<TypeRepr> {
+        match norm_util::analyze_action(alt) {
+            AlternativeAction::User(&ActionKind::User(_))
+            | AlternativeAction::User(&ActionKind::Fallible(_)) => {
+                return_err!(
+                    alt.span,
+                    "cannot infer types if there is custom action code"
+                );
+            }
+
+            AlternativeAction::User(&ActionKind::Lookahead)
+            | AlternativeAction::User(&ActionKind::Lookbehind) => {
+                Ok(self.types.opt_terminal_loc_type().unwrap().clone())
+            }
+
+            AlternativeAction::Default(Symbols::Named(ref syms)) => {
+                return_err!(
+                    alt.span,
+                    "cannot infer types in the presence of named symbols like `{}:{}`",
+                    syms[0].1,
+                    syms[0].2
+                );
+            }
+
+            AlternativeAction::Default(Symbols::Anon(syms)) => {
+                let symbol_types: Vec<TypeRepr> = try! {
+                    syms.iter()
+                        .map(|&(_, sym)| self.symbol_type(&sym.kind))
+                        .collect()
+                };
+                Ok(maybe_tuple(symbol_types))
+            }
+        }
+    }
+
+    fn symbol_type(&mut self, symbol: &SymbolKind) -> NormResult<TypeRepr> {
+        match *symbol {
+            SymbolKind::Terminal(ref id) => Ok(self.types.terminal_type(id).clone()),
+            SymbolKind::Nonterminal(ref id) => self.nonterminal_type(id),
+            SymbolKind::Choose(ref s) => self.symbol_type(&s.kind),
+            SymbolKind::Name(_, ref s) => self.symbol_type(&s.kind),
+            SymbolKind::Error => Ok(self.types.parse_error_type().clone()),
+
+            SymbolKind::Repeat(..)
+            | SymbolKind::Expr(..)
+            | SymbolKind::Macro(..)
+            | SymbolKind::AmbiguousId(..)
+            | SymbolKind::Lookahead
+            | SymbolKind::Lookbehind => {
+                unreachable!("symbol `{:?}` should have been expanded away", symbol)
+            }
+        }
+    }
+}
+
+impl<'grammar> NT<'grammar> {
+    fn new(data: &'grammar NonterminalData) -> NT<'grammar> {
+        NT {
+            span: data.span,
+            type_decl: &data.type_decl,
+            alternatives: &data.alternatives,
+        }
+    }
+}
+
+fn maybe_tuple(v: Vec<TypeRepr>) -> TypeRepr {
+    if v.len() == 1 {
+        v.into_iter().next().unwrap()
+    } else {
+        TypeRepr::Tuple(v)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/normalize/tyinfer/test.rs
@@ -0,0 +1,243 @@
+use string_cache::DefaultAtom as Atom;
+use parser;
+use normalize::macro_expand::expand_macros;
+use normalize::token_check;
+use normalize::tyinfer::infer_types;
+use grammar::parse_tree::NonterminalString;
+use grammar::repr::TypeRepr;
+
+fn type_repr(s: &str) -> TypeRepr {
+    let type_ref = parser::parse_type_ref(s).unwrap();
+    return type_ref.type_repr();
+}
+
+fn compare(g1: &str, expected: Vec<(&'static str, &'static str)>) {
+    let grammar = parser::parse_grammar(g1).unwrap();
+    let grammar = expand_macros(grammar).unwrap();
+    let grammar = token_check::validate(grammar).unwrap();
+    let types = infer_types(&grammar).unwrap();
+
+    println!("types table: {:?}", types);
+
+    for (nt_id, nt_type) in expected {
+        let id = NonterminalString(Atom::from(nt_id));
+        let ty = type_repr(nt_type);
+        println!("expected type of {:?} is {:?}", id, ty);
+        assert_eq!(types.nonterminal_type(&id), &ty);
+    }
+}
+
+#[test]
+fn test_pairs_and_tokens() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..), "Ho" => Ho(..) } }
+    X = Y Z;
+    Y: Foo = "Hi";
+    Z = "Ho";
+"#,
+        vec![("X", "(Foo, Tok)"), ("Y", "Foo"), ("Z", "Tok")],
+    )
+}
+
+#[test]
+fn test_cycle_direct() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..), "Ho" => Ho(..) } }
+    X = {
+        X Y,
+        <Y> => vec![<>]
+    };
+    Y = "Hi";
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn test_cycle_indirect() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { } }
+    A = B;
+    B = C;
+    C = D;
+    D = A;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn test_macro_expansion() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Id" => Id(..) } }
+    Two<X>: (X, X) = X X;
+    Ids = Two<"Id">;
+"#,
+        vec![("Ids", "(Tok, Tok)"), (r#"Two<"Id">"#, "(Tok, Tok)")],
+    )
+}
+
+#[test]
+fn test_macro_expansion_infer() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Id" => Id(..) } }
+    Two<X> = X X;
+    Ids = Two<"Id">;
+"#,
+        vec![("Ids", "(Tok, Tok)"), (r#"Two<"Id">"#, "(Tok, Tok)")],
+    )
+}
+
+#[test]
+fn test_type_question() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..) } }
+    X = Y?;
+    Y = "Hi";
+"#,
+        vec![("X", "::std::option::Option<Tok>"), ("Y", "Tok")],
+    )
+}
+
+#[test]
+fn test_star_plus_question() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..) } }
+    A = Z*;
+    X = "Hi"*;
+    Y = "Hi"+;
+    Z = "Hi"?;
+"#,
+        vec![
+            ("A", "::std::vec::Vec<::std::option::Option<Tok>>"),
+            ("X", "::std::vec::Vec<Tok>"),
+            ("Y", "::std::vec::Vec<Tok>"),
+            ("Z", "::std::option::Option<Tok>"),
+        ],
+    )
+}
+
+#[test]
+fn test_lookahead() {
+    compare(
+        r#"
+grammar;
+    extern { type Location = usize; enum Tok { } }
+    A = @L;
+"#,
+        vec![("A", "usize")],
+    )
+}
+
+#[test]
+fn test_spanned_macro() {
+    compare(
+        r#"
+        grammar;
+        extern { type Location = usize; enum Tok { "Foo" => Foo(..) } }
+        A = Spanned<"Foo">;
+        Spanned<T> = {
+            @L T @R
+        };
+"#,
+        vec![("A", "(usize, Tok, usize)")],
+    )
+}
+
+#[test]
+fn test_action() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "+" => .., "foo" => .. } }
+
+    X = {
+        Y,
+        <l:X> "+" <r:Y> => l + r
+    };
+
+    Y: i32 = "foo" => 22;
+"#,
+        vec![("X", "i32"), ("Y", "i32")],
+    )
+}
+
+#[test]
+fn test_inconsistent_action() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "+" => .., "foo" => .., "bar" => .. } }
+
+    X = {
+        Y,
+        Z,
+        <l:X> "+" <r:Y> => l + r
+    };
+
+    Y: i32 = "foo" => 22;
+
+    Z: u32 = "bar" => 22;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn custom_token() {
+    compare(
+        r#"
+grammar;
+extern { enum Tok { N => N(<u32>) } }
+A = N;
+"#,
+        vec![("A", "u32")],
+    )
+}
+
+#[test]
+fn intern_token() {
+    compare(
+        r#"
+grammar;
+    Z = @L "Ho" @R;
+"#,
+        vec![("Z", "(usize, &'input str, usize)")],
+    )
+}
+
+#[test]
+fn error() {
+    compare(
+        r#"
+grammar;
+    Z = !;
+"#,
+        vec![
+            (
+                "Z",
+                "__lalrpop_util::ParseError<usize, Token<'input>, &'static str>",
+            ),
+        ],
+    )
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/parser/lrgrammar.rs
@@ -0,0 +1,62118 @@
+// auto-generated: "lalrpop-snap 0.14.0"
+#![cfg_attr(rustfmt, rustfmt_skip)]
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::*;
+use grammar::pattern::*;
+use std::iter::once;
+use tok::{self, Tok};
+use util::strip;
+#[allow(unused_extern_crates)]
+extern crate lalrpop_util as ___lalrpop_util;
+
+mod ___parse___Grammar {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 9, 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, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 1
+        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, -124, -124, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0,
+        // State 2
+        0, 0, 0, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // State 4
+        0, 0, 0, -425, -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, -425, 0, 0, 0, 0, 0, -425, 0, 0, 0, 0,
+        // State 5
+        0, 0, 0, 9, 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, 18, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 6
+        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, -488, 0, 0, 0, 0, 0, -488, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 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, 21, 0, 0, 0, 0, 0, 12, 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, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 9
+        0, 0, 0, -422, -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, -422, 0, 0, 0, 0, 0, -422, 0, 0, 0, 0,
+        // State 10
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 12
+        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, -125, -125, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0,
+        // State 13
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 29, 0, 0, 0,
+        // State 14
+        0, 0, 0, 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, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 15
+        0, 0, 0, -426, -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, -426, 0, 0, 0, 0, 0, -426, 0, 0, 0, 0,
+        // State 16
+        0, 0, 0, 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, 37, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 17
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 41, 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, 29, 0, 0, 0,
+        // State 18
+        0, 0, 0, 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, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        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, -489, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 46, 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, 29, 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, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 23
+        0, 0, 0, 0, 0, 0, 26, 0, 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, 29, 0, 0, 0,
+        // State 24
+        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, 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, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 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, -172, 0, 0, 0, 0, 0, 48, 77, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        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, -485, -485, 0, -485, 0, 0, 0, 0, 0, 0, 0, -485, 0, -485, 0, -485, 0, -485, 0, -485, 0, 0, 0, 0,
+        // State 30
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 31
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 32
+        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,
+        // State 33
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 102, 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, 29, 0, 0, 0,
+        // State 35
+        0, 0, 0, 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, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 107, 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, 29, 0, 0, 0,
+        // State 37
+        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, 29, 0, 0, 0,
+        // State 38
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 39
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 40
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 41
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 118, 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, 29, 0, 0, 0,
+        // State 42
+        0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 43
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 44
+        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, 0, 0, 0, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 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, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        0, 0, 0, 0, 0, 0, -360, -360, 0, -360, -360, 0, 0, -360, -360, -360, -360, -360, 0, 0, 0, 0, 0, -360, 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, -360, 0, 0,
+        // State 48
+        0, 0, 0, 0, 0, 0, -361, -361, 0, -361, -361, 0, 0, -361, -361, -361, -361, -361, 0, 0, 0, 0, 0, -361, 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, -361, 0, 0,
+        // State 49
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 51
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 52
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 53
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 54
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 55
+        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, 48, 0, 49, 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, 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,
+        // State 57
+        0, 0, 0, 0, 0, 0, 0, -139, 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,
+        // State 58
+        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,
+        // State 59
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0,
+        // State 60
+        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, -337, -337, 0, -337, 0, 0, 0, 0, 0, 0, 0, -337, 0, 0, 0, -337, 0, -337, 0, -337, 0, 0, 0, 0,
+        // State 61
+        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, -341, -341, 0, -341, 0, 0, 0, 0, 0, 0, 0, -341, 0, 0, 0, -341, 0, -341, 0, -341, 0, 0, 0, 0,
+        // State 62
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 63
+        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, -336, -336, 0, -336, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, 0, -336, 0, -336, 0, -336, 0, 0, 0, 0,
+        // State 64
+        0, 0, 0, -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, -374, -374, 0, -374, 0, 0, 0, 0, 0, 140, 0, -374, 0, 0, 0, -374, 0, -374, 0, -374, 0, 0, 0, 0,
+        // State 65
+        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, -338, -338, 0, -338, 0, 0, 0, 0, 0, 0, 0, -338, 0, 0, 0, -338, 0, -338, 0, -338, 0, 0, 0, 0,
+        // State 66
+        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, -335, -335, 0, -335, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, -335, 0, -335, 0, -335, 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, 144, 145, 0, 146, 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, 147, 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, 148, 0, 0,
+        // State 70
+        0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, -491, 0, -491, 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, -174, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 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,
+        // State 74
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -467, 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, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 76
+        0, 0, 0, -362, 0, -362, -362, 0, 0, -362, -362, 0, 0, -362, -362, -362, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 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, 48, 0, 49, 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, -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,
+        // State 80
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 156, 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,
+        // State 82
+        0, 0, 0, 0, 0, 0, -389, -389, 0, -389, -389, 0, 0, -389, 157, -389, -389, -389, 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, -389, 0, 0,
+        // State 83
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 84
+        0, 0, 0, 0, 0, 0, 0, -478, 0, -478, -478, 0, 0, -478, 0, -478, 159, -478, 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, -478, 0, 0,
+        // State 85
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 86
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0,
+        // State 88
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        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,
+        // State 91
+        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,
+        // State 92
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 93
+        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, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 94
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 95
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 96
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 97
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 98
+        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, 29, 0, 0, 0,
+        // State 99
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 100
+        0, 0, 0, 0, 0, 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, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 206, 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, 29, 0, 0, 0,
+        // State 103
+        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, 29, 0, 0, 0,
+        // State 104
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 105
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 106
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 107
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 109
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 110
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 111
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 112
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 113
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 114
+        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, 29, 0, 0, 0,
+        // State 115
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 116
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 117
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 118
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 119
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 120
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 121
+        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,
+        // State 122
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 123
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 124
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 125
+        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, -121, -121, 0, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121, 0, 0, 0, -121, 0, 0, 0, 0, 0, 0,
+        // State 126
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 127
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 128
+        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,
+        // State 129
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 130
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 131
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 132
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 133
+        0, 0, 0, 0, 0, 0, 0, -141, 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,
+        // State 134
+        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, -346, 0, 0, 0,
+        // State 135
+        0, 0, 0, 0, 0, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, -36, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 144, 145, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 138
+        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, -342, -342, 0, -342, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, -342, 0, -342, 0, -342, 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, 242, 0, 0,
+        // State 140
+        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,
+        // State 141
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 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,
+        // State 142
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, -383, 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,
+        // State 144
+        0, -384, -384, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, -384, 0, 0, 0, -384, -384, 0, 0, 0, 0, -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, -384,
+        // State 145
+        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,
+        // 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, 249, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 251, 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0,
+        // State 148
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 260, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 150
+        0, 0, 0, 0, 0, 0, -349, 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, -349, 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, -91, 0, 0, 0, 0, 0, -91, -91, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 152
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, -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,
+        // State 153
+        0, 0, 0, 0, 0, 0, -390, -390, 0, -390, -390, 0, 0, -390, 262, -390, -390, -390, 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, -390, 0, 0,
+        // State 154
+        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,
+        // State 155
+        0, 0, 0, -41, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, -41, 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, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 157
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, -408, 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,
+        // State 158
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 48, 77, 49, 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, -412, 0, 0, 0, 90, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 160
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, -443, -443, 0, 0, -443, -443, -443, -443, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 0, 0, 0, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, 0, -443, 0,
+        // State 161
+        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,
+        // State 162
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, -417, -417, 0, 0, -417, -417, -417, -417, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, -417, 0,
+        // State 163
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, -441, -441, 0, 0, -441, -441, -441, -441, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, -441, 0,
+        // State 164
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, -416, -416, 0, 0, -416, -416, -416, -416, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, -416, 0,
+        // State 165
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, -415, -415, 0, 0, -415, -415, -415, -415, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, -415, 0,
+        // State 166
+        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,
+        // State 167
+        -430, 0, 0, -430, 0, 0, -430, -430, 282, 283, -430, 0, 0, 0, 0, -430, -430, 0, 0, -430, -430, -430, -430, -430, 284, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, 0, -430, 0,
+        // State 168
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, -435, -435, 0, 0, -435, -435, -435, -435, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, -435, 0,
+        // State 169
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, -437, -437, 0, 0, -437, -437, -437, -437, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, 0, -437, 0,
+        // State 170
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, -447, -447, 0, 0, -447, -447, -447, -447, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, 0, -447, 0,
+        // State 171
+        171, 0, 0, 0, 0, 0, 172, -193, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 172
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 290, 0, 291, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 173
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, -445, -445, 0, 0, -445, -445, -445, -445, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, -445, 0,
+        // State 174
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, -446, -446, 0, 0, -446, -446, -446, -446, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, -446, 0,
+        // State 175
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, -192, -192, 0, 0, -192, -192, -192, -192, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, -192, 0,
+        // State 176
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, -442, -442, 0, 0, -442, -442, -442, -442, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 0, 0, 0, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, 0, -442, 0,
+        // State 177
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, -418, -418, 0, 0, -418, -418, -418, -418, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, 0, -418, 0,
+        // State 178
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, -427, -427, 0, 0, -427, -427, -427, -427, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, 0, -427, 0,
+        // State 179
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0,
+        // State 180
+        0, 0, 0, 0, 0, 0, 0, -476, 0, -476, -476, 0, 0, -476, 0, -476, 0, -476, 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, -476, 0, 0,
+        // State 181
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, -178, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 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,
+        // State 184
+        0, 0, 0, 0, 0, 0, 0, -175, 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,
+        // 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, 48, 0, 49, 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, -387, -387, 0, -387, -387, 0, 0, -387, 157, -387, -387, -387, 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, -387, 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, -148, 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,
+        // State 188
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 189
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 190
+        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,
+        // State 191
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 192
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 193
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 194
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 195
+        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,
+        // State 196
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 197
+        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, 29, 0, 0, 0,
+        // State 198
+        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,
+        // State 199
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 200
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 201
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 202
+        0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 203
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 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, 29, 0, 0, 0,
+        // State 204
+        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,
+        // State 205
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 206
+        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,
+        // State 207
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 208
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 209
+        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,
+        // State 210
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 211
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 212
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 213
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 214
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 215
+        0, 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,
+        // State 216
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 217
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 218
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 219
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 220
+        0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 221
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 222
+        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, 29, 0, 0, 0,
+        // State 223
+        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,
+        // State 224
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 225
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 226
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 227
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 228
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 229
+        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,
+        // State 230
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 231
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 232
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 233
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 234
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 235
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 236
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 237
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 238
+        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, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 239
+        0, 0, 0, 0, 0, 0, 0, -343, 0, 0, -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,
+        // State 240
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 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,
+        // 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 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, -156, 0, 0, 0, 0, 0, 145, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 244
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 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, -129, 0, 0, 0, 0, 0, 0, 0, -129, 0, 0, 0, -129, 0,
+        // 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, 249, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 362, 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, 250, 0, 0, 0, 364, 0,
+        // State 248
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 48, 0, 49, 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, -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, -199, -199, 0, -199, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, -199, 0, -199, 0, -199, 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0,
+        // 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, -366, 0,
+        // 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, 368, 0,
+        // State 254
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0,
+        // State 255
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 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, -368, 0,
+        // State 256
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 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, -373, 0,
+        // State 257
+        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, -367, 0,
+        // State 258
+        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,
+        // 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, -92, 0, 0, 0, 0, 0, -92, -92, -92, 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, -42, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, -42, 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, -47, 0, -47, 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, -412, 0, 0, 0, 90, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 263
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, -410, 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,
+        // State 264
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 374, -407, 0, 0, 0, 0, -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,
+        // State 265
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -352, 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,
+        // State 266
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 268
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 269
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 270
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 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,
+        // State 271
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -414, 0, 0, 0, 90, -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 272
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -450, -450, 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,
+        // State 274
+        0, 0, 0, 0, 0, 0, 380, 0, 0, -458, -458, 0, 0, 0, 0, -458, 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,
+        // State 275
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -466, 0, 0, 0, 0, -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,
+        // State 276
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 382, -411, 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,
+        // State 277
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 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,
+        // State 278
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, -164, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 279
+        0, 0, 0, 0, 0, 0, 0, -472, 0, -472, -472, 0, 0, -472, 0, -472, 0, -472, 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, -472, 0, 0,
+        // State 280
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, -436, -436, 0, 0, -436, -436, -436, -436, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, -436, 0,
+        // State 281
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, -420, -420, 0, 0, -420, -420, -420, -420, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, -420, 0,
+        // State 282
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, -419, -419, 0, 0, -419, -419, -419, -419, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, 0, -419, 0,
+        // State 283
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, -421, -421, 0, 0, -421, -421, -421, -421, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, -421, 0,
+        // State 284
+        0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 285
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, -433, 0, 0, 0, 0, -433, -433, 0, 0, -433, -433, -433, -433, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, -433, 0,
+        // State 286
+        171, 0, 0, 0, 0, 0, 172, -194, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 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, 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,
+        // State 288
+        0, 0, 0, 0, 0, 0, 0, 0, 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 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,
+        // State 289
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 290
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 291
+        0, 0, 0, 0, 0, 0, 0, -475, 0, -475, -475, 0, 0, -475, 0, -475, 0, -475, 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, -475, 0, 0,
+        // State 292
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -474, 0, -474, -474, 0, 0, -474, 0, -474, 0, -474, 0, 0, 0, 0, 0, -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, -474, 0, 0,
+        // State 294
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 295
+        0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, 0, 0, -471, 0, -471, 0, -471, 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, -471, 0, 0,
+        // State 296
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 297
+        0, 0, 0, 0, 0, 0, -388, -388, 0, -388, -388, 0, 0, -388, 262, -388, -388, -388, 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, -388, 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, -150, 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,
+        // 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, 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,
+        // State 300
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 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,
+        // State 301
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 302
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 303
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 304
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 305
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 306
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 307
+        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,
+        // State 308
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 309
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 310
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 311
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 312
+        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,
+        // State 313
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 314
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 315
+        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, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 316
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 317
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 318
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 319
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 320
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 321
+        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,
+        // State 322
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 323
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 324
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 325
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 326
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 327
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 328
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 329
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 330
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 331
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 332
+        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,
+        // State 333
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 334
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 335
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 336
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 337
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 338
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 339
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 340
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 341
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 342
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 343
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 0, 0,
+        // 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, 419, 0,
+        // 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, -158, 0, 0, 0, 0, 0, 145, 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, 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,
+        // State 347
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 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,
+        // State 348
+        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,
+        // State 349
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 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, -116, 0,
+        // State 350
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 351
+        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, -379, -379, 0, -379, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, -379, 0, -379, 0, -379, 0, 0, 0, 0,
+        // State 352
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, -114, 0, 0, 0, 0, -114, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, -114, 0,
+        // State 353
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107, 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, -107, 0,
+        // State 354
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 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, -108, 0,
+        // State 355
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105, 0, 0, 0, 0, -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, -105, 0,
+        // State 356
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106, 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, -106, 0,
+        // 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, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 358
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, -132, 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, -130, 0, 0, 0, 0, 0, 0, 0, -130, 0, 0, 0, -130, 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, 250, 0, 0, 0, 433, 0,
+        // State 361
+        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, -200, -200, 0, -200, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, -200, 0, -200, 0, -200, 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, 250, 0, 0, 0, 434, 0,
+        // State 363
+        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, -195, -195, 0, -195, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, 0, -195, 0, -195, 0, -195, 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, 435, 0, 0,
+        // State 365
+        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, 0, 0, 0, 0, 0, 0, 0, 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, 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, -153, 0,
+        // State 367
+        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, -376, -376, 0, -376, 0, 0, 0, 0, 0, -376, 0, -376, 0, 0, 0, -376, 0, -376, 0, -376, 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, -61, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0,
+        // State 369
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -369, 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, -490, -490, 0, -490, 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, -353, 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,
+        // State 372
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 438, -409, 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,
+        // State 373
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 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, 439, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 375
+        0, 0, 0, 0, 0, 0, 0, -477, 0, -477, -477, 0, 0, -477, 0, -477, 0, -477, 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, -477, 0, 0,
+        // State 376
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 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, 440, -413, 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,
+        // State 378
+        0, 0, 0, 0, 0, 0, 441, 0, 0, -457, -457, 0, 0, 0, 0, -457, 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,
+        // State 379
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 48, 77, 49, 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, -81, 0, 0, 0, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 382
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, -166, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 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, 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,
+        // State 384
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 385
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, -444, -444, 0, 0, -444, -444, -444, -444, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, -444, 0,
+        // State 386
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, -434, 0, 0, 0, 0, -434, -434, 0, 0, -434, -434, -434, -434, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, -434, 0,
+        // State 387
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 388
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, -429, -429, 0, 0, -429, -429, -429, -429, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 0, 0, 0, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, 0, -429, 0,
+        // State 389
+        0, 0, 0, 0, 0, 0, 0, -473, 0, -473, -473, 0, 0, -473, 0, -473, 0, -473, 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, -473, 0, 0,
+        // State 390
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 392
+        0, 0, 0, -204, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, 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, -56, 0, 0, 0, 0, 0, 0, -56, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 395
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 396
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 397
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 398
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 399
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 400
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 401
+        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, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 403
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 404
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 405
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 406
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 407
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 408
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 409
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 410
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 411
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 412
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 413
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 414
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 415
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 416
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 417
+        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, -380, -380, 0, -380, 0, 0, 0, 0, 0, 0, 0, -380, 0, 0, 0, -380, 0, -380, 0, -380, 0, 0, 0, 0,
+        // State 418
+        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, -375, -375, 0, -375, 0, 0, 0, 0, 0, -375, 0, -375, 0, 0, 0, -375, 0, -375, 0, -375, 0, 0, 0, 0,
+        // State 419
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 420
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -381, 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,
+        // 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, -66, 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,
+        // State 422
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 0, 0,
+        // State 423
+        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, -119, -119, 0, -119, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, -119, 0, -119, 0, -119, 0, 0, 0, 0,
+        // State 424
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, 0, 0, -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, -113, 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, 145, 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, 354, 355, 356, 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,
+        // State 427
+        0, 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 471,
+        // State 428
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, -134, 0,
+        // State 429
+        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, -131, 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, 474, 0,
+        // 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, 250, 0, 0, 0, 475, 0,
+        // State 432
+        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, -197, -197, 0, -197, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, -197, 0, -197, 0, -197, 0, 0, 0, 0,
+        // State 433
+        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, -196, -196, 0, -196, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, 0, -196, 0, -196, 0, -196, 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, 481, 0, 0, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136, 0,
+        // State 435
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 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, -62, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0,
+        // State 437
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, -82, 0, 0, 0, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 440
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 443
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 445
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 157, 0, -389, 488, 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,
+        // State 446
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 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,
+        // State 447
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 448
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 449
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 450
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, -440, -440, 0, 0, -440, -440, -440, -440, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, -440, 0,
+        // State 451
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 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,
+        // 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, -57, 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,
+        // State 454
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 455
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 456
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 457
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 458
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 459
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 460
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 461
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 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, -67, 0, 0, 0, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 463
+        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, -377, -377, 0, -377, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, -377, 0, -377, 0, -377, 0, 0, 0, 0,
+        // State 464
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, -112, 0, 0, 0, 354, 355, 356, 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, -112, 0,
+        // State 465
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115, 0, 0, 0, 0, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115, 0,
+        // 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, 179, 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, -185, 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, -187, 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, -184, 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, -186, 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, 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, -133, 0,
+        // State 472
+        -21, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, -21, -21, -21, -21, 0, 0, -21, -21, 0, -21, -21, 0, -21, -21, -21, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, -21, 0,
+        // State 473
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 474
+        0, 0, 0, -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, -198, -198, 0, -198, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, -198, 0, -198, 0, -198, 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, 481, 0, 0, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 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, 499, 0,
+        // State 477
+        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, -135, 0,
+        // State 478
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 479
+        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,
+        // State 480
+        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, 0, 0, 0, 0, 0, 0, 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, 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,
+        // State 482
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // State 484
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -454, -454, 505, 0, 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, 0, 0, 0,
+        // State 485
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 486
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -456, -456, 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,
+        // State 487
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -86, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, -86, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 489
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 490
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, -428, -428, 0, 0, -428, -428, -428, -428, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, 0, -428, 0,
+        // State 491
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 492
+        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, -378, -378, 0, -378, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, -378, 0, -378, 0, -378, 0, 0, 0, 0,
+        // State 493
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 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, -111, 0,
+        // State 494
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, -183, 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, 0, 0, 0, -183, 0,
+        // State 495
+        -22, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, -22, -22, -22, -22, 0, 0, -22, -22, 0, -22, -22, 0, -22, -22, -22, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, -22, 0,
+        // State 496
+        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, -120, -120, 0, -120, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, -120, 0, -120, 0, -120, 0, 0, 0, 0,
+        // State 497
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -137, 0,
+        // 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, -191, 0, 0, 0, -191, 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, -26, 0, 0, -26, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0,
+        // State 500
+        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, -188, 0,
+        // 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, -126, 0, 0, 0, 0, 0, 0, 0, -126, 0, 0, 0, -126, 0,
+        // State 502
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -453, -453, 509, 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,
+        // State 503
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -455, -455, 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,
+        // State 504
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -87, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, -87, -87, -87, 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, -463, 0, 0, 0, 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,
+        // 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, -27, 0, 0, -27, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0,
+        // State 508
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -452, -452, 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,
+        // State 510
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -451, 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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        -493,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        0,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        -235,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        -485,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        -299,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        -237,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        -236,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        -219,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        -227,
+        // State 54
+        -231,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        -337,
+        // State 61
+        -341,
+        // State 62
+        -267,
+        // State 63
+        -336,
+        // State 64
+        -374,
+        // State 65
+        -338,
+        // State 66
+        -335,
+        // State 67
+        0,
+        // State 68
+        0,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        -283,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        -291,
+        // State 96
+        -295,
+        // State 97
+        -331,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        -301,
+        // State 102
+        0,
+        // State 103
+        0,
+        // State 104
+        0,
+        // State 105
+        0,
+        // State 106
+        -238,
+        // State 107
+        0,
+        // State 108
+        -221,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        -229,
+        // State 112
+        -233,
+        // State 113
+        -269,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        -300,
+        // State 118
+        0,
+        // State 119
+        -220,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        -228,
+        // State 123
+        -232,
+        // State 124
+        -268,
+        // State 125
+        0,
+        // State 126
+        -215,
+        // State 127
+        -251,
+        // State 128
+        0,
+        // State 129
+        -211,
+        // State 130
+        -223,
+        // State 131
+        -259,
+        // State 132
+        -263,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        -342,
+        // State 139
+        0,
+        // State 140
+        0,
+        // State 141
+        0,
+        // State 142
+        0,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        0,
+        // State 148
+        0,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        0,
+        // State 154
+        0,
+        // State 155
+        0,
+        // State 156
+        0,
+        // State 157
+        0,
+        // State 158
+        0,
+        // State 159
+        0,
+        // State 160
+        0,
+        // State 161
+        0,
+        // State 162
+        0,
+        // State 163
+        0,
+        // State 164
+        0,
+        // State 165
+        0,
+        // State 166
+        0,
+        // State 167
+        0,
+        // State 168
+        0,
+        // State 169
+        0,
+        // State 170
+        0,
+        // State 171
+        0,
+        // State 172
+        0,
+        // State 173
+        0,
+        // State 174
+        0,
+        // State 175
+        0,
+        // State 176
+        0,
+        // State 177
+        0,
+        // State 178
+        0,
+        // State 179
+        0,
+        // State 180
+        0,
+        // State 181
+        0,
+        // State 182
+        0,
+        // State 183
+        0,
+        // State 184
+        0,
+        // State 185
+        0,
+        // State 186
+        0,
+        // State 187
+        0,
+        // State 188
+        -279,
+        // State 189
+        -315,
+        // State 190
+        0,
+        // State 191
+        -275,
+        // State 192
+        -287,
+        // State 193
+        -323,
+        // State 194
+        -327,
+        // State 195
+        0,
+        // State 196
+        -285,
+        // State 197
+        0,
+        // State 198
+        0,
+        // State 199
+        -293,
+        // State 200
+        -297,
+        // State 201
+        -333,
+        // State 202
+        0,
+        // State 203
+        0,
+        // State 204
+        0,
+        // State 205
+        -302,
+        // State 206
+        0,
+        // State 207
+        -222,
+        // State 208
+        0,
+        // State 209
+        0,
+        // State 210
+        -230,
+        // State 211
+        -234,
+        // State 212
+        -270,
+        // State 213
+        -217,
+        // State 214
+        -253,
+        // State 215
+        0,
+        // State 216
+        -213,
+        // State 217
+        -225,
+        // State 218
+        -261,
+        // State 219
+        -265,
+        // State 220
+        0,
+        // State 221
+        -284,
+        // State 222
+        0,
+        // State 223
+        0,
+        // State 224
+        -292,
+        // State 225
+        -296,
+        // State 226
+        -332,
+        // State 227
+        -216,
+        // State 228
+        -252,
+        // State 229
+        0,
+        // State 230
+        -212,
+        // State 231
+        -224,
+        // State 232
+        -260,
+        // State 233
+        -264,
+        // State 234
+        -247,
+        // State 235
+        -207,
+        // State 236
+        -243,
+        // State 237
+        -255,
+        // State 238
+        0,
+        // State 239
+        0,
+        // State 240
+        0,
+        // State 241
+        0,
+        // State 242
+        0,
+        // State 243
+        0,
+        // State 244
+        0,
+        // State 245
+        0,
+        // State 246
+        0,
+        // State 247
+        0,
+        // State 248
+        0,
+        // State 249
+        0,
+        // State 250
+        -199,
+        // State 251
+        0,
+        // State 252
+        0,
+        // State 253
+        0,
+        // State 254
+        0,
+        // State 255
+        0,
+        // State 256
+        0,
+        // State 257
+        0,
+        // State 258
+        0,
+        // State 259
+        0,
+        // State 260
+        0,
+        // State 261
+        0,
+        // State 262
+        0,
+        // State 263
+        0,
+        // State 264
+        0,
+        // State 265
+        0,
+        // State 266
+        0,
+        // State 267
+        0,
+        // State 268
+        0,
+        // State 269
+        0,
+        // State 270
+        0,
+        // State 271
+        0,
+        // State 272
+        0,
+        // State 273
+        0,
+        // State 274
+        0,
+        // State 275
+        0,
+        // State 276
+        0,
+        // State 277
+        0,
+        // State 278
+        0,
+        // State 279
+        0,
+        // State 280
+        0,
+        // State 281
+        0,
+        // State 282
+        0,
+        // State 283
+        0,
+        // State 284
+        0,
+        // State 285
+        0,
+        // State 286
+        0,
+        // State 287
+        0,
+        // State 288
+        0,
+        // State 289
+        0,
+        // State 290
+        0,
+        // State 291
+        0,
+        // State 292
+        0,
+        // State 293
+        0,
+        // State 294
+        0,
+        // State 295
+        0,
+        // State 296
+        0,
+        // State 297
+        0,
+        // State 298
+        0,
+        // State 299
+        0,
+        // State 300
+        0,
+        // State 301
+        -311,
+        // State 302
+        -271,
+        // State 303
+        -307,
+        // State 304
+        -319,
+        // State 305
+        -281,
+        // State 306
+        -317,
+        // State 307
+        0,
+        // State 308
+        -277,
+        // State 309
+        -289,
+        // State 310
+        -325,
+        // State 311
+        -329,
+        // State 312
+        0,
+        // State 313
+        -286,
+        // State 314
+        0,
+        // State 315
+        0,
+        // State 316
+        -294,
+        // State 317
+        -298,
+        // State 318
+        -334,
+        // State 319
+        -218,
+        // State 320
+        -254,
+        // State 321
+        0,
+        // State 322
+        -214,
+        // State 323
+        -226,
+        // State 324
+        -262,
+        // State 325
+        -266,
+        // State 326
+        -249,
+        // State 327
+        -209,
+        // State 328
+        -245,
+        // State 329
+        -257,
+        // State 330
+        -280,
+        // State 331
+        -316,
+        // State 332
+        0,
+        // State 333
+        -276,
+        // State 334
+        -288,
+        // State 335
+        -324,
+        // State 336
+        -328,
+        // State 337
+        -248,
+        // State 338
+        -208,
+        // State 339
+        -244,
+        // State 340
+        -256,
+        // State 341
+        -239,
+        // State 342
+        0,
+        // State 343
+        0,
+        // State 344
+        0,
+        // State 345
+        0,
+        // State 346
+        0,
+        // State 347
+        0,
+        // State 348
+        0,
+        // State 349
+        0,
+        // State 350
+        0,
+        // State 351
+        -379,
+        // State 352
+        0,
+        // State 353
+        0,
+        // State 354
+        0,
+        // State 355
+        0,
+        // State 356
+        0,
+        // State 357
+        0,
+        // State 358
+        0,
+        // State 359
+        0,
+        // State 360
+        0,
+        // State 361
+        -200,
+        // State 362
+        0,
+        // State 363
+        -195,
+        // State 364
+        0,
+        // State 365
+        0,
+        // State 366
+        0,
+        // State 367
+        -376,
+        // State 368
+        0,
+        // State 369
+        0,
+        // State 370
+        0,
+        // State 371
+        0,
+        // State 372
+        0,
+        // State 373
+        0,
+        // State 374
+        0,
+        // State 375
+        0,
+        // State 376
+        0,
+        // State 377
+        0,
+        // State 378
+        0,
+        // State 379
+        0,
+        // State 380
+        0,
+        // State 381
+        0,
+        // State 382
+        0,
+        // State 383
+        0,
+        // State 384
+        0,
+        // State 385
+        0,
+        // State 386
+        0,
+        // State 387
+        0,
+        // State 388
+        0,
+        // State 389
+        0,
+        // State 390
+        0,
+        // State 391
+        0,
+        // State 392
+        0,
+        // State 393
+        0,
+        // State 394
+        -303,
+        // State 395
+        -313,
+        // State 396
+        -273,
+        // State 397
+        -309,
+        // State 398
+        -321,
+        // State 399
+        -282,
+        // State 400
+        -318,
+        // State 401
+        0,
+        // State 402
+        -278,
+        // State 403
+        -290,
+        // State 404
+        -326,
+        // State 405
+        -330,
+        // State 406
+        -250,
+        // State 407
+        -210,
+        // State 408
+        -246,
+        // State 409
+        -258,
+        // State 410
+        -241,
+        // State 411
+        -312,
+        // State 412
+        -272,
+        // State 413
+        -308,
+        // State 414
+        -320,
+        // State 415
+        -240,
+        // State 416
+        0,
+        // State 417
+        -380,
+        // State 418
+        -375,
+        // State 419
+        0,
+        // State 420
+        0,
+        // State 421
+        0,
+        // State 422
+        0,
+        // State 423
+        -119,
+        // State 424
+        0,
+        // State 425
+        0,
+        // State 426
+        0,
+        // State 427
+        0,
+        // State 428
+        0,
+        // State 429
+        0,
+        // State 430
+        0,
+        // State 431
+        0,
+        // State 432
+        -197,
+        // State 433
+        -196,
+        // State 434
+        0,
+        // State 435
+        0,
+        // State 436
+        0,
+        // State 437
+        0,
+        // State 438
+        0,
+        // State 439
+        0,
+        // State 440
+        0,
+        // State 441
+        0,
+        // State 442
+        0,
+        // State 443
+        0,
+        // State 444
+        0,
+        // State 445
+        0,
+        // State 446
+        0,
+        // State 447
+        0,
+        // State 448
+        0,
+        // State 449
+        0,
+        // State 450
+        0,
+        // State 451
+        0,
+        // State 452
+        0,
+        // State 453
+        0,
+        // State 454
+        -305,
+        // State 455
+        -314,
+        // State 456
+        -274,
+        // State 457
+        -310,
+        // State 458
+        -322,
+        // State 459
+        -242,
+        // State 460
+        -304,
+        // State 461
+        0,
+        // State 462
+        0,
+        // State 463
+        -377,
+        // State 464
+        0,
+        // State 465
+        0,
+        // State 466
+        0,
+        // State 467
+        0,
+        // State 468
+        0,
+        // State 469
+        0,
+        // State 470
+        0,
+        // State 471
+        0,
+        // State 472
+        0,
+        // State 473
+        0,
+        // State 474
+        -198,
+        // State 475
+        0,
+        // State 476
+        0,
+        // State 477
+        0,
+        // State 478
+        0,
+        // State 479
+        0,
+        // State 480
+        0,
+        // State 481
+        0,
+        // State 482
+        0,
+        // State 483
+        0,
+        // State 484
+        0,
+        // State 485
+        0,
+        // State 486
+        0,
+        // State 487
+        0,
+        // State 488
+        0,
+        // State 489
+        0,
+        // State 490
+        0,
+        // State 491
+        -306,
+        // State 492
+        -378,
+        // State 493
+        0,
+        // State 494
+        0,
+        // State 495
+        0,
+        // State 496
+        -120,
+        // State 497
+        0,
+        // State 498
+        0,
+        // State 499
+        0,
+        // State 500
+        0,
+        // State 501
+        0,
+        // State 502
+        0,
+        // State 503
+        0,
+        // State 504
+        0,
+        // State 505
+        0,
+        // State 506
+        0,
+        // State 507
+        0,
+        // State 508
+        0,
+        // State 509
+        0,
+        // State 510
+        0,
+    ];
+    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, 2, 0, 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, 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, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 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,
+        // 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, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 2, 0, 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, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 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, 20, 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,
+        // 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,
+        // 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, 23, 0, 24, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 31, 0, 32, 0, 0, 0, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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, 2, 0, 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, 20, 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, 38, 0, 39, 0, 0, 0, 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,
+        // 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, 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,
+        // 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,
+        // 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, 43, 0, 44, 0, 0, 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, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 25
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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, 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, 74, 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, 76, 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, 78, 0, 0, 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, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 94, 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, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 99, 0, 100, 0, 0, 0, 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, 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, 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,
+        // 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, 104, 0, 105, 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,
+        // 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, 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,
+        // 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, 110, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 115, 0, 116, 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 121, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 138, 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 142, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 74, 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, 150, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 155, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 167, 0, 0, 168, 169, 0, 170, 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, 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, 83, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 181, 0, 0, 0, 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 198, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 204, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // State 127
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 141, 0, 0, 0, 0, 0, 0, 0, 0, 241, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 246, 0, 247, 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, 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, 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, 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, 254, 255, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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, 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, 83, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 265, 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,
+        // 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, 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, 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, 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, 83, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 270, 0, 271, 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, 79, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 161, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 287, 168, 169, 0, 170, 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, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 0, 0, 0, 289, 169, 0, 170, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 292, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 294, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 295, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // 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,
+        // 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, 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, 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, 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,
+        // State 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 62, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 315, 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,
+        // 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,
+        // State 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 62, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 345, 255, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 349, 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 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, 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,
+        // 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, 246, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 367, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 79, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 372, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // State 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, 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, 83, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 270, 0, 375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 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, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 385, 0, 0, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 387, 0, 0, 168, 169, 0, 170, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 390, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 417, 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 387, 0, 0, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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,
+        // State 358
+        0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 430, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 246, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 79, 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 449, 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,
+        // 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 450, 0, 0, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 0, 0, 0, 453, 169, 0, 170, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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, 350, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // State 434
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 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, 163, 479, 165, 0, 0, 0, 0, 166, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 482, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 79, 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 449, 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,
+        // 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 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, 449, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 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, 163, 479, 165, 0, 0, 0, 0, 166, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 507, 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,
+        // 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 510, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 511, 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct GrammarParser {
+        _priv: (),
+    }
+
+    impl GrammarParser {
+        pub fn new() -> GrammarParser {
+            GrammarParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Grammar, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Grammar,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                // ___Grammar = Grammar => ActionFn(0);
+                let ___sym0 = ___pop_Variant63(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action0::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___Grammar::GrammarParser;
+
+mod ___parse___GrammarWhereClauses {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    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, 3, 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,
+        // State 2
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 3
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // State 6
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 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,
+        // State 8
+        0, 0, 0, 0, 0, 0, -389, -389, 0, -389, -389, 0, 0, -389, 25, 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,
+        // State 9
+        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,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, -478, 0, -478, -478, 0, 0, -478, 0, 0, 27, 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,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 12
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 13
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 17, 0, 19, 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, -360, -360, 0, -360, -360, 0, 0, -360, -360, 0, -360, -360, 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,
+        // State 17
+        0, 0, 0, -362, 0, -362, -362, 0, 0, -362, -362, 0, 0, -362, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 18
+        0, 0, 0, 0, 0, 0, -361, -361, 0, -361, -361, 0, 0, -361, -361, 0, -361, -361, 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,
+        // State 19
+        0, 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,
+        // State 20
+        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, 0, 0, 0, 0, 0, 0, 0,
+        // State 21
+        0, 0, 0, 0, 0, 0, -390, -390, 0, -390, -390, 0, 0, -390, 59, 0, -390, 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,
+        // State 22
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 23
+        0, 0, 0, -41, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, -46, 0, -46, 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, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 26
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 17, 18, 19, 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, -412, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        0, 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, 0, 0, 0, 0, 0, 0,
+        // State 30
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 31
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 32
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 33
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 34
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 35
+        -430, 0, 0, -430, 0, 0, -430, -430, 79, 80, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 81, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 37
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 38
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 39
+        39, 0, 0, 0, 0, 0, 40, -193, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 40
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 87, 0, 88, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 41
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 42
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 43
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 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, -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,
+        // State 46
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 48
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        0, 0, 0, 0, 0, 0, 0, -476, 0, -476, -476, 0, 0, -476, 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,
+        // State 50
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 13, 0, 14, 15, -178, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 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,
+        // State 53
+        0, 0, 0, 0, 0, 0, 0, -175, 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,
+        // 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, 17, 0, 19, 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, -387, -387, 0, -387, -387, 0, 0, -387, 25, 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,
+        // 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, -148, 0, 0, 0, 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,
+        // State 57
+        0, 0, 0, -42, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, -42, 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, -47, 0, -47, 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, -412, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        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, 18, 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, 101, -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,
+        // State 62
+        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,
+        // State 63
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 66
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 67
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 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,
+        // State 68
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -414, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 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, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -450, -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,
+        // State 71
+        0, 0, 0, 0, 0, 0, 107, 0, 0, -458, -458, 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,
+        // State 72
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 109, -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,
+        // State 74
+        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, 0, 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
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, -164, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, -472, 0, -472, -472, 0, 0, -472, 0, 0, 0, 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,
+        // State 77
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 78
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 79
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 80
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 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, 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,
+        // State 82
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        39, 0, 0, 0, 0, 0, 40, -194, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, 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,
+        // State 85
+        0, 0, 0, 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 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,
+        // State 86
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 87
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 88
+        0, 0, 0, 0, 0, 0, 0, -475, 0, -475, -475, 0, 0, -475, 0, 0, 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,
+        // State 89
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        0, 0, 0, 0, 0, 0, 0, -474, 0, -474, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 91
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 92
+        0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, 0, 0, -471, 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,
+        // State 93
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -388, -388, 0, -388, -388, 0, 0, -388, 59, 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,
+        // 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, -150, 0, 0, 0, 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,
+        // 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, 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,
+        // State 97
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 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,
+        // State 98
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 99
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 122, -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,
+        // State 100
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 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, 123, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 0, -477, 0, -477, -477, 0, 0, -477, 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,
+        // State 103
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 104
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 124, -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,
+        // State 105
+        0, 0, 0, 0, 0, 0, 125, 0, 0, -457, -457, 0, 0, 0, 0, 0, 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,
+        // State 106
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 107
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 109
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, -166, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, 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,
+        // State 111
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 112
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 113
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 114
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 115
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, -473, -473, 0, 0, -473, 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,
+        // State 117
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 119
+        0, 0, 0, -204, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, 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, -56, 0, 0, 0, 0, 0, 0, -56, 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, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, -82, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 124
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 127
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 129
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 25, 0, -389, 144, 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,
+        // State 130
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 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,
+        // State 131
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 132
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 133
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 134
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 135
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 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,
+        // 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, -57, 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,
+        // State 138
+        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,
+        // 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, 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,
+        // State 140
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -454, -454, 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 141
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 142
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -456, -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,
+        // State 143
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -86, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, -86, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 145
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 146
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 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, -453, -453, 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,
+        // State 148
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -455, -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,
+        // State 149
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -87, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, -87, -87, -87, 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, -463, 0, 0, 0, 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,
+        // State 152
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 153
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -452, -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,
+        // State 154
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        -494,
+        // State 2
+        -144,
+        // State 3
+        -146,
+        // State 4
+        0,
+        // State 5
+        -357,
+        // State 6
+        0,
+        // State 7
+        -143,
+        // State 8
+        -389,
+        // State 9
+        0,
+        // State 10
+        -478,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        -360,
+        // State 17
+        -362,
+        // State 18
+        -361,
+        // State 19
+        0,
+        // State 20
+        -145,
+        // State 21
+        -390,
+        // State 22
+        0,
+        // State 23
+        -41,
+        // State 24
+        0,
+        // State 25
+        -408,
+        // State 26
+        0,
+        // State 27
+        -412,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        -476,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        -387,
+        // State 56
+        0,
+        // State 57
+        -42,
+        // State 58
+        0,
+        // State 59
+        -412,
+        // State 60
+        -410,
+        // State 61
+        -407,
+        // State 62
+        -352,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        -414,
+        // State 69
+        0,
+        // State 70
+        -450,
+        // State 71
+        -458,
+        // State 72
+        -466,
+        // State 73
+        -411,
+        // State 74
+        -354,
+        // State 75
+        0,
+        // State 76
+        -472,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        -475,
+        // State 89
+        0,
+        // State 90
+        -474,
+        // State 91
+        0,
+        // State 92
+        -471,
+        // State 93
+        0,
+        // State 94
+        -388,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        -353,
+        // State 99
+        -409,
+        // State 100
+        -51,
+        // State 101
+        0,
+        // State 102
+        -477,
+        // State 103
+        0,
+        // State 104
+        -413,
+        // State 105
+        -457,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        -81,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        0,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        -473,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        -52,
+        // State 122
+        0,
+        // State 123
+        -82,
+        // State 124
+        0,
+        // State 125
+        0,
+        // State 126
+        0,
+        // State 127
+        0,
+        // State 128
+        0,
+        // State 129
+        0,
+        // State 130
+        0,
+        // State 131
+        0,
+        // State 132
+        0,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        0,
+        // State 139
+        0,
+        // State 140
+        -454,
+        // State 141
+        0,
+        // State 142
+        -456,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        -453,
+        // State 148
+        -455,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        -452,
+        // State 154
+        -451,
+    ];
+    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, 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,
+        // 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,
+        // 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, 4, 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, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 23, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 35, 0, 0, 36, 37, 0, 38, 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, 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, 9, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 50, 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, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 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, 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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, 9, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 67, 0, 68, 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 75, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 82, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 83, 0, 84, 36, 37, 0, 38, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 0, 0, 0, 86, 37, 0, 38, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 91, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 92, 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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, 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, 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, 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,
+        // 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,
+        // 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,
+        // 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 99, 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, 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,
+        // 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,
+        // 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,
+        // 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, 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, 9, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 67, 0, 102, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 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, 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, 9, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 112, 0, 0, 36, 37, 0, 38, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 114, 0, 0, 36, 37, 0, 38, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 134, 0, 0, 36, 37, 0, 38, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 0, 0, 0, 137, 37, 0, 38, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 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, 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, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 133, 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,
+        // State 127
+        0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 133, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 152, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 154, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct GrammarWhereClausesParser {
+        _priv: (),
+    }
+
+    impl GrammarWhereClausesParser {
+        pub fn new() -> GrammarWhereClausesParser {
+            GrammarWhereClausesParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Vec<WhereClause<TypeRef>>, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Vec<WhereClause<TypeRef>>,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                let ___sym0 = ___pop_Variant48(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action1::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___GrammarWhereClauses::GrammarWhereClausesParser;
+
+mod ___parse___MatchMapping {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    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, 8, 0, 0, 9, 10, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        -495,
+        // State 2
+        -417,
+        // State 3
+        -448,
+        // State 4
+        -416,
+        // State 5
+        -415,
+        // State 6
+        -372,
+        // State 7
+        -449,
+        // State 8
+        -418,
+        // State 9
+        -427,
+    ];
+    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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct MatchMappingParser {
+        _priv: (),
+    }
+
+    impl MatchMappingParser {
+        pub fn new() -> MatchMappingParser {
+            MatchMappingParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<TerminalString, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<TerminalString,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                // ___MatchMapping = MatchMapping => ActionFn(3);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action3::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___MatchMapping::MatchMappingParser;
+
+mod ___parse___Pattern {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 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, 12, 0, 13, 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, -389, -389, 0, 0, -389, 0, 0, 0, 16, 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, -389, -389, 0,
+        // State 3
+        0, 0, 0, 0, 0, 0, 17, -406, 0, 0, -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, 18, -406, 0,
+        // 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,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, -391, 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, -391, 0,
+        // State 6
+        0, 0, 0, 0, 0, 0, 7, -160, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 0, 0, 0, 0, -402, 0, 0, -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, -402, 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, 12, 0, 13, 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, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, -405, 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, -405, 0,
+        // State 11
+        0, 0, 0, 0, 0, 0, -360, -360, 0, 0, -360, 0, 0, -360, -360, 0, -360, 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, -360, -360, 0,
+        // State 12
+        0, 0, 0, 0, 0, 0, -361, -361, 0, 0, -361, 0, 0, -361, -361, 0, -361, 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, -361, -361, 0,
+        // State 13
+        0, 0, 0, 0, 0, 0, 0, -401, 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, -401, 0,
+        // State 14
+        0, 0, 0, 0, 0, 0, -390, -390, 0, 0, -390, 0, 0, 0, 29, 0, -390, 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, -390, -390, 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, -46, 0, -46, 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, 7, -160, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 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, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
+        // State 18
+        0, 0, 0, 0, 0, 0, 7, -162, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        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, 0, 0, 0, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 0, 0, 0, 0, -159, 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, 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, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        0, 0, 0, 0, 0, 0, -387, -387, 0, 0, -387, 0, 0, 0, 16, 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, -387, -387, 0,
+        // State 23
+        0, 0, 0, 0, 0, 0, 0, -478, 0, 0, -478, 0, 0, 0, 0, 0, 40, 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,
+        // 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, 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,
+        // State 25
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 26
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 64, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        0, 0, 0, 26, 0, 27, 28, -176, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 30
+        0, 0, 0, 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, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0,
+        // State 31
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74, 0,
+        // State 32
+        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, 0, 0, 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, 76, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 0, -396, 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, -396, 0,
+        // State 35
+        0, 0, 0, 0, 0, 0, 0, -161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        0, 0, 0, 0, 0, 0, 0, -404, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -404, 0,
+        // State 37
+        0, 0, 0, 0, 0, 0, -71, -71, 0, 0, 0, 0, -71, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, -71, 0, -71, 0, 0, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 38
+        0, 0, 0, 0, 0, 0, -388, -388, 0, 0, -388, 0, 0, 0, 29, 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, -388, -388, 0,
+        // State 39
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 12, 64, 13, 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, -403, 0, 0, -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, -403, 0,
+        // State 41
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 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, 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,
+        // State 43
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 45
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 46
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        0, 0, 0, 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,
+        // State 48
+        -430, 0, 0, -430, 0, 0, -430, -430, 86, 87, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 88, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 50
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 51
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 52
+        52, 0, 0, 0, 0, 0, 53, -193, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 53
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 94, 0, 95, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 54
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 55
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 56
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 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, -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,
+        // State 59
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 61
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0,
+        // State 62
+        0, 0, 0, 0, 0, 0, 0, -476, 0, 0, -476, 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,
+        // State 63
+        0, 0, 0, -362, 0, -362, -362, 0, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 64
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, 26, 0, 27, 28, -178, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, 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,
+        // State 67
+        0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 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,
+        // State 68
+        0, 0, 0, 0, 0, 0, 0, -394, 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, -394, 0,
+        // State 69
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 103, 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, 104, 0,
+        // State 71
+        0, 0, 0, 0, 0, 0, 0, -398, 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, -398, 0,
+        // State 72
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, -395, 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, -395, 0,
+        // State 74
+        0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, 0, 0, 0, 0, 0, 0, -399, 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, -399, 0,
+        // State 76
+        0, 0, 0, 0, 0, 0, -72, -72, 0, 0, 0, 0, -72, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, -72, 0, -72, 0, 0, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 12, 64, 13, 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, 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,
+        // State 79
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 80
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 81
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 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,
+        // State 82
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, -164, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        0, 0, 0, 0, 0, 0, 0, -472, 0, 0, -472, 0, 0, 0, 0, 0, 0, 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,
+        // State 84
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 85
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 86
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 88
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 89
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        52, 0, 0, 0, 0, 0, 53, -194, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 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, 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,
+        // State 92
+        0, 0, 0, 0, 0, 0, 0, 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 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,
+        // State 93
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 94
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 95
+        0, 0, 0, 0, 0, 0, 0, -475, 0, 0, -475, 0, 0, 0, 0, 0, 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,
+        // State 96
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 97
+        0, 0, 0, 0, 0, 0, 0, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 98
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 99
+        0, 0, 0, 0, 0, 0, 0, -471, 0, 0, -471, 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,
+        // State 100
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, 0, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 0, -397, 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, -397, 0,
+        // State 103
+        0, 0, 0, 0, 0, 0, 0, -400, 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, -400, 0,
+        // State 104
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0,
+        // State 105
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 106
+        0, 0, 0, 0, 0, 0, 0, -477, 0, 0, -477, 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,
+        // State 107
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, -166, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 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, 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,
+        // State 110
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 111
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 112
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 113
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 114
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, 0, -473, 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,
+        // State 116
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 117
+        0, 0, 0, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 119
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 120
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 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,
+        // State 122
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 123
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        -389,
+        // State 3
+        -406,
+        // State 4
+        -496,
+        // State 5
+        -391,
+        // State 6
+        0,
+        // State 7
+        -402,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        -405,
+        // State 11
+        -360,
+        // State 12
+        -361,
+        // State 13
+        -401,
+        // State 14
+        -390,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        -387,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        -396,
+        // State 35
+        0,
+        // State 36
+        -404,
+        // State 37
+        0,
+        // State 38
+        -388,
+        // State 39
+        0,
+        // State 40
+        -403,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        0,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        -394,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        -398,
+        // State 72
+        0,
+        // State 73
+        -395,
+        // State 74
+        0,
+        // State 75
+        -399,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        0,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        0,
+        // State 102
+        -397,
+        // State 103
+        -400,
+        // State 104
+        0,
+        // State 105
+        0,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        0,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        0,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        0,
+        // State 123
+        0,
+    ];
+    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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 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,
+        // 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 25, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 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,
+        // State 17
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 36, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 48, 0, 0, 49, 50, 0, 51, 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, 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, 3, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 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, 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, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 3, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 81, 0, 82, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 42, 89, 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, 44, 45, 46, 0, 0, 0, 0, 47, 90, 0, 91, 49, 50, 0, 51, 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, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, 0, 0, 0, 0, 47, 0, 0, 0, 93, 50, 0, 51, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 98, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 99, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 105, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 81, 0, 106, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 111, 0, 0, 49, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 113, 0, 0, 49, 50, 0, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 119, 0, 0, 49, 50, 0, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 0, 0, 0, 122, 50, 0, 51, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct PatternParser {
+        _priv: (),
+    }
+
+    impl PatternParser {
+        pub fn new() -> PatternParser {
+            PatternParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Pattern<TypeRef>, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Pattern<TypeRef>,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                // ___Pattern = Pattern => ActionFn(4);
+                let ___sym0 = ___pop_Variant26(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action4::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___Pattern::PatternParser;
+
+mod ___parse___TypeRef {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 10, 0, 11, 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, -389, 0, 0, -389, 0, 0, 0, 13, 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,
+        // State 3
+        0, 0, 0, 0, 0, 0, 0, -478, 0, 0, -478, 0, 0, 0, 0, 0, 14, 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,
+        // 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,
+        // State 5
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 6
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 37, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 6, 0, 7, 8, -176, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 10, 0, 11, 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, -360, 0, 0, -360, 0, 0, 0, -360, 0, -360, 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,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, -361, 0, 0, -361, 0, 0, 0, -361, 0, -361, 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,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, -390, 0, 0, -390, 0, 0, 0, 44, 0, -390, 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,
+        // 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, -46, 0, -46, 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, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 10, 37, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 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, 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,
+        // State 16
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 17
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 18
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 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,
+        // State 21
+        -430, 0, 0, -430, 0, 0, -430, -430, 53, 54, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 55, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 23
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 24
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 25
+        25, 0, 0, 0, 0, 0, 26, -193, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 26
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 61, 0, 62, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 30
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 31
+        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,
+        // State 32
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 33
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 34
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
+        // State 35
+        0, 0, 0, 0, 0, 0, 0, -476, 0, 0, -476, 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,
+        // State 36
+        0, 0, 0, -362, 0, -362, -362, 0, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 37
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 6, 0, 7, 8, -178, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 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,
+        // State 40
+        0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 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,
+        // 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, 10, 0, 11, 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, -387, 0, 0, -387, 0, 0, 0, 13, 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,
+        // 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, -47, 0, -47, 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, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 10, 37, 11, 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, 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,
+        // State 46
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 47
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 48
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 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,
+        // State 49
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, -164, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, -472, 0, 0, -472, 0, 0, 0, 0, 0, 0, 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,
+        // State 51
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 52
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 53
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 54
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 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, 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,
+        // State 56
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        25, 0, 0, 0, 0, 0, 26, -194, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, 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,
+        // State 59
+        0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 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,
+        // State 60
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 61
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 62
+        0, 0, 0, 0, 0, 0, 0, -475, 0, 0, -475, 0, 0, 0, 0, 0, 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,
+        // State 63
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 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,
+        // State 66
+        0, 0, 0, 0, 0, 0, 0, -471, 0, 0, -471, 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,
+        // State 67
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -388, 0, 0, -388, 0, 0, 0, 44, 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,
+        // State 69
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 70
+        0, 0, 0, 0, 0, 0, 0, -477, 0, 0, -477, 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,
+        // State 71
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 72
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, -166, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, 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,
+        // State 74
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 75
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 76
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 78
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, 0, -473, 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,
+        // State 80
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 83
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 84
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 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,
+        // State 86
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        -389,
+        // State 3
+        -478,
+        // State 4
+        -497,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        -360,
+        // State 10
+        -361,
+        // State 11
+        -390,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        -476,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        -387,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        -472,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        -475,
+        // State 63
+        0,
+        // State 64
+        -474,
+        // State 65
+        0,
+        // State 66
+        -471,
+        // State 67
+        0,
+        // State 68
+        -388,
+        // State 69
+        0,
+        // State 70
+        -477,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        -473,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+    ];
+    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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 5, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 21, 0, 0, 22, 23, 0, 24, 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, 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, 3, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 36, 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, 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, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 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, 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 0, 49, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 15, 56, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 57, 0, 58, 22, 23, 0, 24, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 0, 0, 0, 60, 23, 0, 24, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 65, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 66, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 0, 70, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 75, 0, 0, 22, 23, 0, 24, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 77, 0, 0, 22, 23, 0, 24, 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 17, 18, 19, 0, 0, 0, 0, 20, 83, 0, 0, 22, 23, 0, 24, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 0, 0, 0, 86, 23, 0, 24, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct TypeRefParser {
+        _priv: (),
+    }
+
+    impl TypeRefParser {
+        pub fn new() -> TypeRefParser {
+            TypeRefParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<TypeRef, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<TypeRef,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                // ___TypeRef = TypeRef => ActionFn(2);
+                let ___sym0 = ___pop_Variant3(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action2::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___TypeRef::TypeRefParser;
+
+#[allow(unused_variables)]
+fn ___action0<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Grammar, usize),
+) -> Grammar
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action1<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action2<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action3<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action4<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> Pattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action5<
+    'input,
+>(
+    text: &'input str,
+    (_, module_attributes, _): (usize, ::std::vec::Vec<String>, usize),
+    (_, uses, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, annotations, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, tps, _): (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    (_, parameters, _): (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    (_, where_clauses, _): (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, items, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    {
+        Grammar { prefix: format!("__"), // adjusted by `parse_grammar`
+                  span: Span(lo, hi),
+                  type_parameters: tps.unwrap_or(vec![]),
+                  parameters: parameters.unwrap_or(vec![]),
+                  where_clauses: where_clauses.unwrap_or(vec![]),
+                  items: uses.into_iter().chain(items).collect(),
+                  annotations: annotations,
+                  module_attributes: module_attributes}
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action6<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeParameter>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<TypeParameter>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action7<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeParameter
+{
+    TypeParameter::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action8<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeParameter
+{
+    TypeParameter::Id(l)
+}
+
+#[allow(unused_variables)]
+fn ___action9<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action10<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, bounds, _): (usize, Vec<Atom>, usize),
+) -> WhereClause<TypeRef>
+{
+    WhereClause::Lifetime { lifetime: l, bounds: bounds }
+}
+
+#[allow(unused_variables)]
+fn ___action11<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, bounds, _): (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    WhereClause::Type { forall: f, ty: ty, bounds: bounds }
+}
+
+#[allow(unused_variables)]
+fn ___action12<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Atom>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Atom>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action13<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action14<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action15<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, params, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ret, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Fn { forall: f, path: p, parameters: params, ret: ret }
+}
+
+#[allow(unused_variables)]
+fn ___action16<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, params, _): (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Trait { forall: f, path: p, parameters: params.unwrap_or(vec![]) }
+}
+
+#[allow(unused_variables)]
+fn ___action17<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action18<
+    'input,
+>(
+    text: &'input str,
+    (_, ty, _): (usize, TypeRef, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::TypeParameter(ty)
+}
+
+#[allow(unused_variables)]
+fn ___action19<
+    'input,
+>(
+    text: &'input str,
+    (_, id, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::Associated(id, ty)
+}
+
+#[allow(unused_variables)]
+fn ___action20<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Parameter>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Parameter>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action21<
+    'input,
+>(
+    text: &'input str,
+    (_, id, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+) -> Parameter
+{
+    Parameter { name: id, ty: ty }
+}
+
+#[allow(unused_variables)]
+fn ___action22<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action23<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action24<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action25<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action26<
+    'input,
+>(
+    text: &'input str,
+    (_, u, _): (usize, &'input str, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    GrammarItem::Use(strip(u).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action27<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Visibility
+{
+    Visibility::Pub(Some(p))
+}
+
+#[allow(unused_variables)]
+fn ___action28<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> Visibility
+{
+    Visibility::Pub(None)
+}
+
+#[allow(unused_variables)]
+fn ___action29<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, (), usize),
+) -> Visibility
+{
+    Visibility::Priv
+}
+
+#[allow(unused_variables)]
+fn ___action30<
+    'input,
+>(
+    text: &'input str,
+    (_, annotations, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, v, _): (usize, Visibility, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, n, _): (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, t, _): (usize, ::std::option::Option<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a, _): (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::Nonterminal(NonterminalData { visibility: v,
+                                                   span: Span(lo, hi),
+                                                   name: n.0,
+                                                   annotations: annotations,
+                                                   args: n.1,
+                                                   type_decl: t,
+                                                   alternatives: a })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action31<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, id, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    {
+        Annotation { id_span: Span(lo, hi), id: id }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action32<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___1, _): (usize, Vec<NonterminalString>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (___0, ___1)
+}
+
+#[allow(unused_variables)]
+fn ___action33<
+    'input,
+>(
+    text: &'input str,
+    (_, n, _): (usize, NonterminalString, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (n, vec![])
+}
+
+#[allow(unused_variables)]
+fn ___action34<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, &'input str, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (NonterminalString(Atom::from(___0)), vec![])
+}
+
+#[allow(unused_variables)]
+fn ___action35<
+    'input,
+>(
+    text: &'input str,
+    (_, a, _): (usize, Alternative, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Alternative>
+{
+    vec![a]
+}
+
+#[allow(unused_variables)]
+fn ___action36<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Alternative>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Alternative>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action37<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, s, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, c, _): (usize, ::std::option::Option<Condition>, usize),
+    (_, a, _): (usize, ::std::option::Option<ActionKind>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Alternative
+{
+    {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: s },
+            condition: c,
+            action: a
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action38<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, c, _): (usize, ::std::option::Option<Condition>, usize),
+    (_, a, _): (usize, ActionKind, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Alternative
+{
+    {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: vec![] },
+            condition: c,
+            action: Some(a)
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action39<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ActionKind
+{
+    ActionKind::Lookahead
+}
+
+#[allow(unused_variables)]
+fn ___action40<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ActionKind
+{
+    ActionKind::Lookbehind
+}
+
+#[allow(unused_variables)]
+fn ___action41<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> ActionKind
+{
+    ActionKind::User(strip(c).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action42<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> ActionKind
+{
+    ActionKind::Fallible(strip(c).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action43<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, a, _): (usize, NonterminalString, usize),
+    (_, op, _): (usize, ConditionOp, usize),
+    (_, b, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Condition
+{
+    {
+        Condition { span:Span(lo, hi), lhs:a, rhs:b, op:op }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action44<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::Equals
+}
+
+#[allow(unused_variables)]
+fn ___action45<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::NotEquals
+}
+
+#[allow(unused_variables)]
+fn ___action46<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::Match
+}
+
+#[allow(unused_variables)]
+fn ___action47<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::NotMatch
+}
+
+#[allow(unused_variables)]
+fn ___action48<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ExprSymbol
+{
+    ExprSymbol { symbols: ___0 }
+}
+
+#[allow(unused_variables)]
+fn ___action49<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, usize, usize),
+    (_, l, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, s, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), SymbolKind::Name(l, Box::new(s)))
+}
+
+#[allow(unused_variables)]
+fn ___action50<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, s, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), SymbolKind::Choose(Box::new(s)))
+}
+
+#[allow(unused_variables)]
+fn ___action51<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action52<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action53<
+    'input,
+>(
+    text: &'input str,
+    (_, lhs, _): (usize, Symbol, usize),
+    (_, op, _): (usize, RepeatOp, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lhs.span.0, hi),
+                    SymbolKind::Repeat(Box::new(RepeatSymbol { symbol: lhs, op: op })))
+}
+
+#[allow(unused_variables)]
+fn ___action54<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Plus
+}
+
+#[allow(unused_variables)]
+fn ___action55<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Star
+}
+
+#[allow(unused_variables)]
+fn ___action56<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Question
+}
+
+#[allow(unused_variables)]
+fn ___action57<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, sk, _): (usize, SymbolKind, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), sk)
+}
+
+#[allow(unused_variables)]
+fn ___action58<
+    'input,
+>(
+    text: &'input str,
+    (_, name, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, args, _): (usize, Vec<Symbol>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Macro(MacroSymbol { name: name, args: args })
+}
+
+#[allow(unused_variables)]
+fn ___action59<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> SymbolKind
+{
+    SymbolKind::Terminal(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action60<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, &'input str, usize),
+) -> SymbolKind
+{
+    SymbolKind::AmbiguousId(Atom::from(___0))
+}
+
+#[allow(unused_variables)]
+fn ___action61<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> SymbolKind
+{
+    SymbolKind::Nonterminal(NonterminalString(___0))
+}
+
+#[allow(unused_variables)]
+fn ___action62<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, ExprSymbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Expr(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action63<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Lookahead
+}
+
+#[allow(unused_variables)]
+fn ___action64<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Lookbehind
+}
+
+#[allow(unused_variables)]
+fn ___action65<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Error
+}
+
+#[allow(unused_variables)]
+fn ___action66<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    TypeRef::Tuple(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action67<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    {
+        TypeRef::OfSymbol(___0.kind)
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action68<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, l, _): (usize, ::std::option::Option<Atom>, usize),
+    (_, m, _): (usize, ::std::option::Option<Tok<'input>>, usize),
+    (_, t, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    TypeRef::Ref { lifetime: l,
+                       mutable: m.is_some(),
+                       referent: Box::new(t) }
+}
+
+#[allow(unused_variables)]
+fn ___action69<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    TypeRef::Nominal { path: p, types: a }
+}
+
+#[allow(unused_variables)]
+fn ___action70<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+) -> TypeRef
+{
+    match p.as_id() {
+            Some(id) => TypeRef::Id(id),
+            None => TypeRef::Nominal { path: p, types: vec![] }
+        }
+}
+
+#[allow(unused_variables)]
+fn ___action71<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action72<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> TypeRef
+{
+    TypeRef::Lifetime(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action73<
+    'input,
+>(
+    text: &'input str,
+    (_, a, _): (usize, ::std::option::Option<Tok<'input>>, usize),
+    (_, h, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, t, _): (usize, Atom, usize),
+) -> Path
+{
+    {
+        Path { absolute: a.is_some(),
+               ids: h.into_iter().chain(once(t)).collect() }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action74<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, et, _): (usize, EnumToken, usize),
+    (_, a1, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0.into_iter().chain(a1).collect(),
+            enum_token: Some(et),
+        })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action75<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0,
+            enum_token: None,
+        })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action76<
+    'input,
+>(
+    text: &'input str,
+    (_, t, _): (usize, MatchToken, usize),
+) -> GrammarItem
+{
+    GrammarItem::MatchToken(t)
+}
+
+#[allow(unused_variables)]
+fn ___action77<
+    'input,
+>(
+    text: &'input str,
+    (_, t, _): (usize, MatchToken, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, MatchContents, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    t.add(c)
+}
+
+#[allow(unused_variables)]
+fn ___action78<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, MatchContents, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    MatchToken::new(c, Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action79<
+    'input,
+>(
+    text: &'input str,
+    (_, items, _): (usize, Vec<MatchItem>, usize),
+) -> MatchContents
+{
+    MatchContents { items: items }
+}
+
+#[allow(unused_variables)]
+fn ___action80<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> MatchItem
+{
+    MatchItem::CatchAll(Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action81<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, s, _): (usize, TerminalLiteral, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> MatchItem
+{
+    MatchItem::Unmapped(s, Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action82<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, from, _): (usize, TerminalLiteral, usize),
+    (_, start, _): (usize, usize, usize),
+    (_, p, _): (usize, &'input str, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    {
+        let to = try!(super::parse_match_mapping(p, start + 2));
+        Ok(MatchItem::Mapped(from, to, Span(lo, hi)))
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action83<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalLiteral, usize),
+) -> TerminalLiteral
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action84<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action85<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, t, _): (usize, TypeRef, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, Vec<Conversion>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    {
+        EnumToken {
+            type_name: t,
+            type_span: Span(lo, hi),
+            conversions: c,
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action86<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, n, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, t, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    {
+        AssociatedType { type_span: Span(lo, hi),
+                         type_name: n,
+                         type_ref: t }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action87<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, from, _): (usize, TerminalString, usize),
+    (_, start, _): (usize, usize, usize),
+    (_, p, _): (usize, &'input str, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    {
+        let pattern = try!(super::parse_pattern(p, start + 2));
+        Ok(Conversion { span: Span(lo, hi),
+                        from: from,
+                        to: pattern })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action88<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, k, _): (usize, PatternKind<TypeRef>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Pattern<TypeRef>
+{
+    Pattern { span: Span(lo, hi), kind: k }
+}
+
+#[allow(unused_variables)]
+fn ___action89<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___1, _): (usize, Vec<Pattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Enum(___0, ___1)
+}
+
+#[allow(unused_variables)]
+fn ___action90<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, a1, _): (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Struct(p, a0.into_iter().chain(a1).collect(), false)
+}
+
+#[allow(unused_variables)]
+fn ___action91<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Struct(p, a0, true)
+}
+
+#[allow(unused_variables)]
+fn ___action92<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Underscore
+}
+
+#[allow(unused_variables)]
+fn ___action93<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::DotDot
+}
+
+#[allow(unused_variables)]
+fn ___action94<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Choose(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action95<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Pattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Tuple(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action96<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::CharLiteral(Atom::from(c))
+}
+
+#[allow(unused_variables)]
+fn ___action97<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Path, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Path(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action98<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, id, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, pat, _): (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    {
+        FieldPattern { field_span: Span(lo, hi),
+                       field_name: id,
+                       pattern: pat }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action99<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> NonterminalString
+{
+    NonterminalString(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action100<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> NonterminalString
+{
+    NonterminalString(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action101<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action102<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action103<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action104<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action105<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action106<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> TerminalString
+{
+    TerminalString::Bare(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action107<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalLiteral, usize),
+) -> TerminalString
+{
+    TerminalString::Literal(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action108<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, Atom, usize),
+) -> TerminalLiteral
+{
+    TerminalLiteral::Quoted(s)
+}
+
+#[allow(unused_variables)]
+fn ___action109<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, Atom, usize),
+) -> TerminalLiteral
+{
+    TerminalLiteral::Regex(s)
+}
+
+#[allow(unused_variables)]
+fn ___action110<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(s)
+}
+
+#[allow(unused_variables)]
+fn ___action111<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(s)
+}
+
+#[allow(unused_variables)]
+fn ___action112<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> String
+{
+    s.to_string()
+}
+
+#[allow(unused_variables)]
+fn ___action113<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::option::Option<FieldPattern<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action114<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<FieldPattern<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action115<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action116<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action117<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> FieldPattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action118<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action119<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Conversion>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action120<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+    (_, e1, _): (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action121<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<AssociatedType>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action122<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action123<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action124<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action125<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action126<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Tok<'input>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action127<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Tok<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action128<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action129<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Tok<'input>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action130<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Tok<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action131<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::option::Option<Atom>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action132<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Atom>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action133<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action134<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action135<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action136<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, ActionKind, usize),
+) -> ::std::option::Option<ActionKind>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action137<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<ActionKind>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action138<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Condition, usize),
+) -> ::std::option::Option<Condition>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action139<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Condition>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action140<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Condition, usize),
+) -> Condition
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action141<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action142<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action143<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Alternative>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action144<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+    (_, e1, _): (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action145<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action146<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action147<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action148<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ()
+{
+    ()
+}
+
+#[allow(unused_variables)]
+fn ___action149<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Parameter>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action150<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action151<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action152<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action153<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action154<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action155<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action156<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action157<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action158<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    (_, e, _): (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    match e {
+        None => v,
+        Some(e) => {
+            let mut v = v;
+            v.push(e);
+            v
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action159<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action160<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<Atom>, usize),
+) -> ::std::option::Option<Vec<Atom>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action161<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<Atom>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action162<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    match e {
+        None => v,
+        Some(e) => {
+            let mut v = v;
+            v.push(e);
+            v
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action163<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action164<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action165<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action166<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action167<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> ::std::option::Option<Vec<WhereClause<TypeRef>>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action168<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<WhereClause<TypeRef>>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action169<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<Parameter>, usize),
+) -> ::std::option::Option<Vec<Parameter>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action170<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<Parameter>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action171<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeParameter>, usize),
+) -> ::std::option::Option<Vec<TypeParameter>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action172<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<TypeParameter>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action173<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> usize
+{
+    ___lookbehind.clone()
+}
+
+#[allow(unused_variables)]
+fn ___action174<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> usize
+{
+    ___lookahead.clone()
+}
+
+#[allow(unused_variables)]
+fn ___action175<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Annotation>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action176<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Annotation>, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action177<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action178<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action179<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<String>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action180<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<String>, usize),
+) -> ::std::vec::Vec<String>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action181<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, String, usize),
+) -> ::std::vec::Vec<String>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action182<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<String>, usize),
+    (_, e, _): (usize, String, usize),
+) -> ::std::vec::Vec<String>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action183<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action184<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, e, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action185<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Annotation, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action186<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, e, _): (usize, Annotation, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action187<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action188<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, e, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action189<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+) -> ::std::option::Option<TypeParameter>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action190<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeParameter>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action191<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeParameter>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action192<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action193<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeParameter
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action194<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::option::Option<WhereClause<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action195<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<WhereClause<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action196<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action197<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action198<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> WhereClause<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action199<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action200<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action201<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action202<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action203<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action204<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action205<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::option::Option<TypeBound<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action206<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeBound<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action207<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action208<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action209<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action210<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action211<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action212<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action213<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action214<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action215<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::option::Option<TypeBoundParameter<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action216<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeBoundParameter<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action217<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action218<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action219<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action220<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+) -> ::std::option::Option<Parameter>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action221<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Parameter>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action222<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Parameter>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action223<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Parameter>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action224<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Parameter
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action225<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+) -> ::std::option::Option<NonterminalString>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action226<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<NonterminalString>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action227<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<NonterminalString>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action228<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action229<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> NonterminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action230<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+) -> ::std::option::Option<Alternative>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action231<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Alternative>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action232<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Alternative>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action233<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Alternative>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action234<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Alternative
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action235<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::option::Option<Symbol>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action236<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Symbol>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action237<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action238<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action239<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action240<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action241<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action242<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action243<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action244<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action245<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action246<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action247<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, AssociatedType, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action248<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, e, _): (usize, AssociatedType, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action249<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+) -> ::std::option::Option<MatchItem>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action250<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<MatchItem>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action251<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<MatchItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action252<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action253<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action254<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+) -> ::std::option::Option<Conversion>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action255<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Conversion>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action256<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Conversion>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action257<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Conversion>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action258<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Conversion
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action259<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::option::Option<Pattern<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action260<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Pattern<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action261<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action262<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action263<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Pattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action264<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action265<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, e, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action266<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action267<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    (_, e, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action268<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action269<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Conversion>, usize),
+    (_, e, _): (usize, Conversion, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action270<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action271<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+    (_, e, _): (usize, MatchItem, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action272<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action273<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action274<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action275<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action276<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action277<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Alternative>, usize),
+    (_, e, _): (usize, Alternative, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action278<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action279<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+    (_, e, _): (usize, NonterminalString, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action280<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action281<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Parameter>, usize),
+    (_, e, _): (usize, Parameter, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action282<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action283<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, e, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action284<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action285<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action286<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action287<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    (_, e, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action288<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action289<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action290<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action291<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action292<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action293<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    (_, e, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action294<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action295<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+    (_, e, _): (usize, TypeParameter, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action296<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::vec::Vec<Atom>, usize),
+    ___2: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action126(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action73(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action297<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action127(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action73(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action298<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action129(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action68(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action299<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action130(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action68(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action300<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action156(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action154(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action301<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action300(
+        text,
+        ___5,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action15(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action302<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action155(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action15(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action303<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action147(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action145(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action304<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action303(
+        text,
+        ___5,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action30(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action305<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action146(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action30(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action306<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action152(
+        text,
+        ___0,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action150(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action307<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action306(
+        text,
+        ___2,
+        ___3,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action16(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action308<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action151(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action16(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action309<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+) -> ::std::option::Option<Condition>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action140(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action138(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action310<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Condition, usize),
+    ___4: (usize, ::std::option::Option<ActionKind>, usize),
+    ___5: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action309(
+        text,
+        ___2,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action37(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action311<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___2: (usize, ::std::option::Option<ActionKind>, usize),
+    ___3: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action139(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action37(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action312<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ActionKind, usize),
+    ___4: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action309(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action38(
+        text,
+        ___0,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action313<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ActionKind, usize),
+    ___2: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action139(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action38(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action314<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Visibility
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action148(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action29(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action315<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Alternative, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action234(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action276(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action316<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, Alternative, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action234(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action277(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action317<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action232(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action143(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action318<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action233(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action143(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action319<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Conversion, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action258(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action268(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action320<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, Conversion, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action258(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action269(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action321<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action256(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action119(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action322<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action257(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action119(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action323<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, FieldPattern<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action117(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action264(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action324<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___1: (usize, FieldPattern<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action117(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action265(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action325<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action115(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action90(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action326<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action116(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action90(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action327<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action115(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action91(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action328<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action116(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action91(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action329<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Parameter, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action224(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action280(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action330<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, Parameter, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action224(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action281(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action331<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action222(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action149(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action332<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action223(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action149(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action333<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, WhereClause<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action198(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action292(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action334<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, WhereClause<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action198(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action293(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action335<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action196(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action163(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action336<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action197(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action163(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action337<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action125(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action245(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action338<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action125(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action246(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action339<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action123(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action296(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action340<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::vec::Vec<Atom>, usize),
+    ___2: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action124(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action296(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action341<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action123(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action297(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action342<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action124(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action297(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action343<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action201(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action290(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action344<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action201(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action291(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action345<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action199(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action162(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action346<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action200(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action162(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action347<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action204(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action288(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action348<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action204(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action289(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action349<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action202(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action159(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action350<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action203(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action159(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action351<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, MatchItem, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action253(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action270(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action352<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, MatchItem, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action253(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action271(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action353<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action251(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action120(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action354<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action252(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action120(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action355<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action229(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action278(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action356<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, NonterminalString, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action229(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action279(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action357<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action227(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action144(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action358<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action228(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action144(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action359<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Pattern<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action263(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action266(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action360<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, Pattern<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action263(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action267(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action361<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action261(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action118(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action362<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action262(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action118(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action363<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action239(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action274(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action364<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action239(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action275(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action365<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action237(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action133(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action366<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action238(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action133(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action367<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBound<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action209(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action286(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action368<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, TypeBound<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action209(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action287(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action369<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action207(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action158(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action370<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action208(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action158(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action371<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBoundParameter<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action219(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action282(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action372<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, TypeBoundParameter<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action219(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action283(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action373<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action217(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action153(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action374<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action218(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action153(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action375<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeParameter, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action193(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action294(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action376<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, TypeParameter, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action193(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action295(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action377<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action191(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action164(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action378<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action192(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action164(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action379<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action214(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action284(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action380<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action214(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action285(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action381<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action212(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action157(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action382<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action213(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action157(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action383<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action244(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action272(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action384<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action244(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action273(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action385<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action242(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action128(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action386<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action243(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action128(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action387<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ::std::option::Option<ActionKind>, usize),
+    ___4: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action310(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action388<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<ActionKind>, usize),
+    ___2: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action311(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action389<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+    ___2: (usize, ActionKind, usize),
+    ___3: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action312(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action390<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ActionKind, usize),
+    ___1: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action313(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action391<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action31(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action392<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action86(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action393<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, ConditionOp, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, usize, usize),
+) -> Condition
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action43(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action394<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalString, usize),
+    ___1: (usize, &'input str, usize),
+    ___2: (usize, usize, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action87(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action395<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Conversion>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action85(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action396<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, EnumToken, usize),
+    ___5: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action74(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action397<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action75(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action398<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action98(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action399<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___7: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___8: (usize, Tok<'input>, usize),
+    ___9: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action5(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+        ___9,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action400<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action80(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action401<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, usize, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action81(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action402<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, &'input str, usize),
+    ___2: (usize, usize, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action82(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action403<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, MatchContents, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action78(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action404<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, TypeRef, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action304(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action405<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action305(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action406<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, PatternKind<TypeRef>, usize),
+    ___1: (usize, usize, usize),
+) -> Pattern<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action88(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action407<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Symbol, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action49(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action408<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action50(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action409<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, SymbolKind, usize),
+    ___1: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action57(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action410<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ::std::option::Option<ActionKind>, usize),
+) -> Alternative
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action387(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action411<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<ActionKind>, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action388(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action412<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+    ___2: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action389(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action413<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action390(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action414<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action391(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action415<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action392(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action416<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, ConditionOp, usize),
+    ___2: (usize, Atom, usize),
+) -> Condition
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action393(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action417<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalString, usize),
+    ___1: (usize, &'input str, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action394(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action418<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Conversion>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action395(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action419<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action396(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action420<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action397(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action421<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action398(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action422<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action399(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action423<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action400(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action424<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action401(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action425<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, &'input str, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action402(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action426<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, MatchContents, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action403(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action427<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action404(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action428<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action405(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action429<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, PatternKind<TypeRef>, usize),
+) -> Pattern<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action406(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action430<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Symbol, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action407(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action431<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action408(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action432<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+    ___1: (usize, RepeatOp, usize),
+) -> Symbol
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action53(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action433<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, SymbolKind, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action409(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action434<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action136(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action410(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action435<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action137(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action410(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action436<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action136(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action411(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action437<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action137(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action411(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action438<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Alternative, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action230(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action317(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action439<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Alternative>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action231(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action317(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action440<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, Alternative, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action230(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action318(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action441<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action231(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action318(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action442<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action422(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action443<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action422(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action444<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Visibility, usize),
+    ___1: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action427(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action445<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action427(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action446<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Visibility, usize),
+    ___1: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action428(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action447<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action428(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action448<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, EnumToken, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___start1 = ___2.2.clone();
+    let ___end1 = ___3.0.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action121(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___temp1,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action449<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, EnumToken, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___start1 = ___3.0.clone();
+    let ___end1 = ___3.2.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action122(
+        text,
+        ___3,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___temp1,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action450<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___start1 = ___3.2.clone();
+    let ___end1 = ___4.0.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action121(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___temp1,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action451<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___start1 = ___4.0.clone();
+    let ___end1 = ___4.2.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action122(
+        text,
+        ___4,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___temp1,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action452<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action420(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action453<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action420(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action454<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Conversion, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action254(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action321(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action455<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Conversion>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action255(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action321(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action456<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, Conversion, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action254(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action322(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action457<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action255(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action322(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action458<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, FieldPattern<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action113(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action325(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action459<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action114(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action325(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action460<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, FieldPattern<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action113(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action326(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action461<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action114(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action326(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action462<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action11(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action463<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action11(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action464<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action301(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action465<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action301(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action466<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action302(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action467<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action302(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action468<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action307(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action469<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action307(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action470<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action308(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action471<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action308(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action472<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.2.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action165(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action442(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action473<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___7.0.clone();
+    let ___end0 = ___7.2.clone();
+    let ___temp0 = ___action166(
+        text,
+        ___7,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action442(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action474<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___7.2.clone();
+    let ___end0 = ___7.2.clone();
+    let ___temp0 = ___action165(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action443(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action475<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___8.0.clone();
+    let ___end0 = ___8.2.clone();
+    let ___temp0 = ___action166(
+        text,
+        ___8,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action443(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action476<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Parameter, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action220(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action331(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action477<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Parameter>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action221(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action331(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action478<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, Parameter, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action220(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action332(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action479<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action221(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action332(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action480<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action472(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action481<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action472(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action482<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action473(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action483<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action473(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action484<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action474(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action485<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action474(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action486<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action475(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action487<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action475(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action488<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action480(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action489<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action480(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action490<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action481(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action491<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action481(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action492<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action482(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action493<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action482(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action494<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action483(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action495<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action483(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action496<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action484(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action497<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action484(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action498<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action485(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action499<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action485(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action500<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action486(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action501<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action486(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action502<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action487(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action503<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action487(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action504<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, WhereClause<TypeRef>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action194(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action335(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action505<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action195(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action335(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action506<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, WhereClause<TypeRef>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action194(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action336(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action507<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action195(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action336(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action508<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action488(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action509<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action488(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action510<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action489(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action511<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action489(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action512<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action490(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action513<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action490(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action514<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action491(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action515<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action491(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action516<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action492(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action517<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action492(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action518<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action493(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action519<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action493(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action520<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action494(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action521<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action494(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action522<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action495(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action523<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action495(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action524<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action496(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action525<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.2.clone();
+    let ___end0 = ___6.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action496(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action526<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action497(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action527<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action497(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action528<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action498(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action529<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action498(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action530<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action499(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action531<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action499(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action532<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action500(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action533<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.2.clone();
+    let ___end0 = ___6.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action500(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action534<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action501(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action535<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action501(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action536<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action502(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action537<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action502(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action538<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action503(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action539<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action503(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action540<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action349(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action541<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Atom>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action349(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action542<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action350(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action543<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action350(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action544<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action345(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action545<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Atom>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action345(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action546<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action346(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action547<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action346(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action548<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action298(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action549<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action298(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action550<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action299(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action551<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action299(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action552<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, MatchItem, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action249(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action353(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action553<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action250(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action353(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action554<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, MatchItem, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action249(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action354(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action555<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action250(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action354(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action556<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action225(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action357(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action557<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action226(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action357(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action558<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, NonterminalString, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action225(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action358(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action559<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action226(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action358(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action560<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Pattern<TypeRef>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action259(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action361(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action561<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action260(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action361(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action562<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, Pattern<TypeRef>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action259(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action362(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action563<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action260(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action362(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action564<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action508(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action565<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action508(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action566<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action509(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action567<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action509(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action568<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action510(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action569<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action510(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action570<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action511(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action571<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action511(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action572<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action512(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action573<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action512(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action574<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action513(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action575<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action513(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action576<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action514(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action577<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action514(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action578<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action515(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action579<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action515(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action580<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action516(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action581<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action516(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action582<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action517(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action583<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action517(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action584<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action518(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action585<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action518(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action586<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action519(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action587<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action519(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action588<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action520(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action589<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action520(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action590<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action521(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action591<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action521(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action592<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action522(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action593<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action522(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action594<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action523(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action595<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action523(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action596<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action524(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action597<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action524(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action598<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action525(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action599<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action525(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action600<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action526(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action601<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action526(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action602<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action527(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action603<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action527(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action604<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action528(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action605<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action528(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action606<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action529(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action607<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action529(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action608<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action530(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action609<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action530(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action610<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action531(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action611<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action531(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action612<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action532(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action613<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action532(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action614<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action533(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action615<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action533(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action616<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action534(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action617<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action534(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action618<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action535(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action619<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action535(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action620<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action536(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action621<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action536(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action622<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action537(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action623<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action537(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action624<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action538(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action625<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action538(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action626<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action539(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action627<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action539(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action628<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ExprSymbol
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action134(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action48(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action629<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ExprSymbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action135(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action48(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action630<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action235(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action365(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action631<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Symbol>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action236(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action365(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action632<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Symbol, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action235(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action366(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action633<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action236(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action366(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action634<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBound<TypeRef>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action205(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action369(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action635<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action206(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action369(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action636<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, TypeBound<TypeRef>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action205(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action370(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action637<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action206(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action370(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action638<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBoundParameter<TypeRef>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action215(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action373(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action639<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action216(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action373(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action640<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, TypeBoundParameter<TypeRef>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action215(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action374(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action641<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action216(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action374(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action642<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeParameter, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action189(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action377(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action643<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action190(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action377(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action644<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, TypeParameter, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action189(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action378(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action645<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action190(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action378(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action646<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action210(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action381(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action647<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action211(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action381(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action648<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action210(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action382(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action649<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action211(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action382(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action650<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action240(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action385(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action651<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action241(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action385(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action652<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action240(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action386(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action653<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action241(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action386(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action654<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action564(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action655<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action564(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action656<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action565(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action657<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action565(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action658<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action566(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action659<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action566(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action660<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action567(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action661<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action567(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action662<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action568(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action663<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action568(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action664<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action569(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action665<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action569(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action666<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action570(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action667<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action570(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action668<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action571(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action669<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action571(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action670<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action572(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action671<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action572(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action672<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action573(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action673<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action573(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action674<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action574(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action675<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action574(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action676<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action575(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action677<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action575(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action678<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action576(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action679<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action576(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action680<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action577(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action681<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action577(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action682<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action578(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action683<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action578(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action684<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action579(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action685<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action579(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action686<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action580(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action687<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action580(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action688<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action581(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action689<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action581(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action690<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action582(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action691<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action582(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action692<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action583(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action693<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action583(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action694<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action584(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action695<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action584(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action696<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action585(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action697<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action585(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action698<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action586(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action699<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action586(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action700<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action587(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action701<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action587(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action702<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action588(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action703<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action588(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action704<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action589(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action705<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action589(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action706<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action590(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action707<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action590(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action708<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action591(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action709<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action591(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action710<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action592(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action711<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action592(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action712<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action593(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action713<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action593(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action714<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action594(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action715<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action594(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action716<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action595(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action717<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action595(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action718<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action596(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action719<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action596(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action720<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action597(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action721<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action597(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action722<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action598(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action723<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action598(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action724<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action599(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action725<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action599(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action726<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action600(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action727<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action600(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action728<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action601(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action729<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action601(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action730<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action602(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action731<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action602(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action732<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action603(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action733<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action603(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action734<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action604(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action735<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action604(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action736<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action605(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action737<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action605(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action738<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action606(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action739<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action606(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action740<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action607(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action741<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action607(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action742<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action608(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action743<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action608(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action744<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action609(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action745<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action609(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action746<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action610(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action747<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action610(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action748<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action611(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action749<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action611(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action750<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action612(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action751<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action612(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action752<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action613(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action753<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action613(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action754<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action614(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action755<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action614(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action756<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action615(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action757<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action615(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action758<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action616(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action759<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action616(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action760<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action617(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action761<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action617(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action762<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action618(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action763<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action618(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action764<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action619(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action765<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action619(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action766<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action620(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action767<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action620(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action768<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action621(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action769<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action621(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action770<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action622(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action771<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action622(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action772<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action623(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action773<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action623(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action774<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action624(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action775<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action624(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action776<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action625(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action777<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action625(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action778<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action626(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action779<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action626(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action780<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action627(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action781<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action627(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+pub trait ___ToTriple<'input, > {
+    type Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),Self::Error>;
+}
+
+impl<'input, > ___ToTriple<'input, > for (usize, Tok<'input>, usize) {
+    type Error = tok::Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),tok::Error> {
+        Ok(value)
+    }
+}
+impl<'input, > ___ToTriple<'input, > for Result<(usize, Tok<'input>, usize),tok::Error> {
+    type Error = tok::Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),tok::Error> {
+        value
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/parser/mod.rs
@@ -0,0 +1,54 @@
+use grammar::parse_tree::*;
+use grammar::pattern::*;
+use lalrpop_util;
+use tok;
+
+#[allow(dead_code)]
+mod lrgrammar;
+
+#[cfg(test)]
+mod test;
+
+pub type ParseError<'input> = lalrpop_util::ParseError<usize, tok::Tok<'input>, tok::Error>;
+
+pub fn parse_grammar<'input>(input: &'input str) -> Result<Grammar, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    let mut grammar = try!(lrgrammar::GrammarParser::new().parse(input, tokenizer));
+
+    // find a unique prefix that does not appear anywhere in the input
+    while input.contains(&grammar.prefix) {
+        grammar.prefix.push('_');
+    }
+
+    Ok(grammar)
+}
+
+fn parse_pattern<'input>(
+    input: &'input str,
+    offset: usize,
+) -> Result<Pattern<TypeRef>, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, offset);
+    lrgrammar::PatternParser::new().parse(input, tokenizer)
+}
+
+fn parse_match_mapping<'input>(
+    input: &'input str,
+    offset: usize,
+) -> Result<MatchMapping, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, offset);
+    lrgrammar::MatchMappingParser::new().parse(input, tokenizer)
+}
+
+#[cfg(test)]
+pub fn parse_type_ref<'input>(input: &'input str) -> Result<TypeRef, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    lrgrammar::TypeRefParser::new().parse(input, tokenizer)
+}
+
+#[cfg(test)]
+pub fn parse_where_clauses<'input>(
+    input: &'input str,
+) -> Result<Vec<WhereClause<TypeRef>>, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    lrgrammar::GrammarWhereClausesParser::new().parse(input, tokenizer)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/parser/test.rs
@@ -0,0 +1,151 @@
+use parser;
+use grammar::parse_tree::{GrammarItem, MatchItem};
+
+#[test]
+fn match_block() {
+    let blocks = vec![
+        r#"grammar; match { _ }"#, // Minimal
+        r#"grammar; match { _ } else { _ }"#, // Doesn't really make sense, but should be allowed
+        r#"grammar; match { "abc" }"#, // Single token
+        r#"grammar; match { "abc" => "QUOTED" }"#, // Single token with quoted alias
+        r#"grammar; match { "abc" => UNQUOTED }"#, // Single token with unquoted alias
+        r#"grammar; match { r"(?i)begin" => BEGIN }"#, // Regex
+        r#"grammar; match { "abc", "def" => "DEF", _ } else { "foo" => BAR, r"(?i)begin" => BEGIN, _ }"#, // Complex
+        r#"grammar; match { "abc" } else { "def" } else { _ }"#, // Multi-chain
+    ];
+
+    for block in blocks {
+        let parsed = parser::parse_grammar(&block)
+            .expect(format!("Invalid grammar; grammar={}", block).as_str());
+        let first_item = parsed.items.first().expect("has item");
+        match *first_item {
+            GrammarItem::MatchToken(_) => (), // OK
+            _ => panic!("expected MatchToken, but was {:?}", first_item),
+        }
+    }
+}
+
+#[test]
+fn match_complex() {
+    let parsed = parser::parse_grammar(
+        r#"
+        grammar;
+        match {
+            r"(?i)begin" => "BEGIN",
+            r"(?i)end" => "END",
+        } else {
+            r"[a-zA-Z_][a-zA-Z0-9_]*" => IDENTIFIER,
+        } else {
+            "other",
+            _
+        }
+"#,
+    ).unwrap();
+
+    // We could probably make some nice system for testing this
+    let first_item = parsed.items.first().expect("has item");
+    match *first_item {
+        GrammarItem::MatchToken(ref data) => {
+            // match { ... }
+            let contents0 = data.contents.get(0).unwrap();
+            // r"(?i)begin" => "BEGIN"
+            let item00 = contents0.items.get(0).unwrap();
+            match *item00 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"(?i)begin\"#");
+                    assert_eq!(format!("{}", mapping), "\"BEGIN\"");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item00),
+            };
+            // r"(?i)end" => "END",
+            let item01 = contents0.items.get(1).unwrap();
+            match *item01 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"(?i)end\"#");
+                    assert_eq!(format!("{}", mapping), "\"END\"");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item00),
+            };
+            // else { ... }
+            let contents1 = data.contents.get(1).unwrap();
+            // r"[a-zA-Z_][a-zA-Z0-9_]*" => IDENTIFIER,
+            let item10 = contents1.items.get(0).unwrap();
+            match *item10 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"[a-zA-Z_][a-zA-Z0-9_]*\"#");
+                    assert_eq!(format!("{}", mapping), "IDENTIFIER");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item10),
+            };
+            // else { ... }
+            let contents2 = data.contents.get(2).unwrap();
+            // "other",
+            let item20 = contents2.items.get(0).unwrap();
+            match *item20 {
+                MatchItem::Unmapped(ref sym, _) => {
+                    assert_eq!(format!("{:?}", sym), "\"other\"");
+                }
+                _ => panic!("expected MatchItem::Unmapped, but was: {:?}", item20),
+            };
+            // _
+            let item21 = contents2.items.get(1).unwrap();
+            match *item21 {
+                MatchItem::CatchAll(_) => (),
+                _ => panic!("expected MatchItem::CatchAll, but was: {:?}", item20),
+            };
+        }
+        _ => panic!("expected MatchToken, but was: {:?}", first_item),
+    }
+}
+
+#[test]
+fn where_clauses() {
+    let clauses = vec![
+        "where T: Debug",
+        "where T: Debug + Display",
+        "where T: std::ops::Add<usize>",
+        "where T: IntoIterator<Item = usize>",
+        "where T: 'a",
+        "where 'a: 'b",
+        "where for<'a> &'a T: Debug",
+        "where T: for<'a> Flobbles<'a>",
+        "where T: FnMut(usize)",
+        "where T: FnMut(usize, bool)",
+        "where T: FnMut() -> bool",
+        "where T: for<'a> FnMut(&'a usize)",
+        "where T: Debug, U: Display",
+    ];
+
+    for santa in clauses {
+        assert!(
+            parser::parse_where_clauses(santa).is_ok(),
+            "should parse where clauses: {}",
+            santa
+        );
+    }
+}
+
+#[test]
+fn grammars_with_where_clauses() {
+    let grammars = vec![
+        r###"
+grammar<T> where T: StaticMethods;
+"###,
+        r###"
+grammar<T>(methods: &mut T) where T: MutMethods;
+"###,
+        r###"
+grammar<'input, T>(methods: &mut T) where T: 'input + Debug + MutMethods;
+"###,
+        r###"
+grammar<F>(methods: &mut F) where F: for<'a> FnMut(&'a usize) -> bool;
+"###,
+        r###"
+grammar<F>(logger: &mut F) where F: for<'a> FnMut(&'a str);
+"###,
+    ];
+
+    for g in grammars {
+        assert!(parser::parse_grammar(g).is_ok());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/rust/mod.rs
@@ -0,0 +1,192 @@
+//! Simple Rust AST. This is what the various code generators create,
+//! which then gets serialized.
+
+use grammar::repr::Grammar;
+use grammar::parse_tree::Visibility;
+use tls::Tls;
+use std::fmt;
+use std::io::{self, Write};
+
+macro_rules! rust {
+    ($w:expr, $($args:tt)*) => {
+        try!(($w).writeln(&::std::fmt::format(format_args!($($args)*))))
+    }
+}
+
+/// A wrapper around a Write instance that handles indentation for
+/// Rust code. It expects Rust code to be written in a stylized way,
+/// with lots of braces and newlines (example shown here with no
+/// indentation). Over time maybe we can extend this to make things
+/// look prettier, but seems like...meh, just run it through some
+/// rustfmt tool.
+///
+/// ```ignore
+/// fn foo(
+/// arg1: Type1,
+/// arg2: Type2,
+/// arg3: Type3)
+/// -> ReturnType
+/// {
+/// match foo {
+/// Variant => {
+/// }
+/// }
+/// }
+/// ```
+pub struct RustWrite<W: Write> {
+    write: W,
+    indent: usize,
+}
+
+const TAB: usize = 4;
+
+impl<W: Write> RustWrite<W> {
+    pub fn new(w: W) -> RustWrite<W> {
+        RustWrite {
+            write: w,
+            indent: 0,
+        }
+    }
+
+    pub fn into_inner(self) -> W {
+        self.write
+    }
+
+    fn write_indentation(&mut self) -> io::Result<()> {
+        write!(self.write, "{0:1$}", "", self.indent)
+    }
+
+    fn write_indented(&mut self, out: &str) -> io::Result<()> {
+        writeln!(self.write, "{0:1$}{2}", "", self.indent, out)
+    }
+
+    pub fn write_table_row<I, C>(&mut self, iterable: I) -> io::Result<()>
+    where
+        I: IntoIterator<Item = (i32, C)>,
+        C: fmt::Display,
+    {
+        if Tls::session().emit_comments {
+            for (i, comment) in iterable {
+                try!(self.write_indentation());
+                try!(writeln!(self.write, "{}, {}", i, comment));
+            }
+        } else {
+            try!(self.write_indentation());
+            let mut first = true;
+            for (i, _comment) in iterable {
+                if !first {
+                    try!(write!(self.write, " "));
+                }
+                try!(write!(self.write, "{},", i));
+                first = false;
+            }
+        }
+        writeln!(self.write, "")
+    }
+
+    pub fn writeln(&mut self, out: &str) -> io::Result<()> {
+        let buf = out.as_bytes();
+
+        // pass empty lines through with no indentation
+        if buf.is_empty() {
+            return self.write.write_all("\n".as_bytes());
+        }
+
+        let n = buf.len() - 1;
+
+        // If the line begins with a `}`, `]`, or `)`, first decrement the indentation.
+        if buf[0] == ('}' as u8) || buf[0] == (']' as u8) || buf[0] == (')' as u8) {
+            self.indent -= TAB;
+        }
+
+        try!(self.write_indented(out));
+
+        // Detect a line that ends in a `{` or `(` and increase indentation for future lines.
+        if buf[n] == ('{' as u8) || buf[n] == ('[' as u8) || buf[n] == ('(' as u8) {
+            self.indent += TAB;
+        }
+
+        Ok(())
+    }
+
+    pub fn write_fn_header(
+        &mut self,
+        grammar: &Grammar,
+        visibility: &Visibility,
+        name: String,
+        type_parameters: Vec<String>,
+        first_parameter: Option<String>,
+        parameters: Vec<String>,
+        return_type: String,
+        where_clauses: Vec<String>,
+    ) -> io::Result<()> {
+        rust!(self, "{}fn {}<", visibility, name);
+
+        for type_parameter in &grammar.type_parameters {
+            rust!(self, "{0:1$}{2},", "", TAB, type_parameter);
+        }
+
+        for type_parameter in type_parameters {
+            rust!(self, "{0:1$}{2},", "", TAB, type_parameter);
+        }
+
+        rust!(self, ">(");
+
+        if let Some(param) = first_parameter {
+            rust!(self, "{},", param);
+        }
+        for parameter in &grammar.parameters {
+            rust!(self, "{}: {},", parameter.name, parameter.ty);
+        }
+
+        for parameter in &parameters {
+            rust!(self, "{},", parameter);
+        }
+
+        if !grammar.where_clauses.is_empty() || !where_clauses.is_empty() {
+            rust!(self, ") -> {} where", return_type);
+
+            for where_clause in &grammar.where_clauses {
+                rust!(self, "  {},", where_clause);
+            }
+
+            for where_clause in &where_clauses {
+                rust!(self, "  {},", where_clause);
+            }
+        } else {
+            rust!(self, ") -> {}", return_type);
+        }
+
+        Ok(())
+    }
+
+    pub fn write_module_attributes(&mut self, grammar: &Grammar) -> io::Result<()> {
+        rust!(self, "#![cfg_attr(rustfmt, rustfmt_skip)]");
+        for attribute in grammar.module_attributes.iter() {
+            rust!(self, "{}", attribute);
+        }
+        Ok(())
+    }
+
+    pub fn write_uses(&mut self, super_prefix: &str, grammar: &Grammar) -> io::Result<()> {
+        // things the user wrote
+        for u in &grammar.uses {
+            if u.starts_with("super::") {
+                rust!(self, "use {}{};", super_prefix, u);
+            } else {
+                rust!(self, "use {};", u);
+            }
+        }
+
+        self.write_standard_uses(&grammar.prefix)
+    }
+
+    pub fn write_standard_uses(&mut self, prefix: &str) -> io::Result<()> {
+        // Stuff that we plan to use.
+        // Occasionally we happen to not use it after all, hence the allow.
+        rust!(self, "#[allow(unused_extern_crates)]");
+        rust!(self, "extern crate lalrpop_util as {}lalrpop_util;", prefix);
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/session.rs
@@ -0,0 +1,154 @@
+//! Internal configuration and session-specific settings. This is similar
+//! to `configuration::Configuration`, but it is not exported outside the
+//! crate. Note that all fields are public and so forth for convenience.
+
+use std::default::Default;
+use std::path;
+use style::{self, Style};
+use log::{Level, Log};
+
+// These two, ubiquitous types are defined here so that their fields can be private
+// across crate, but visible within the crate:
+
+#[derive(Copy, Clone)]
+pub enum ColorConfig {
+    /// Use ANSI colors.
+    Yes,
+
+    /// Do NOT use ANSI colors.
+    No,
+
+    /// Use them if we detect a TTY output (default).
+    IfTty,
+}
+
+/// Various options to control debug output. Although this struct is
+/// technically part of LALRPOP's exported interface, it is not
+/// considered part of the semver guarantees as end-users are not
+/// expected to use it.
+#[derive(Clone)]
+pub struct Session {
+    pub log: Log,
+
+    pub force_build: bool,
+
+    pub in_dir: Option<path::PathBuf>,
+
+    pub out_dir: Option<path::PathBuf>,
+
+    /// Emit comments in generated code explaining the states and so
+    /// forth.
+    pub emit_comments: bool,
+
+    /// Emit report file about generated code
+    pub emit_report: bool,
+
+    pub color_config: ColorConfig,
+
+    /// Stop after you find `max_errors` errors. If this value is 0,
+    /// report *all* errors. Note that we MAY always report more than
+    /// this value if we so choose.
+    pub max_errors: usize,
+
+    // Styles to use when formatting error reports
+    /// Applied to the heading in a message.
+    pub heading: Style,
+
+    /// Applied to symbols in an ambiguity report (where there is no cursor)
+    pub ambig_symbols: Style,
+
+    /// Applied to symbols before the cursor in a local ambiguity report
+    pub observed_symbols: Style,
+
+    /// Applied to symbols at the cursor in a local ambiguity report,
+    /// if it is a non-terminal
+    pub cursor_symbol: Style,
+
+    /// Applied to symbols after the cursor in a local ambiguity report
+    pub unobserved_symbols: Style,
+
+    /// Applied to terminal symbols, in addition to the above styles
+    pub terminal_symbol: Style,
+
+    /// Applied to nonterminal symbols, in addition to the above styles
+    pub nonterminal_symbol: Style,
+
+    /// Style to use when printing "Hint:"
+    pub hint_text: Style,
+
+    /// Unit testing (lalrpop-test) configuration
+    pub unit_test: bool,
+}
+
+impl Session {
+    pub fn new() -> Session {
+        Session {
+            log: Log::new(Level::Informative),
+            in_dir: None,
+            out_dir: None,
+            force_build: false,
+            emit_comments: false,
+            emit_report: false,
+            color_config: ColorConfig::default(),
+            max_errors: 1,
+            heading: style::FG_WHITE.with(style::BOLD),
+            ambig_symbols: style::FG_WHITE,
+            observed_symbols: style::FG_BRIGHT_GREEN,
+            cursor_symbol: style::FG_BRIGHT_WHITE,
+            unobserved_symbols: style::FG_BRIGHT_RED,
+            terminal_symbol: style::BOLD,
+            nonterminal_symbol: style::DEFAULT,
+            hint_text: style::FG_BRIGHT_MAGENTA.with(style::BOLD),
+            unit_test: false,
+        }
+    }
+
+    /// A session suitable for use in testing.
+    #[cfg(test)]
+    pub fn test() -> Session {
+        Session {
+            log: Log::new(Level::Debug),
+            in_dir: None,
+            out_dir: None,
+            force_build: false,
+            emit_comments: false,
+            emit_report: false,
+            color_config: ColorConfig::IfTty,
+            max_errors: 1,
+            heading: Style::new(),
+            ambig_symbols: Style::new(),
+            observed_symbols: Style::new(),
+            cursor_symbol: Style::new(),
+            unobserved_symbols: Style::new(),
+            terminal_symbol: Style::new(),
+            nonterminal_symbol: Style::new(),
+            hint_text: Style::new(),
+            unit_test: true,
+        }
+    }
+
+    /// Indicates whether we should stop after `actual_errors` number
+    /// of errors have been reported.
+    pub fn stop_after(&self, actual_errors: usize) -> bool {
+        self.max_errors != 0 && actual_errors >= self.max_errors
+    }
+
+    pub fn log<M>(&self, level: Level, message: M)
+    where
+        M: FnOnce() -> String,
+    {
+        self.log.log(level, message)
+    }
+}
+
+impl Default for Session {
+    fn default() -> Self {
+        Session::new()
+    }
+}
+
+impl Default for ColorConfig {
+    fn default() -> Self {
+        ColorConfig::IfTty
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/test_util.rs
@@ -0,0 +1,68 @@
+use diff;
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use normalize::NormError;
+use regex::Regex;
+use std::fmt::{Debug, Error, Formatter};
+
+thread_local! {
+    static SPAN: Regex =
+        Regex::new(r"Span\([0-9 ,]*\)").unwrap()
+}
+
+struct ExpectedDebug<'a>(&'a str);
+
+impl<'a> Debug for ExpectedDebug<'a> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+pub fn expect_debug<D: Debug>(actual: D, expected: &str) {
+    compare(
+        ExpectedDebug(&format!("{:#?}", actual)),
+        ExpectedDebug(expected),
+    )
+}
+
+pub fn compare<D: Debug, E: Debug>(actual: D, expected: E) {
+    let actual_s = format!("{:?}", actual);
+    let expected_s = format!("{:?}", expected);
+
+    SPAN.with(|span| {
+        let actual_s = span.replace_all(&actual_s, "Span(..)");
+        let expected_s = span.replace_all(&expected_s, "Span(..)");
+        if actual_s != expected_s {
+            let actual_s = format!("{:#?}", actual);
+            let expected_s = format!("{:#?}", expected);
+
+            for diff in diff::lines(&actual_s, &expected_s) {
+                match diff {
+                    diff::Result::Right(r) => println!("- {}", r),
+                    diff::Result::Left(l) => println!("+ {}", l),
+                    diff::Result::Both(l, _) => println!("  {}", l),
+                }
+            }
+
+            assert!(false);
+        }
+    });
+}
+
+pub fn normalized_grammar(s: &str) -> r::Grammar {
+    ::normalize::normalize_without_validating(::parser::parse_grammar(s).unwrap()).unwrap()
+}
+
+pub fn check_norm_err(expected_err: &str, span: &str, err: NormError) {
+    let expected_err = Regex::new(expected_err).unwrap();
+    let start_index = span.find("~").unwrap();
+    let end_index = span.rfind("~").unwrap() + 1;
+    assert!(start_index <= end_index);
+    assert_eq!(err.span, pt::Span(start_index, end_index));
+    assert!(
+        expected_err.is_match(&err.message),
+        "unexpected error text `{}`, which did not match regular expression `{}`",
+        err.message,
+        expected_err
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/tls/mod.rs
@@ -0,0 +1,77 @@
+//! Certain bits of environmental state are too annoying to thread
+//! around everywhere, so pack them into TLS.
+
+use file_text::FileText;
+use session::Session;
+use std::cell::RefCell;
+use std::rc::Rc;
+
+pub struct Tls {
+    _dummy: (),
+}
+
+#[derive(Clone)]
+struct TlsFields {
+    session: Rc<Session>,
+    file_text: Rc<FileText>,
+}
+
+thread_local! {
+    static THE_TLS_FIELDS: RefCell<Option<TlsFields>> =
+        RefCell::new(None)
+}
+
+impl Tls {
+    #[cfg(test)]
+    pub fn test() -> Tls {
+        Self::install(Rc::new(Session::test()), Rc::new(FileText::test()))
+    }
+
+    #[cfg(test)]
+    pub fn test_string(text: &str) -> Tls {
+        use std::path::PathBuf;
+        Self::install(
+            Rc::new(Session::test()),
+            Rc::new(FileText::new(PathBuf::from("tmp.txt"), String::from(text))),
+        )
+    }
+
+    /// Installs `Tls` and returns a placeholder value.  When this
+    /// value is dropped, the `Tls` entries will be removed. To access
+    /// the values from `Tls`, call `Tls::session()` or
+    /// `Tls::file_text()`.
+    pub fn install(session: Rc<Session>, file_text: Rc<FileText>) -> Tls {
+        let fields = TlsFields {
+            session: session,
+            file_text: file_text,
+        };
+
+        THE_TLS_FIELDS.with(|s| {
+            let mut s = s.borrow_mut();
+            assert!(s.is_none());
+            *s = Some(fields.clone());
+        });
+
+        Tls { _dummy: () }
+    }
+
+    fn fields() -> TlsFields {
+        THE_TLS_FIELDS.with(|s| s.borrow().clone().expect("TLS is not installed"))
+    }
+
+    pub fn session() -> Rc<Session> {
+        Self::fields().session
+    }
+
+    pub fn file_text() -> Rc<FileText> {
+        Self::fields().file_text
+    }
+}
+
+impl Drop for Tls {
+    fn drop(&mut self) {
+        THE_TLS_FIELDS.with(|s| {
+            *s.borrow_mut() = None;
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/tok/mod.rs
@@ -0,0 +1,738 @@
+//! A tokenizer for use in LALRPOP itself.
+
+use std::str::CharIndices;
+use unicode_xid::UnicodeXID;
+
+use self::ErrorCode::*;
+use self::Tok::*;
+
+#[cfg(test)]
+mod test;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Error {
+    pub location: usize,
+    pub code: ErrorCode,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ErrorCode {
+    UnrecognizedToken,
+    UnterminatedEscape,
+    UnterminatedStringLiteral,
+    UnterminatedCharacterLiteral,
+    UnterminatedAttribute,
+    UnterminatedCode,
+    ExpectedStringLiteral,
+}
+
+fn error<T>(c: ErrorCode, l: usize) -> Result<T, Error> {
+    Err(Error {
+        location: l,
+        code: c,
+    })
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Tok<'input> {
+    // Keywords;
+    Enum,
+    Extern,
+    Grammar,
+    Match,
+    Else,
+    If,
+    Mut,
+    Pub,
+    Type,
+    Where,
+    For,
+
+    // Special keywords: these are accompanied by a series of
+    // uninterpreted strings representing imports and stuff.
+    Use(&'input str),
+
+    // Identifiers of various kinds:
+    Escape(&'input str),
+    Id(&'input str),
+    MacroId(&'input str),       // identifier followed immediately by `<`
+    Lifetime(&'input str),      // includes the `'`
+    StringLiteral(&'input str), // excludes the `"`
+    CharLiteral(&'input str),   // excludes the `'`
+    RegexLiteral(&'input str),  // excludes the `r"` and `"`
+
+    // Symbols:
+    Ampersand,
+    BangEquals,
+    BangTilde,
+    Colon,
+    ColonColon,
+    Comma,
+    DotDot,
+    Equals,
+    EqualsEquals,
+    EqualsGreaterThanCode(&'input str),
+    EqualsGreaterThanQuestionCode(&'input str),
+    EqualsGreaterThanLookahead,
+    EqualsGreaterThanLookbehind,
+    Hash,
+    GreaterThan,
+    LeftBrace,
+    LeftBracket,
+    LeftParen,
+    LessThan,
+    Lookahead,  // @L
+    Lookbehind, // @R
+    MinusGreaterThan,
+    Plus,
+    Question,
+    RightBrace,
+    RightBracket,
+    RightParen,
+    Semi,
+    Star,
+    TildeTilde,
+    Underscore,
+    Bang,
+    ShebangAttribute(&'input str), // #![...]
+}
+
+pub struct Tokenizer<'input> {
+    text: &'input str,
+    chars: CharIndices<'input>,
+    lookahead: Option<(usize, char)>,
+    shift: usize,
+}
+
+pub type Spanned<T> = (usize, T, usize);
+
+const KEYWORDS: &'static [(&'static str, Tok<'static>)] = &[
+    ("enum", Enum),
+    ("extern", Extern),
+    ("grammar", Grammar),
+    ("match", Match),
+    ("else", Else),
+    ("if", If),
+    ("mut", Mut),
+    ("pub", Pub),
+    ("type", Type),
+    ("where", Where),
+    ("for", For),
+];
+
+/*
+ * Helper for backtracking.
+ */
+macro_rules! first {
+    ($this:expr, $action:expr, $fallback:expr) => {
+        {
+            let fallback_state = ($this.chars.clone(), $this.lookahead);
+            let result = $action;
+            match result {
+                Ok(_) => {
+                    Some(result)
+                }
+                _ => {
+                    $this.chars = fallback_state.0;
+                    $this.lookahead = fallback_state.1;
+                    Some($fallback)
+                }
+            }
+        }
+    }
+}
+
+macro_rules! try_opt {
+    ($e:expr, $err:expr) => {
+        {
+            let r = $e;
+            match r {
+                Some(Ok(val)) => val,
+                Some(Err(err)) => return Err(err),
+                None => return $err,
+            }
+        }
+    }
+}
+
+impl<'input> Tokenizer<'input> {
+    pub fn new(text: &'input str, shift: usize) -> Tokenizer<'input> {
+        let mut t = Tokenizer {
+            text: text,
+            chars: text.char_indices(),
+            lookahead: None,
+            shift: shift,
+        };
+        t.bump();
+        t
+    }
+
+    fn shebang_attribute(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        try_opt!(
+            self.expect_char('!'),
+            error(ErrorCode::UnrecognizedToken, idx0)
+        );
+        try_opt!(
+            self.expect_char('['),
+            error(ErrorCode::UnterminatedAttribute, idx0)
+        );
+        let mut sq_bracket_counter = 1;
+        while let Some((idx1, c)) = self.lookahead {
+            match c {
+                '[' => {
+                    self.bump();
+                    sq_bracket_counter += 1
+                },
+                ']' => {
+                    self.bump();
+                    sq_bracket_counter -= 1;
+                    match sq_bracket_counter {
+                        0 => {
+                            let idx2 = idx1 + 1;
+                            let data = &self.text[idx0..idx2];
+                            self.bump();
+                            return Ok((idx0, ShebangAttribute(data), idx2));
+                        },
+                        n if n < 0 => return error(UnrecognizedToken, idx0),
+                        _ => (),
+                    }
+                },
+                '"' => {
+                    self.bump();
+                    let _ = try!(self.string_literal(idx1));
+                },
+                '\n' => return error(UnrecognizedToken, idx0),
+                _ => {
+                    self.bump();
+                },
+            }
+        }
+        error(UnrecognizedToken, idx0)
+    }
+
+    fn next_unshifted(&mut self) -> Option<Result<Spanned<Tok<'input>>, Error>> {
+        loop {
+            return match self.lookahead {
+                Some((idx0, '&')) => {
+                    self.bump();
+                    Some(Ok((idx0, Ampersand, idx0 + 1)))
+                },
+                Some((idx0, '!')) => match self.bump() {
+                    Some((idx1, '=')) => {
+                        self.bump();
+                        Some(Ok((idx0, BangEquals, idx1 + 1)))
+                    },
+                    Some((idx1, '~')) => {
+                        self.bump();
+                        Some(Ok((idx0, BangTilde, idx1 + 1)))
+                    },
+                    _ => Some(Ok((idx0, Bang, idx0 + 1))),
+                },
+                Some((idx0, ':')) => match self.bump() {
+                    Some((idx1, ':')) => {
+                        self.bump();
+                        Some(Ok((idx0, ColonColon, idx1 + 1)))
+                    },
+                    _ => Some(Ok((idx0, Colon, idx0 + 1))),
+                },
+                Some((idx0, ',')) => {
+                    self.bump();
+                    Some(Ok((idx0, Comma, idx0 + 1)))
+                },
+                Some((idx0, '.')) => match self.bump() {
+                    Some((idx1, '.')) => {
+                        self.bump();
+                        Some(Ok((idx0, DotDot, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '=')) => match self.bump() {
+                    Some((idx1, '=')) => {
+                        self.bump();
+                        Some(Ok((idx0, EqualsEquals, idx1 + 1)))
+                    },
+                    Some((_, '>')) => {
+                        self.bump();
+                        Some(self.right_arrow(idx0))
+                    },
+                    _ => Some(Ok((idx0, Equals, idx0 + 1))),
+                },
+                Some((idx0, '#')) => {
+                    self.bump();
+                    first!(self, { self.shebang_attribute(idx0) }, {
+                        Ok((idx0, Hash, idx0 + 1))
+                    })
+                },
+                Some((idx0, '>')) => {
+                    self.bump();
+                    Some(Ok((idx0, GreaterThan, idx0 + 1)))
+                },
+                Some((idx0, '{')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftBrace, idx0 + 1)))
+                },
+                Some((idx0, '[')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftBracket, idx0 + 1)))
+                },
+                Some((idx0, '(')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftParen, idx0 + 1)))
+                },
+                Some((idx0, '<')) => {
+                    self.bump();
+                    Some(Ok((idx0, LessThan, idx0 + 1)))
+                },
+                Some((idx0, '@')) => match self.bump() {
+                    Some((idx1, 'L')) => {
+                        self.bump();
+                        Some(Ok((idx0, Lookahead, idx1 + 1)))
+                    },
+                    Some((idx1, 'R')) => {
+                        self.bump();
+                        Some(Ok((idx0, Lookbehind, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '+')) => {
+                    self.bump();
+                    Some(Ok((idx0, Plus, idx0 + 1)))
+                },
+                Some((idx0, '?')) => {
+                    self.bump();
+                    Some(Ok((idx0, Question, idx0 + 1)))
+                },
+                Some((idx0, '}')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightBrace, idx0 + 1)))
+                },
+                Some((idx0, ']')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightBracket, idx0 + 1)))
+                },
+                Some((idx0, ')')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightParen, idx0 + 1)))
+                },
+                Some((idx0, ';')) => {
+                    self.bump();
+                    Some(Ok((idx0, Semi, idx0 + 1)))
+                },
+                Some((idx0, '*')) => {
+                    self.bump();
+                    Some(Ok((idx0, Star, idx0 + 1)))
+                },
+                Some((idx0, '~')) => match self.bump() {
+                    Some((idx1, '~')) => {
+                        self.bump();
+                        Some(Ok((idx0, TildeTilde, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '`')) => {
+                    self.bump();
+                    Some(self.escape(idx0))
+                },
+                Some((idx0, '\'')) => {
+                    self.bump();
+                    Some(self.lifetimeish(idx0))
+                },
+                Some((idx0, '"')) => {
+                    self.bump();
+                    Some(self.string_literal(idx0))
+                },
+                Some((idx0, '/')) => match self.bump() {
+                    Some((_, '/')) => {
+                        self.take_until(|c| c == '\n');
+                        continue;
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '-')) => match self.bump() {
+                    Some((idx1, '>')) => {
+                        self.bump();
+                        Some(Ok((idx0, MinusGreaterThan, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, c)) if is_identifier_start(c) => {
+                    if c == 'r' {
+                        // watch out for r"..." or r#"..."# strings
+                        self.bump();
+                        match self.lookahead {
+                            Some((_, '#')) | Some((_, '"')) => Some(self.regex_literal(idx0)),
+                            _ => {
+                                // due to the particulars of how identifierish works,
+                                // it's ok that we already consumed the 'r', because the
+                                // identifier will run from idx0 (the 'r') to the end
+                                Some(self.identifierish(idx0))
+                            },
+                        }
+                    } else {
+                        Some(self.identifierish(idx0))
+                    }
+                },
+                Some((_, c)) if c.is_whitespace() => {
+                    self.bump();
+                    continue;
+                },
+                Some((idx, _)) => Some(error(UnrecognizedToken, idx)),
+                None => None,
+            };
+        }
+    }
+
+    fn bump(&mut self) -> Option<(usize, char)> {
+        self.lookahead = self.chars.next();
+        self.lookahead
+    }
+
+    fn right_arrow(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        // we've seen =>, now we have to choose between:
+        //
+        // => code
+        // =>? code
+        // =>@L
+        // =>@R
+
+        match self.lookahead {
+            Some((_, '@')) => match self.bump() {
+                Some((idx2, 'L')) => {
+                    self.bump();
+                    Ok((idx0, EqualsGreaterThanLookahead, idx2 + 1))
+                },
+                Some((idx2, 'R')) => {
+                    self.bump();
+                    Ok((idx0, EqualsGreaterThanLookbehind, idx2 + 1))
+                },
+                _ => error(UnrecognizedToken, idx0),
+            },
+
+            Some((idx1, '?')) => {
+                self.bump();
+                let idx2 = try!(self.code(idx0, "([{", "}])"));
+                let code = &self.text[idx1 + 1..idx2];
+                Ok((idx0, EqualsGreaterThanQuestionCode(code), idx2))
+            },
+
+            Some((idx1, _)) => {
+                let idx2 = try!(self.code(idx0, "([{", "}])"));
+                let code = &self.text[idx1..idx2];
+                Ok((idx0, EqualsGreaterThanCode(code), idx2))
+            },
+
+            None => error(UnterminatedCode, idx0),
+        }
+    }
+
+    fn code(&mut self, idx0: usize, open_delims: &str, close_delims: &str) -> Result<usize, Error> {
+        // This is the interesting case. To find the end of the code,
+        // we have to scan ahead, matching (), [], and {}, and looking
+        // for a suitable terminator: `,`, `;`, `]`, `}`, or `)`.
+        // Additionaly we had to take into account that we can encounter an character literal
+        // equal to one of delimeters.
+        let mut balance = 0; // number of unclosed `(` etc
+        loop {
+            if let Some((idx, c)) = self.lookahead {
+                if c == '"' {
+                    self.bump();
+                    try!(self.string_literal(idx)); // discard the produced token
+                    continue;
+                } else if c == '\'' {
+                    self.bump();
+                    if self.take_lifetime_or_character_literal().is_none() {
+                        return error(UnterminatedCharacterLiteral, idx);
+                    }
+                    continue;
+                } else if c == 'r' {
+                    self.bump();
+                    if let Some((idx, '#')) = self.lookahead {
+                        try!(self.regex_literal(idx));
+                    }
+                    continue;
+                } else if c == '/' {
+                    self.bump();
+                    if let Some((_, '/')) = self.lookahead {
+                        self.take_until(|c| c == '\n');
+                    }
+                    continue;
+                } else if open_delims.find(c).is_some() {
+                    balance += 1;
+                } else if balance > 0 {
+                    if close_delims.find(c).is_some() {
+                        balance -= 1;
+                    }
+                } else {
+                    debug_assert!(balance == 0);
+
+                    if c == ',' || c == ';' || close_delims.find(c).is_some() {
+                        // Note: we do not consume the
+                        // terminator. The code is everything *up
+                        // to but not including* the terminating
+                        // `,`, `;`, etc.
+                        return Ok(idx);
+                    }
+                }
+            } else if balance > 0 {
+                // the input should not end with an
+                // unbalanced number of `{` etc!
+                return error(UnterminatedCode, idx0);
+            } else {
+                debug_assert!(balance == 0);
+                return Ok(self.text.len());
+            }
+
+            self.bump();
+        }
+    }
+
+    fn escape(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.take_until(|c| c == '`') {
+            Some(idx1) => {
+                self.bump(); // consume the '`'
+                let text: &'input str = &self.text[idx0 + 1..idx1]; // do not include the `` in the str
+                Ok((idx0, Escape(text), idx1 + 1))
+            },
+            None => error(UnterminatedEscape, idx0),
+        }
+    }
+
+    fn take_lifetime_or_character_literal(&mut self) -> Option<usize> {
+        // try to decide if `'` is for lifetime or it oppens a character literal
+
+        let forget_character = |p: (usize, char)| p.0;
+
+        self.lookahead.and_then(|(_, c)| {
+            if c == '\\' {
+                // escape after `'` => it had to be character literal token, consume
+                // the backslash and escaped character, then consume until `'`
+                self.bump();
+                self.bump();
+                self.take_until_and_consume_terminating_character(|c: char| c == '\'')
+            } else {
+                // no escape, then we require to see next `'` or we assume it was lifetime
+                self.bump().and_then(|(idx, c)| {
+                    if c == '\'' {
+                        self.bump().map(forget_character)
+                    } else {
+                        Some(idx)
+                    }
+                })
+            }
+        })
+    }
+
+    fn string_or_char_literal(
+        &mut self,
+        idx0: usize,
+        quote: char,
+        variant: fn(&'input str) -> Tok<'input>,
+    ) -> Option<Spanned<Tok<'input>>> {
+        let mut escape = false;
+        let terminate = |c: char| {
+            if escape {
+                escape = false;
+                false
+            } else if c == '\\' {
+                escape = true;
+                false
+            } else if c == quote {
+                true
+            } else {
+                false
+            }
+        };
+        match self.take_until(terminate) {
+            Some(idx1) => {
+                self.bump(); // consume the closing quote
+                let text = &self.text[idx0 + 1..idx1]; // do not include quotes in the str
+                Some((idx0, variant(text), idx1 + 1))
+            },
+            None => None,
+        }
+    }
+
+    fn string_literal(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.string_or_char_literal(idx0, '"', StringLiteral) {
+            Some(x) => Ok(x),
+            None => error(UnterminatedStringLiteral, idx0),
+        }
+    }
+
+    // parses `r#"..."#` (for some number of #), starts after the `r`
+    // has been consumed; idx0 points at the `r`
+    fn regex_literal(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.take_while(|c| c == '#') {
+            Some(idx1) if self.lookahead == Some((idx1, '"')) => {
+                self.bump();
+                let hashes = idx1 - idx0 - 1;
+                let mut state = 0;
+                let end_of_regex = |c: char| {
+                    if state > 0 {
+                        // state N>0 means: observed n-1 hashes
+                        if c == '#' {
+                            state += 1;
+                        } else {
+                            state = 0;
+                        }
+                    }
+
+                    // state 0 means: not yet seen the `"`
+                    if state == 0 && c == '"' {
+                        state = 1;
+                    }
+
+                    state == (hashes + 1)
+                };
+                match self.take_until(end_of_regex) {
+                    Some(idx1) => {
+                        // idx1 is the closing quote
+                        self.bump();
+                        let start = idx0 + 2 + hashes; // skip the `r###"`
+                        let end = idx1 - hashes; // skip the `###`.
+                        Ok((idx0, RegexLiteral(&self.text[start..end]), idx1 + 1))
+                    },
+                    None => error(UnterminatedStringLiteral, idx0),
+                }
+            },
+            Some(idx1) => error(ExpectedStringLiteral, idx1),
+            None => error(UnterminatedStringLiteral, idx0),
+        }
+    }
+
+    // Saw a `'`, could either be: `'a` or `'a'`.
+    fn lifetimeish(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.lookahead {
+            None => error(UnterminatedCharacterLiteral, idx0),
+
+            Some((_, c)) => {
+                if is_identifier_start(c) {
+                    let (start, word, end) = self.word(idx0);
+                    match self.lookahead {
+                        Some((idx2, '\'')) => {
+                            self.bump();
+                            let text = &self.text[idx0 + 1..idx2];
+                            Ok((idx0, CharLiteral(text), idx2 + 1))
+                        },
+                        _ => Ok((start, Lifetime(word), end)),
+                    }
+                } else {
+                    match self.string_or_char_literal(idx0, '\'', CharLiteral) {
+                        Some(x) => Ok(x),
+                        None => error(UnterminatedCharacterLiteral, idx0),
+                    }
+                }
+            },
+        }
+    }
+
+    fn identifierish(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        let (start, word, end) = self.word(idx0);
+
+        if word == "_" {
+            return Ok((idx0, Underscore, idx0 + 1));
+        }
+
+        if word == "use" {
+            let code_end = try!(self.code(idx0, "([{", "}])"));
+            let code = &self.text[end..code_end];
+            return Ok((start, Tok::Use(code), code_end));
+        }
+
+        let tok =
+            // search for a keyword first; if none are found, this is
+            // either a MacroId or an Id, depending on whether there
+            // is a `<` immediately afterwards
+            KEYWORDS.iter()
+                    .filter(|&&(w, _)| w == word)
+                    .map(|&(_, ref t)| t.clone())
+                    .next()
+                    .unwrap_or_else(|| {
+                        match self.lookahead {
+                            Some((_, '<')) => MacroId(word),
+                            _ => Id(word),
+                        }
+                    });
+
+        Ok((start, tok, end))
+    }
+
+    fn word(&mut self, idx0: usize) -> Spanned<&'input str> {
+        match self.take_while(is_identifier_continue) {
+            Some(end) => (idx0, &self.text[idx0..end], end),
+            None => (idx0, &self.text[idx0..], self.text.len()),
+        }
+    }
+
+    fn take_while<F>(&mut self, mut keep_going: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        self.take_until(|c| !keep_going(c))
+    }
+
+    fn take_until<F>(&mut self, mut terminate: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        loop {
+            match self.lookahead {
+                None => {
+                    return None;
+                },
+                Some((idx1, c)) => {
+                    if terminate(c) {
+                        return Some(idx1);
+                    } else {
+                        self.bump();
+                    }
+                },
+            }
+        }
+    }
+
+    fn take_until_and_consume_terminating_character<F>(&mut self, terminate: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        self.take_until(terminate)
+            .and_then(|_| self.bump().map(|p| p.0))
+    }
+
+    fn expect_char(&mut self, c: char) -> Option<Result<usize, Error>> {
+        match self.lookahead {
+            Some((idx0, cc)) if c == cc => {
+                self.bump();
+                Some(Ok((idx0)))
+            },
+            Some((idx0, _)) => {
+                self.bump();
+                Some(error(UnrecognizedToken, idx0))
+            },
+            None => None,
+        }
+    }
+}
+
+impl<'input> Iterator for Tokenizer<'input> {
+    type Item = Result<Spanned<Tok<'input>>, Error>;
+
+    fn next(&mut self) -> Option<Result<Spanned<Tok<'input>>, Error>> {
+        match self.next_unshifted() {
+            None => None,
+            Some(Ok((l, t, r))) => Some(Ok((l + self.shift, t, r + self.shift))),
+            Some(Err(Error { location, code })) => Some(Err(Error {
+                location: location + self.shift,
+                code: code,
+            })),
+        }
+    }
+}
+
+fn is_identifier_start(c: char) -> bool {
+    UnicodeXID::is_xid_start(c) || c == '_'
+}
+
+fn is_identifier_continue(c: char) -> bool {
+    UnicodeXID::is_xid_continue(c) || c == '_'
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/tok/test.rs
@@ -0,0 +1,707 @@
+use super::{Error, ErrorCode, Tok, Tokenizer};
+use super::Tok::*;
+
+enum Expectation<'a> {
+    ExpectTok(Tok<'a>),
+    ExpectErr(ErrorCode),
+}
+
+use self::Expectation::*;
+
+fn gen_test(input: &str, expected: Vec<(&str, Expectation)>) {
+    // use $ to signal EOL because it can be replaced with a single space
+    // for spans, and because it applies also to r#XXX# style strings:
+    let input = input.replace("$", "\n");
+
+    let tokenizer = Tokenizer::new(&input, 0);
+    let len = expected.len();
+    for (token, (expected_span, expectation)) in tokenizer.zip(expected.into_iter()) {
+        let expected_start = expected_span.find("~").unwrap();
+        let expected_end = expected_span.rfind("~").unwrap() + 1;
+        println!("token: {:?}", token);
+        match expectation {
+            ExpectTok(expected_tok) => {
+                assert_eq!(Ok((expected_start, expected_tok, expected_end)), token);
+            },
+            ExpectErr(expected_ec) => assert_eq!(
+                Err(Error {
+                    location: expected_start,
+                    code: expected_ec,
+                }),
+                token
+            ),
+        }
+    }
+
+    let tokenizer = Tokenizer::new(&input, 0);
+    assert_eq!(None, tokenizer.skip(len).next());
+}
+
+fn test(input: &str, expected: Vec<(&str, Tok)>) {
+    let generic_expected = expected
+        .into_iter()
+        .map(|(span, tok)| (span, ExpectTok(tok)))
+        .collect();
+    gen_test(input, generic_expected);
+}
+
+fn test_err(input: &str, expected: (&str, ErrorCode)) {
+    let (span, ec) = expected;
+    gen_test(input, vec![(span, ExpectErr(ec))])
+}
+
+#[test]
+fn basic() {
+    test(
+        "extern foo",
+        vec![("~~~~~~    ", Extern), ("       ~~~", Id("foo"))],
+    );
+}
+
+#[test]
+fn eol_comment() {
+    test(
+        "extern // This is a comment$ foo",
+        vec![
+            ("~~~~~~                          ", Extern),
+            ("                             ~~~", Id("foo")),
+        ],
+    );
+}
+
+#[test]
+fn code1() {
+    test(
+        "=> a(b, c),",
+        vec![
+            ("~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            ("          ~", Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_id_then_equalsgreaterthancode_functioncall() {
+    test(
+        "id => a(b, c),",
+        vec![
+            ("~~            ", Id("id")),
+            ("   ~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            ("             ~", Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_functioncall() {
+    test(
+        r#" "\." => a(b, c),"#,
+        vec![
+            (r#" ~~~~            "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~~~~ "#, EqualsGreaterThanCode(" a(b, c)")),
+            (r#"                ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_many_characters_in_stringliteral() {
+    test(
+        r#" "\." => "Planet Earth" ,"#,
+        vec![
+            (r#" ~~~~                    "#, StringLiteral(r#"\."#)),
+            (
+                r#"      ~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" "Planet Earth" "#),
+            ),
+            (r#"                        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_one_character_dot_in_stringliteral() {
+    test(
+        r#" "\." => "." ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" "." "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_one_character_openningbracket_in_stringliteral(
+) {
+    test(
+        r#" "\(" => "(" ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" "(" "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_empty_stringliteral() {
+    test(
+        r#" "\(" => "" ,"#,
+        vec![
+            (r#" ~~~~        "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~ "#, EqualsGreaterThanCode(r#" "" "#)),
+            (r#"            ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_one_character_dot() {
+    test(
+        r#" "\." => '.' ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" '.' "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_one_character_openningbracket(
+) {
+    test(
+        r#" "\(" => '(' ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" '(' "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningbracket() {
+    test(
+        r#"=> '(' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '(' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_n() {
+    test(
+        r#"=> '\n' ,"#,
+        vec![
+            (r#"~~~~~~~~ "#, EqualsGreaterThanCode(r#" '\n' "#)),
+            (r#"        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_w() {
+    test(
+        r#"=> '\w' ,"#,
+        vec![
+            (r#"~~~~~~~~ "#, EqualsGreaterThanCode(r#" '\w' "#)),
+            (r#"        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_planet123() {
+    test(
+        r#"=> '\planet123' ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" '\planet123' "#),
+            ),
+            (r#"                ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningcurlybracket() {
+    test(
+        r#"=> '{' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '{' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningsquarebracket() {
+    test(
+        r#"=> '[' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '[' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningbracket_wrapped_by_brackets() {
+    test(
+        r#"=> ('(') ,"#,
+        vec![
+            (r#"~~~~~~~~~ "#, EqualsGreaterThanCode(r#" ('(') "#)),
+            (r#"         ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_closingbracket_wrapped_by_brackets() {
+    test(
+        r#"=> (')') ,"#,
+        vec![
+            (r#"~~~~~~~~~ "#, EqualsGreaterThanCode(r#" (')') "#)),
+            (r#"         ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_tuple() {
+    test(
+        r#"=> (1,2,3) ,"#,
+        vec![
+            (r#"~~~~~~~~~~~ "#, EqualsGreaterThanCode(r#" (1,2,3) "#)),
+            (r#"           ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_statement_with_lifetime() {
+    test(
+        r#"=> HuffmanTable::<Code<'a>>::new() ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" HuffmanTable::<Code<'a>>::new() "#),
+            ),
+            (r#"                                   ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_statement_with_many_lifetimes() {
+    test(
+        r#"=> (HuffmanTable::<Code<'a, 'b>>::new()),"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" (HuffmanTable::<Code<'a, 'b>>::new())"#),
+            ),
+            (r#"                                        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_nested_function_with_lifetimes() {
+    test(
+        r#"=> fn foo<'a>(x: &'a i32, y: &'a i32) -> &'a i32 {} ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" fn foo<'a>(x: &'a i32, y: &'a i32) -> &'a i32 {} "#),
+            ),
+            (
+                r#"                                                    ~"#,
+                Comma,
+            ),
+        ],
+    );
+}
+
+#[test]
+fn where_with_lifetimes() {
+    test(
+        r#"where <'a,bar<'b,'c>>,baz;"#,
+        vec![
+            (r#"~~~~~                     "#, Where),
+            (r#"      ~                   "#, LessThan),
+            (r#"       ~~                 "#, Lifetime("'a")),
+            (r#"         ~                "#, Comma),
+            (r#"          ~~~             "#, MacroId("bar")),
+            (r#"             ~            "#, LessThan),
+            (r#"              ~~          "#, Lifetime("'b")),
+            (r#"                ~         "#, Comma),
+            (r#"                 ~~       "#, Lifetime("'c")),
+            (r#"                   ~      "#, GreaterThan),
+            (r#"                    ~     "#, GreaterThan),
+            (r#"                     ~    "#, Comma),
+            (r#"                      ~~~ "#, Id("baz")),
+            (r#"                         ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn forall() {
+    test(
+        r#"for<'a, 'b, 'c> FnMut"#,
+        vec![
+            (r#"~~~                  "#, For),
+            (r#"   ~                 "#, LessThan),
+            (r#"    ~~               "#, Lifetime("'a")),
+            (r#"      ~              "#, Comma),
+            (r#"        ~~           "#, Lifetime("'b")),
+            (r#"          ~          "#, Comma),
+            (r#"            ~~       "#, Lifetime("'c")),
+            (r#"              ~      "#, GreaterThan),
+            (r#"                ~~~~~"#, Id("FnMut")),
+        ],
+    );
+}
+
+#[test]
+fn where_forall_fnmut_with_return_type() {
+    test(
+        r#"where F: for<'a> FnMut(&'a T) -> U;"#,
+        vec![
+            (r#"~~~~~                              "#, Where),
+            (r#"      ~                            "#, Id("F")),
+            (r#"       ~                           "#, Colon),
+            (r#"         ~~~                       "#, For),
+            (r#"            ~                      "#, LessThan),
+            (r#"             ~~                    "#, Lifetime("'a")),
+            (r#"               ~                   "#, GreaterThan),
+            (r#"                 ~~~~~             "#, Id("FnMut")),
+            (r#"                      ~            "#, LeftParen),
+            (r#"                       ~           "#, Ampersand),
+            (r#"                        ~~         "#, Lifetime("'a")),
+            (r#"                           ~       "#, Id("T")),
+            (r#"                            ~      "#, RightParen),
+            (r#"                              ~~   "#, MinusGreaterThan),
+            (r#"                                 ~ "#, Id("U")),
+            (r#"                                  ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_error_unbalanced() {
+    test_err(r#"=> (,"#, (r#"~    "#, ErrorCode::UnterminatedCode))
+}
+
+#[test]
+fn equalsgreaterthancode_error_unbalanced_closingbracket_character() {
+    test_err(
+        r#"=> (,')',"#,
+        (r#"~        "#, ErrorCode::UnterminatedCode),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_unterminated_string_literal() {
+    test_err(
+        r#"=>  "Jan III Sobieski"#,
+        (
+            r#"    ~                "#,
+            ErrorCode::UnterminatedStringLiteral,
+        ),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_unterminated_character_literal() {
+    test_err(
+        r#"=>  '\x233  "#,
+        (r#"    ~       "#, ErrorCode::UnterminatedCharacterLiteral),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_end_of_input_instead_of_closing_normal_character_literal() {
+    test_err(
+        r#"=>  'x"#,
+        (r#"    ~ "#, ErrorCode::UnterminatedCharacterLiteral),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_single_quote_literal() {
+    test(
+        r#"=> { println!('\''); },"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" { println!('\''); }"#),
+            ),
+            (r#"                      ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_paren() {
+    // Issue #25
+    test(
+        r#"=> a("(", c),"#,
+        vec![
+            (r#"~~~~~~~~~~~~ "#, EqualsGreaterThanCode(r#" a("(", c)"#)),
+            (r#"            ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_regex_paren() {
+    // Issue #25
+    test(
+        r###"=> a(r##"("#""##, c),"###,
+        vec![
+            (
+                r###"~~~~~~~~~~~~~~~~~~~~ "###,
+                EqualsGreaterThanCode(r###" a(r##"("#""##, c)"###),
+            ),
+            (r###"                    ~"###, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_comment_eol() {
+    test(
+        "=> a(// (
+),",
+        vec![
+            (
+                "~~~~~~~~~
+~,",
+                EqualsGreaterThanCode(" a(// (\n)"),
+            ),
+            (
+                "=> a(// (
+)~",
+                Comma,
+            ),
+        ],
+    );
+}
+
+#[test]
+fn code2() {
+    test(
+        "=>? a(b, c),",
+        vec![
+            ("~~~~~~~~~~~ ", EqualsGreaterThanQuestionCode(" a(b, c)")),
+            ("           ~", Comma),
+        ],
+    );
+}
+
+#[test]
+#[should_panic]
+fn code_forgot_comma() {
+    test(
+        "=> a(b, c),",
+        vec![
+            ("~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            // intentionally forget the comma token; this is more of a test of `test`
+        ],
+    );
+}
+
+#[test]
+fn various_kinds_of_ids() {
+    test(
+        "foo<T<'a,U,`Z*{}`>>",
+        vec![
+            ("~~~                ", MacroId("foo")),
+            ("   ~               ", LessThan),
+            ("    ~              ", MacroId("T")),
+            ("     ~             ", LessThan),
+            ("      ~~           ", Lifetime("'a")),
+            ("        ~          ", Comma),
+            ("         ~         ", Id("U")),
+            ("          ~        ", Comma),
+            ("           ~~~~~~  ", Escape("Z*{}")),
+            ("                 ~ ", GreaterThan),
+            ("                  ~", GreaterThan),
+        ],
+    );
+}
+
+#[test]
+fn string_literals() {
+    test(
+        r#"foo "bar\"\n" baz"#,
+        vec![
+            (r#"~~~              "#, Id("foo")),
+            (r#"    ~~~~~~~~~    "#, StringLiteral(r#"bar\"\n"#)),
+            (r#"              ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn use1() {
+    test(
+        r#"use foo::bar; baz"#,
+        vec![
+            (r#"~~~~~~~~~~~~     "#, Use(" foo::bar")),
+            (r#"            ~    "#, Semi),
+            (r#"              ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn use2() {
+    test(
+        r#"use {foo,bar}; baz"#,
+        vec![
+            (r#"~~~~~~~~~~~~~     "#, Use(" {foo,bar}")),
+            (r#"             ~    "#, Semi),
+            (r#"               ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn where1() {
+    test(
+        r#"where <foo,bar>,baz;"#,
+        vec![
+            (r#"~~~~~               "#, Where),
+            (r#"      ~             "#, LessThan),
+            (r#"       ~~~          "#, Id("foo")),
+            (r#"          ~         "#, Comma),
+            (r#"           ~~~      "#, Id("bar")),
+            (r#"              ~     "#, GreaterThan),
+            (r#"               ~    "#, Comma),
+            (r#"                ~~~ "#, Id("baz")),
+            (r#"                   ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn regex1() {
+    test(
+        r#####"raa r##" #"#"" "#"##rrr"#####,
+        vec![
+            (r#####"~~~                    "#####, Id("raa")),
+            (
+                r#####"    ~~~~~~~~~~~~~~~~   "#####,
+                RegexLiteral(r##" #"#"" "#"##),
+            ),
+            (r#####"                    ~~~"#####, Id("rrr")),
+        ],
+    );
+}
+
+#[test]
+fn hash_token() {
+    test(r#" # "#, vec![(r#" ~ "#, Hash)]);
+}
+
+#[test]
+fn shebang_attribute_normal_text() {
+    test(
+        r#" #![Attribute] "#,
+        vec![(r#" ~~~~~~~~~~~~~ "#, ShebangAttribute("#![Attribute]"))],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_without_quotes() {
+    test(
+        r#" #![set width = 80] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute("#![set width = 80]"),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_with_quotes() {
+    test(
+        r#" #![set width = "80"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "80"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_closing_sqbracket_in_string_literal() {
+    test(
+        r#" #![set width = "80]"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "80]"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_opening_sqbracket_in_string_literal() {
+    test(
+        r#" #![set width = "[80"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "[80"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_nested_sqbrackets() {
+    test(
+        r#" #![set width = [80]] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = [80]]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn regex2() {
+    test(r#"r"(123""#, vec![(r#"~~~~~~~"#, RegexLiteral(r"(123"))]);
+}
+
+#[test]
+fn char_literals() {
+    test(
+        r#"'foo' 'a 'b '!' '!!' '\'' 'c"#,
+        vec![
+            (r#"~~~~~                       "#, CharLiteral("foo")),
+            (r#"      ~~                    "#, Lifetime("'a")),
+            (r#"         ~~                 "#, Lifetime("'b")),
+            (r#"            ~~~             "#, CharLiteral("!")),
+            (r#"                ~~~~        "#, CharLiteral("!!")),
+            (r#"                     ~~~~   "#, CharLiteral("\\'")),
+            (r#"                          ~~"#, Lifetime("'c")),
+        ],
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-snap/src/util.rs
@@ -0,0 +1,52 @@
+use std::fmt::{Display, Error, Formatter};
+
+pub use std::collections::btree_map as map;
+pub struct Sep<S>(pub &'static str, pub S);
+
+impl<'a, S: Display> Display for Sep<&'a Vec<S>> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let &Sep(sep, vec) = self;
+        let mut elems = vec.iter();
+        if let Some(elem) = elems.next() {
+            try!(write!(fmt, "{}", elem));
+            while let Some(elem) = elems.next() {
+                try!(write!(fmt, "{}{}", sep, elem));
+            }
+        }
+        Ok(())
+    }
+}
+
+pub struct Escape<S>(pub S);
+
+impl<S: Display> Display for Escape<S> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let tmp = format!("{}", self.0);
+        for c in tmp.chars() {
+            match c {
+                'a'...'z' | '0'...'9' | 'A'...'Z' => try!(write!(fmt, "{}", c)),
+                '_' => try!(write!(fmt, "__")),
+                _ => try!(write!(fmt, "_{:x}", c as usize)),
+            }
+        }
+        Ok(())
+    }
+}
+
+pub struct Prefix<S>(pub &'static str, pub S);
+
+impl<'a, S: Display> Display for Prefix<&'a [S]> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let &Prefix(prefix, vec) = self;
+        let mut elems = vec.iter();
+        while let Some(elem) = elems.next() {
+            try!(write!(fmt, "{}{}", prefix, elem));
+        }
+        Ok(())
+    }
+}
+
+/// Strip leading and trailing whitespace.
+pub fn strip(s: &str) -> &str {
+    s.trim_matches(char::is_whitespace)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-util/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"a424397db66c8e7ca5b569b904acc1fca7f38df62ce90c6fde4c24a986849926","src/lib.rs":"544345ce3baa1367304558c5dc9ded4651a94af6f33c191b9653e386851b2397"},"package":"de408fd50dea8ad7a77107144983a25c7fdabf5f8faf707a6e020d68874ed06c"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-util/Cargo.toml
@@ -0,0 +1,19 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "lalrpop-util"
+version = "0.15.1"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
+description = "Runtime library for parsers generated by LALRPOP"
+license = "Apache-2.0/MIT"
+repository = "https://github.com/lalrpop/lalrpop"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop-util/src/lib.rs
@@ -0,0 +1,165 @@
+use std::error::Error;
+use std::fmt;
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum ParseError<L, T, E> {
+    /// Generated by the parser when it encounters a token (or EOF) it did not
+    /// expect.
+    InvalidToken { location: L },
+
+    /// Generated by the parser when it encounters a token (or EOF) it did not
+    /// expect.
+    UnrecognizedToken {
+        /// If this is `Some`, then an unexpected token of type `T`
+        /// was observed, with a span given by the two `L` values. If
+        /// this is `None`, then EOF was observed when it was not
+        /// expected.
+        token: Option<(L, T, L)>,
+
+        /// The set of expected tokens: these names are taken from the
+        /// grammar and hence may not necessarily be suitable for
+        /// presenting to the user.
+        expected: Vec<String>,
+    },
+
+    /// Generated by the parser when it encounters additional,
+    /// unexpected tokens.
+    ExtraToken { token: (L, T, L) },
+
+    /// Custom error type.
+    User { error: E },
+}
+
+impl<L, T, E> ParseError<L, T, E> {
+    fn map_intern<FL, LL, FT, TT, FE, EE>(
+        self,
+        loc_op: FL,
+        tok_op: FT,
+        err_op: FE,
+    ) -> ParseError<LL, TT, EE>
+    where
+        FL: Fn(L) -> LL,
+        FT: Fn(T) -> TT,
+        FE: Fn(E) -> EE,
+    {
+        let maptok = |(s, t, e): (L, T, L)| (loc_op(s), tok_op(t), loc_op(e));
+        match self {
+            ParseError::InvalidToken { location } => ParseError::InvalidToken {
+                location: loc_op(location),
+            },
+            ParseError::UnrecognizedToken { token, expected } => ParseError::UnrecognizedToken {
+                token: token.map(maptok),
+                expected: expected,
+            },
+            ParseError::ExtraToken { token } => ParseError::ExtraToken {
+                token: maptok(token),
+            },
+            ParseError::User { error } => ParseError::User {
+                error: err_op(error),
+            },
+        }
+    }
+
+    pub fn map_location<F, LL>(self, op: F) -> ParseError<LL, T, E>
+    where
+        F: Fn(L) -> LL,
+    {
+        self.map_intern(op, |x| x, |x| x)
+    }
+
+    pub fn map_token<F, TT>(self, op: F) -> ParseError<L, TT, E>
+    where
+        F: Fn(T) -> TT,
+    {
+        self.map_intern(|x| x, op, |x| x)
+    }
+
+    pub fn map_error<F, EE>(self, op: F) -> ParseError<L, T, EE>
+    where
+        F: Fn(E) -> EE,
+    {
+        self.map_intern(|x| x, |x| x, op)
+    }
+}
+
+impl<L, T, E> fmt::Display for ParseError<L, T, E>
+where
+    L: fmt::Display,
+    T: fmt::Display,
+    E: fmt::Display,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::ParseError::*;
+        match *self {
+            InvalidToken { ref location } => write!(f, "Invalid token at {}", location),
+            UnrecognizedToken {
+                ref token,
+                ref expected,
+            } => {
+                match *token {
+                    Some((ref start, ref token, ref end)) => try!(write!(
+                        f,
+                        "Unrecognized token `{}` found at {}:{}",
+                        token, start, end
+                    )),
+                    None => try!(write!(f, "Unrecognized EOF")),
+                }
+                if !expected.is_empty() {
+                    try!(writeln!(f, ""));
+                    for (i, e) in expected.iter().enumerate() {
+                        let sep = match i {
+                            0 => "Expected one of",
+                            _ if i < expected.len() - 1 => ",",
+                            // Last expected message to be written
+                            _ => " or",
+                        };
+                        try!(write!(f, "{} {}", sep, e));
+                    }
+                }
+                Ok(())
+            }
+            ExtraToken {
+                token: (ref start, ref token, ref end),
+            } => write!(f, "Extra token {} found at {}:{}", token, start, end),
+            User { ref error } => write!(f, "{}", error),
+        }
+    }
+}
+
+impl<L, T, E> Error for ParseError<L, T, E>
+where
+    L: fmt::Debug + fmt::Display,
+    T: fmt::Debug + fmt::Display,
+    E: fmt::Debug + fmt::Display,
+{
+    fn description(&self) -> &str {
+        "parse error"
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct ErrorRecovery<L, T, E> {
+    pub error: ParseError<L, T, E>,
+    pub dropped_tokens: Vec<(L, T, L)>,
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test() {
+        let err = ParseError::UnrecognizedToken::<i32, &str, &str> {
+            token: Some((1, "t0", 2)),
+            expected: vec!["t1", "t2", "t3"]
+                .into_iter()
+                .map(|s| s.to_string())
+                .collect(),
+        };
+        assert_eq!(
+            format!("{}", err),
+            "Unrecognized token `t0` found at 1:2\n\
+             Expected one of t1, t2 or t3"
+        );
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"887215f81da6841664ecc83447b17997930861045c4815ed0794d180656de468","build.rs":"75173d40f6765aadd571c380fd28a88c09b8e4a12af7a1940575105984c41fbc","src/api/mod.rs":"3140db5d97aae171c820f09b8217b51fdbfbcb011279581dacc98d6dfbe1fd1a","src/build/action.rs":"a0fdb1a9228e5043cd3da3d0effb46d29bbbb01c8a5be820862692b674393460","src/build/fake_term.rs":"0356fa66487dc6bce478deafb1ad9a1976499281f79172ed049228d0e454cb2a","src/build/mod.rs":"6b10abcf38118ef15406eb0969a4b5e4ae7639c1891e64d6ded191d3a0b8eba1","src/collections/map.rs":"12042df3cede0e7b76539aa10068a7a143490dbbc6463ba10a33ab49fe70d760","src/collections/mod.rs":"51c4f28da5d201b3ed7e06f9c12883a288e5a55f4ee49824414b30d661c1a380","src/collections/multimap.rs":"aa84c44400fef4635b772f78e09be56aaea370feac045ef6336f8309cfb58a64","src/collections/set.rs":"55c9f8942bcdc79b6f404e9b3ec0b0de33b1ff73b97c46ec7ac337b728d92a70","src/file_text.rs":"39ea19ed379054fcea047a879f178aa801ba9ce41db4d4389e3bba46ee0c0cf3","src/generate.rs":"084ff538a44ea7c1a67e56ffd66060ec9f3c389f40a723989a3048e8aef8a050","src/grammar/consts.rs":"ac3d60118674c065b99c69428842f6a4e389563ebc51aead98568495c13133d6","src/grammar/mod.rs":"6b8bd7a7df0ed18486c8e0ac12304135c3277aeffe6f6faf8bf49a29edb50f6b","src/grammar/parse_tree.rs":"1f147a0ce70dd0cc03cfdf64c8b4df2dcc84b9dc1a3ffe8d1cfc5b418dac978e","src/grammar/pattern.rs":"7314b4e6321aa2811f92d1ed605ebf993007e54a91aae875d8186d7008fbef98","src/grammar/repr.rs":"a6f10b639e28f1d0b5dacea4bfd54898392aabdd495d8842b60a728bbbd8968f","src/grammar/token/mod.rs":"347c171330eed42c23356e42c9e9b30cc7564b5fdc5bf6625573c44fdb885cdf","src/grammar/token/test.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/kernel_set.rs":"c6da6013debabd7e4624571a31984ba8cb3902b4e4afb61f48ae2277e61a2e8e","src/lexer/dfa/interpret.rs":"3fe65d62acada89c3d39c4f89f96860573a55ccb0195ee518361aca2b24b4cd7","src/lexer/dfa/mod.rs":"8b8e75795cbfdd121d7c905e8cf0b03df21dfc5693a8190adcf6eec7960b7ad2","src/lexer/dfa/overlap.rs":"5373f47905ca913ba747a44295dce338b085d30a2fa47fe740e832fd526000ca","src/lexer/dfa/test.rs":"f3b8510b644906d7529a45574f24edbe78238bd7b92dc4f27eeb47c875873273","src/lexer/intern_token/mod.rs":"661a1f335cc24fa890cf30e682850e0bab5f392f45714971bb15990559a634ff","src/lexer/mod.rs":"427cd764234bc844b1653a3e32f5d2aed344e3dbd5b16d10d318ae337bc03a4e","src/lexer/nfa/interpret.rs":"0232acd16c1f74b4b10b4e2b62362d0c638ccedfb2d39c4ed6578fecb55090df","src/lexer/nfa/mod.rs":"a7fc713397a91f7617adf5bd1724bb6032a570ff56a331085ef7b33b9bec838c","src/lexer/nfa/test.rs":"c4fc89d218d67a56b414635991409061ba8c7c34c539f83118748b5f2ddbd699","src/lexer/re/mod.rs":"6dbe87ded5f2354e3ca1f02867f0101be478b9a8ff39155a5c3941ca89773c0b","src/lexer/re/test.rs":"c32af553e10cafc7d5c975fd347041dc065e1e17d380f9c8800282a3f0bb7957","src/lib.rs":"d97614ef5559e858e76ec9e2cc4d2c26a95230c9d8cf2c945cdf1412537935a7","src/log.rs":"44b4d616801c0bc46bb07051d393b21dd3c9f9686627a0b7583a06664a2ef4ea","src/lr1/build/mod.rs":"658217bd35f43c6761b480ef66dbb4e4d74385f8d46f8f8aa136d2572361111c","src/lr1/build/test.rs":"d3082486e4836d979fc71adc661429f9bcb2255e73785de3aa7afb1f98579cbb","src/lr1/build_lalr/mod.rs":"ec59df171ce24317b22be2eb2efddf8fcdd732e12c6f90c0f9f4efbf1c666f9a","src/lr1/build_lalr/test.rs":"ee40db2b645373440720577e57d1b54c4d8f302e448246ed44ee41129f80e295","src/lr1/codegen/ascent.rs":"708e016e83cb158a5c62355d1f130f44661ae53109931a472fd09344f45a2e0f","src/lr1/codegen/base.rs":"0301b6a742a7411e298b0f54b216247d06c9b8a90c1de6faf47e38ae0dbc82bd","src/lr1/codegen/mod.rs":"7189f8aa348bd2b6fcf37daa5f7e819849f5b6f0915f1c31d21b356d2f9df7b6","src/lr1/codegen/parse_table.rs":"411c5f9472a291053445924f595156bcbe54ad1554bad9dc5d6b461020859723","src/lr1/codegen/test_all.rs":"7e560a2ea981d7dab60b39db6d000cacbad9fa186212c748499b21254f705a66","src/lr1/core/mod.rs":"c953b6ae599a0ea0c71fe8f33c349d70c5a5b7772cf94228da7fd2c01efb7460","src/lr1/error/mod.rs":"58f1ddabccf7a59548148b49cd014994afc2e21545b3e9d7bce71dc744ab0fa8","src/lr1/error/test.rs":"0399afaa009a760ffe0fde63ffa8ff7e77dc83edd76c4681caecafc3e9151baa","src/lr1/example/mod.rs":"5fa766e7ea6baefe9b8c8766e5b772e0d13d800007eb9e96b38c67f3ab21e6e4","src/lr1/example/test.rs":"53bb8d20c8673ab67490c18004505c676b2a9d0cc171283dbfcd7f28f681f7d5","src/lr1/first/mod.rs":"1480361d3d468506f02755d562f2c7717b22a3f60b20ff1261de40796b199111","src/lr1/first/test.rs":"483c4c555f46136db01fcadb3cf205019b2337870aca42c6881c75570919f5da","src/lr1/interpret.rs":"c6b988be0adf7c5e833a2ba0d80be40875f4d9073ea82e1ec8e86c5484a93b87","src/lr1/item.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/lr1/lane_table/README.md":"494de731bd3ac5c44dc05c84497e59e713bbc1e50c24b4dd199a6576ae72f925","src/lr1/lane_table/construct/merge.rs":"4bfa79dec544b397d9455c6202cc2374db8c2e135a457e31ee77cf9ab206c274","src/lr1/lane_table/construct/mod.rs":"8b6a1f7ee2eca7591c5e43e29c3a3c3ccd88b4df8f6f550162d51bbb78f38af9","src/lr1/lane_table/construct/state_set.rs":"c47a87ec43e956e630121e2e9194fd77dff1d57d4cb9249136199b51fd1ca604","src/lr1/lane_table/lane/mod.rs":"690efee0f32af107dd4ee05f90c0dcb0b67ae4b553c0f95e7d92fc9e896e1475","src/lr1/lane_table/mod.rs":"6f671cc10a8df06f7dc807193521b4af27a207b74e181e9a073f0d43da0415df","src/lr1/lane_table/table/context_set/mod.rs":"94cc5922b13126b88dd452845803c6ce0d96f23e527a60fb9240315589d0192d","src/lr1/lane_table/table/context_set/test.rs":"b4f8ea549fe8247264aa8d8d891894f45f409aab247d3989638e480d5d9686d2","src/lr1/lane_table/table/mod.rs":"535084856c85e1e7d6de47ec5b19c8bcaba9b9c3b917a4c7c245e3a6c722528e","src/lr1/lane_table/test.rs":"1ab1447a5a16e95fc2e0a2674da3091041aafb6156ad4cfbe8bddd8f2d6d651a","src/lr1/lookahead.rs":"5c368c28e8101d59f18b5ee57adcc0fe34462ae39884a13bc1d6b652e3838ca9","src/lr1/mod.rs":"0c968f46ac56b4606d1e2119411e3e65a49c15cc3a7d0c79d298f139bb9b233c","src/lr1/report/mod.rs":"b67fc309b725d9eff58ea57ea5c219001d8023d93ab6e40f1a796f6d4f331d1a","src/lr1/state_graph.rs":"4168fa99fee5e7ac47e23a4506c90f16239c3b6a1dc756d9b3efbdca4a8505ce","src/lr1/tls.rs":"f40f9bacab9a471b58029eea4244996fe48dc41ee41cfb31c51b015bf20f4dfe","src/lr1/trace/mod.rs":"d71cf150567f3f0af3bf2c3bcaf1c443d9785edb27d9900393c6b3515cb1f17a","src/lr1/trace/reduce/mod.rs":"fe976f6de97d8dd4c9d582ba538fc0fdde0489313f07ab4fcb8769f0aab27eb7","src/lr1/trace/reduce/test.rs":"56789d4af6b330c65cac4099e31bf54a02c98d8a7607f010e9d404dbce208bdc","src/lr1/trace/shift/mod.rs":"a85b17d3ec5c60990b438f5912eda8fe41d878e11fc613d897aee414780f8bf5","src/lr1/trace/shift/test.rs":"2c727135de13d45198d9fd62abf3bbabb356cf6888071e9d35aa1cb1cf39742b","src/lr1/trace/trace_graph/mod.rs":"e37bb24a2b37e780e83735a8fc33005bcd1a5117caa956c23a2b462954fbfd2e","src/lr1/trace/trace_graph/test.rs":"be123da8f47641b49878eb6da1f77a237ea9e14f620de09de7eb5c93eaf1cba9","src/main.rs":"2d3c69bb5c4503c3fc52d0d6a8ced73a3465d6adfb8c6c9997ffae191e366d3e","src/message/builder.rs":"9ba48b51f12a8f21210ba82e6dd51b37442d5a0e1a25cee13e967bf36a04ea7b","src/message/horiz.rs":"8354a19142434ab05958f1bbd26e36244fcf57f101997fcb1bf210d168ff7970","src/message/indent.rs":"0e739f0a445bcb5165d2d4406c89b139057df4cccbc6a37a9b63792e6996925d","src/message/message.rs":"c217f00b20243771b6d4c002a88321501ff78a66346f1cdc39bd49e3635d346b","src/message/mod.rs":"1df6aade06d6a56cfb23faeb27da328ff3e3281364f91376cea5a54e3dca067b","src/message/styled.rs":"f027ef2bd3fe90a865f2437cde9cbe857b5dc1ffff986e6eded7ed96252a5e60","src/message/test.rs":"5cb26ccff7242f2acde35e78077b77955c053da30f1badf7cc2e7962942b351a","src/message/text.rs":"c98f53953ed215e0933de12657ccc3cd97476cca0d8730ada51e8789bb6d2958","src/message/vert.rs":"d204e54edce130d45d830b4e5018863dc3be9083e037c357b38b61ced42921e2","src/message/wrap.rs":"a27c8d93e5d357b5ad0e451ea5b6476b0536cf458ecbdd421506bba6c4372c97","src/normalize/inline/graph/mod.rs":"26700d5d96ddd62433a83ac14f836e1a7bebf7b78e0fb0179f33f733d6a1a87e","src/normalize/inline/graph/test.rs":"ca2fc54bbe5187fcdbbeff2b13cf7d0df67d369c4b9b9a83ace5626c93f9f839","src/normalize/inline/mod.rs":"c2ce84a9fdfe77e8ddb6c2a0497a2da1c6165264dccf142c8885352eb8242a7f","src/normalize/inline/test.rs":"69b1c44e297c177efd0d929ff626583aab02ffcdf51b8772a629d3ce2b178e0e","src/normalize/lower/mod.rs":"1cf4dc078f4cc72be239ef84fa2f8054bf7c4f08b18eedca2fd2a2ad6c3594c7","src/normalize/macro_expand/mod.rs":"5ffe55674045d8b7be8036e2f36a87d7d5b74f76f4bad5c040b3a546b1a5ec5b","src/normalize/macro_expand/test.rs":"9745129ddfa458bc15923606904ca698b377c570776725b9b80e9969cb2ae87e","src/normalize/mod.rs":"5bf1a73ae9148cbac1c662520b56c7904a49ab367cd78909926253372c9642ab","src/normalize/norm_util.rs":"f1bbf8c58fc56670e5dd88d3f1fac7951fb79b5809dc6e734d2063405aa74930","src/normalize/prevalidate/mod.rs":"3abc85becedf6ba1fc499390ff2130bb8afa706dd0e00b17b8198504cf48481c","src/normalize/prevalidate/test.rs":"95bfc751eeb49b741ac0037628452e2db1637f17394fdffbc31fef7c7383c2bd","src/normalize/resolve/mod.rs":"8fae0ab78e3ca4ee1c8e1b2e84729316ec3c1d62f452fe48f59e83287156bb88","src/normalize/resolve/test.rs":"39007967a516be901f59a9f6b0846df2cd28233f77d0c7813b20318166db9c04","src/normalize/token_check/mod.rs":"f25cc20b45a68c185ec652b123190b2546fc903980e436bc88b96f02d0c2cbc7","src/normalize/token_check/test.rs":"51eefaf7f860ffb611206b7e591e3aef38984e5d530a3637eae55089eb401f3d","src/normalize/tyinfer/mod.rs":"cc258da8b5c8421cf9ae850d6356e8512c634a9c70f789f3c44f46a1b9972d20","src/normalize/tyinfer/test.rs":"0bfc25cedb4f683ffff5c9363439d8e6d92bcab30c14ef1a0608c6820cf92a1f","src/parser/lrgrammar.lalrpop":"3d778fc3f4af79d8abffdaf2d88628b23ae95446274af671a8366a7ea3e69a4d","src/parser/lrgrammar.rs":"db138aae240f3453c48b5a2f0fc4851fb0c5f9b5537f4f1f0e5f50eec6662bf7","src/parser/mod.rs":"ec25dcd0ca5a624f0394583a9fb7239ed904ecbaacf4e2622f69e1ae7bde23c0","src/parser/test.rs":"016dcd9d7bf443c427688f288d764a2149f8c8ae5f47a237c7260ed235a949c7","src/rust/mod.rs":"13eb8a26c8eba832ae31cbbcc228a6558988667421ef9d054daf357eb1fc3460","src/session.rs":"409ab312e9ed87bac43544cd5e63f282e2fa343871305bf789612139906637c1","src/test_util.rs":"5aa61b5051c1f5930ef80dbd0e88d19cff2477824cd40069b9735ba279e58da2","src/tls/mod.rs":"35463d95c5d0476da7ac94cc633d4ccff28d890c2e88401c54fe95314c9a5839","src/tok/mod.rs":"3373dcd94bd08d1fdc2ad3d5bb5d2729d4ddee562dd08fb97ae897d48ced4229","src/tok/test.rs":"9818d57f6c70a3bc1f2e41a80fb3e0760bc70ff2739e2e61f628587a76adac8e","src/util.rs":"228ef527b92dedbe3caa9b16d906254d7b3e6fe8bbb32b312b613640d5cf18a1"},"package":"88035943c3cfbb897a499a556212b2b053574f32b4238b71b61625bc470f80aa"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/Cargo.toml
@@ -0,0 +1,77 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "lalrpop"
+version = "0.15.1"
+authors = ["Niko Matsakis <niko@alum.mit.edu>"]
+build = "build.rs"
+description = "convenient LR(1) parser generator"
+readme = "../README.md"
+keywords = ["parser", "generator", "LR", "yacc", "grammar"]
+categories = ["parsing"]
+license = "Apache-2.0/MIT"
+repository = "https://github.com/lalrpop/lalrpop"
+
+[lib]
+doctest = false
+[dependencies.ascii-canvas]
+version = "1.0"
+
+[dependencies.atty]
+version = "0.1.2"
+
+[dependencies.bit-set]
+version = "0.4.0"
+
+[dependencies.diff]
+version = "0.1.9"
+
+[dependencies.docopt]
+version = "0.8"
+
+[dependencies.ena]
+version = "0.5"
+
+[dependencies.itertools]
+version = "0.7"
+
+[dependencies.lalrpop-util]
+version = "0.15.1"
+
+[dependencies.petgraph]
+version = "0.4.4"
+
+[dependencies.regex]
+version = "0.2.1"
+
+[dependencies.regex-syntax]
+version = "0.4.0"
+
+[dependencies.serde]
+version = "1.0"
+
+[dependencies.serde_derive]
+version = "1.0"
+
+[dependencies.string_cache]
+version = "0.7.1"
+
+[dependencies.term]
+version = "0.4.5"
+
+[dependencies.unicode-xid]
+version = "0.1"
+[dev-dependencies.rand]
+version = "0.4"
+[build-dependencies.lalrpop-snap]
+version = "0.15.1"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/build.rs
@@ -0,0 +1,5 @@
+extern crate lalrpop_snap;
+
+fn main() {
+    lalrpop_snap::process_root().unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/api/mod.rs
@@ -0,0 +1,182 @@
+use build;
+use log::Level;
+use session::{ColorConfig, Session};
+use std::default::Default;
+use std::env;
+use std::env::current_dir;
+use std::error::Error;
+use std::path::{Path, PathBuf};
+use std::rc::Rc;
+
+/// Configure various aspects of how LALRPOP works.
+/// Intended for use within a `build.rs` script.
+/// To get the default configuration, use `Configuration::new`.
+#[derive(Clone, Default)]
+pub struct Configuration {
+    session: Session,
+}
+
+impl Configuration {
+    /// Creates the default configuration; equivalent to `Configuration::default`.
+    pub fn new() -> Configuration {
+        Configuration::default()
+    }
+
+    /// Always use ANSI colors in output, even if output does not appear to be a TTY.
+    pub fn always_use_colors(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::Yes;
+        self
+    }
+
+    /// Never use ANSI colors in output, even if output appears to be a TTY.
+    pub fn never_use_colors(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::No;
+        self
+    }
+
+    /// Use ANSI colors in output if output appears to be a TTY, but
+    /// not otherwise. This is the default.
+    pub fn use_colors_if_tty(&mut self) -> &mut Configuration {
+        self.session.color_config = ColorConfig::IfTty;
+        self
+    }
+
+    /// Specify a custom directory to search for input files.  This
+    /// directory is recursively searched for `.lalrpop` files to be
+    /// considered as input files.  This configuration setting also
+    /// impacts where output files are placed; paths are made relative
+    /// to the input path before being resolved relative to the output
+    /// path.  By default, the input directory is the current working
+    /// directory.
+    pub fn set_in_dir<P>(&mut self, dir: P) -> &mut Self
+    where
+        P: Into<PathBuf>,
+    {
+        self.session.in_dir = Some(dir.into());
+        self
+    }
+
+    /// Specify a custom directory to use when writing output files.
+    /// By default, the output directory is the same as the input
+    /// directory.
+    pub fn set_out_dir<P>(&mut self, dir: P) -> &mut Self
+    where
+        P: Into<PathBuf>,
+    {
+        self.session.out_dir = Some(dir.into());
+        self
+    }
+
+    /// Apply `cargo` directory location conventions, by setting the
+    /// input directory to `src` and the output directory to
+    /// `$OUT_DIR`.
+    pub fn use_cargo_dir_conventions(&mut self) -> &mut Self {
+        self.set_in_dir("src")
+            .set_out_dir(env::var("OUT_DIR").unwrap());
+        self
+    }
+
+    /// If true, always convert `.lalrpop` files into `.rs` files, even if the
+    /// `.rs` file is newer. Default is false.
+    pub fn force_build(&mut self, val: bool) -> &mut Configuration {
+        self.session.force_build = val;
+        self
+    }
+
+    /// If true, emit comments into the generated code. This makes the
+    /// generated code significantly larger. Default is false.
+    pub fn emit_comments(&mut self, val: bool) -> &mut Configuration {
+        self.session.emit_comments = val;
+        self
+    }
+
+    /// If true, emit report file about generated code.
+    pub fn emit_report(&mut self, val: bool) -> &mut Configuration {
+        self.session.emit_report = val;
+        self
+    }
+
+    /// Minimal logs: only for errors that halt progress.
+    pub fn log_quiet(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Taciturn);
+        self
+    }
+
+    /// Informative logs: give some high-level indications of
+    /// progress (default).
+    pub fn log_info(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Informative);
+        self
+    }
+
+    /// Verbose logs: more than info, but still not overwhelming.
+    pub fn log_verbose(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Verbose);
+        self
+    }
+
+    /// Debug logs: better redirect this to a file. Intended for
+    /// debugging LALRPOP itself.
+    pub fn log_debug(&mut self) -> &mut Configuration {
+        self.session.log.set_level(Level::Debug);
+        self
+    }
+
+    /// Enables "unit-testing" configuration. This is only for
+    /// lalrpop-test.
+    #[doc(hidden)]
+    pub fn unit_test(&mut self) -> &mut Configuration {
+        self.session.unit_test = true;
+        self
+    }
+
+    /// Process all files according to the `set_in_dir` and
+    /// `set_out_dir` configuration.
+    pub fn process(&self) -> Result<(), Box<Error>> {
+        let root = if let Some(ref d) = self.session.in_dir {
+            d.as_path()
+        } else {
+            Path::new(".")
+        };
+        self.process_dir(root)
+    }
+
+    /// Process all files in the current directory, which -- unless you
+    /// have changed it -- is typically the root of the crate being compiled.
+    pub fn process_current_dir(&self) -> Result<(), Box<Error>> {
+        self.process_dir(try!(current_dir()))
+    }
+
+    /// Process all `.lalrpop` files in `path`.
+    pub fn process_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), Box<Error>> {
+        let session = Rc::new(self.session.clone());
+        try!(build::process_dir(session, path));
+        Ok(())
+    }
+
+    /// Process the given `.lalrpop` file.
+    pub fn process_file<P: AsRef<Path>>(&self, path: P) -> Result<(), Box<Error>> {
+        let session = Rc::new(self.session.clone());
+        try!(build::process_file(session, path));
+        Ok(())
+    }
+}
+
+/// Process all files in the current directory, which -- unless you
+/// have changed it -- is typically the root of the crate being compiled.
+///
+/// Equivalent to `Configuration::new().process_current_dir()`.
+pub fn process_root() -> Result<(), Box<Error>> {
+    Configuration::new().process_current_dir()
+}
+
+/// Deprecated in favor of `Configuration`. Try:
+///
+/// ```rust
+/// Configuration::new().force_build(true).process_current_dir()
+/// ```
+///
+/// instead.
+pub fn process_root_unconditionally() -> Result<(), Box<Error>> {
+    Configuration::new().force_build(true).process_current_dir()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/build/action.rs
@@ -0,0 +1,422 @@
+//! Code for generating action code.
+//!
+//! From the outside, action fns have one of two forms. If they take
+//! symbols as input, e.g. from a production like `X = Y Z => ...`
+//! (which takes Y and Z as input), they have this form:
+//!
+//! ```
+//! fn __action17<
+//!     'input,                       // user-declared type parameters (*)
+//! >(
+//!     input: &'input str,           // user-declared parameters
+//!     __0: (usize, usize, usize),   // symbols being reduced, if any
+//!     ...
+//!     __N: (usize, Foo, usize),     // each has a type (L, T, L)
+//! ) -> Box<Expr<'input>>
+//! ```
+//!
+//! Otherwise, they have this form:
+//!
+//! ```
+//! fn __action17<
+//!     'input,                       // user-declared type parameters (*)
+//! >(
+//!     input: &'input str,           // user-declared parameters
+//!    __lookbehind: &usize,          // value for @R -- "end of previous token"
+//!    __lookahead: &usize,           // value for @L -- "start of next token"
+//! ) -> Box<Expr<'input>>
+//! ```
+//!
+//! * -- in this case, those "user-declared" parameters are inserted by
+//! the "internal tokenizer".
+
+use grammar::repr as r;
+use rust::RustWrite;
+use std::io::{self, Write};
+
+pub fn emit_action_code<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    for (i, defn) in grammar.action_fn_defns.iter().enumerate() {
+        rust!(rust, "");
+
+        // we always thread the parameters through to the action code,
+        // even if they are not used, and hence we need to disable the
+        // unused variables lint, which otherwise gets very excited.
+        if !grammar.parameters.is_empty() {
+            rust!(rust, "#[allow(unused_variables)]");
+        }
+
+        match defn.kind {
+            r::ActionFnDefnKind::User(ref data) => {
+                try!(emit_user_action_code(grammar, rust, i, defn, data))
+            }
+            r::ActionFnDefnKind::Lookaround(ref variant) => {
+                try!(emit_lookaround_action_code(grammar, rust, i, defn, variant))
+            }
+            r::ActionFnDefnKind::Inline(ref data) => {
+                try!(emit_inline_action_code(grammar, rust, i, defn, data))
+            }
+        }
+    }
+
+    Ok(())
+}
+
+fn ret_type_string(grammar: &r::Grammar, defn: &r::ActionFnDefn) -> String {
+    if defn.fallible {
+        format!(
+            "Result<{},{}lalrpop_util::ParseError<{},{},{}>>",
+            defn.ret_type,
+            grammar.prefix,
+            grammar.types.terminal_loc_type(),
+            grammar.types.terminal_token_type(),
+            grammar.types.error_type()
+        )
+    } else {
+        format!("{}", defn.ret_type)
+    }
+}
+
+fn emit_user_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    defn: &r::ActionFnDefn,
+    data: &r::UserActionFnDefn,
+) -> io::Result<()> {
+    let ret_type = ret_type_string(grammar, defn);
+
+    // For each symbol to be reduced, we will receive
+    // a (L, T, L) triple where the Ls are locations and
+    // the T is the data. Ignore the locations and bind
+    // the data to the name the user gave.
+    let mut arguments: Vec<String> = data.arg_patterns
+        .iter()
+        .zip(
+            data.arg_types
+                .iter()
+                .cloned()
+                .map(|t| grammar.types.spanned_type(t)),
+        )
+        .map(|(p, t)| format!("(_, {}, _): {}", p, t))
+        .collect();
+
+    // If this is a reduce of an empty production, we will
+    // automatically add position information in the form of
+    // lookbehind/lookahead values. Otherwise, those values would be
+    // determined from the arguments themselves.
+    if data.arg_patterns.is_empty() {
+        arguments.extend(vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ]);
+    }
+
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        arguments,
+        ret_type,
+        vec![]
+    ));
+    rust!(rust, "{{");
+    rust!(rust, "{}", data.code);
+    rust!(rust, "}}");
+    Ok(())
+}
+
+fn emit_lookaround_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    _defn: &r::ActionFnDefn,
+    data: &r::LookaroundActionFnDefn,
+) -> io::Result<()> {
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ],
+        format!("{}", grammar.types.terminal_loc_type()),
+        vec![]
+    ));
+
+    rust!(rust, "{{");
+    match *data {
+        r::LookaroundActionFnDefn::Lookahead => {
+            // take the lookahead, if any; otherwise, we are
+            // at EOF, so taker the lookbehind (end of last
+            // pushed token); if that is missing too, then
+            // supply default.
+            rust!(rust, "{}lookahead.clone()", grammar.prefix);
+        }
+        r::LookaroundActionFnDefn::Lookbehind => {
+            // take lookbehind or supply default
+            rust!(rust, "{}lookbehind.clone()", grammar.prefix);
+        }
+    }
+    rust!(rust, "}}");
+    Ok(())
+}
+
+fn emit_inline_action_code<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+    index: usize,
+    defn: &r::ActionFnDefn,
+    data: &r::InlineActionFnDefn,
+) -> io::Result<()> {
+    let ret_type = ret_type_string(grammar, defn);
+
+    let arg_types: Vec<_> = data.symbols
+        .iter()
+        .flat_map(|sym| match *sym {
+            r::InlinedSymbol::Original(ref s) => vec![s.clone()],
+            r::InlinedSymbol::Inlined(_, ref syms) => syms.clone(),
+        })
+        .map(|s| s.ty(&grammar.types))
+        .collect();
+
+    // this is the number of symbols we expect to be passed in; it is
+    // distinct from data.symbols.len(), because sometimes we have
+    // inlined actions with no input symbols
+    let num_flat_args = arg_types.len();
+
+    let mut arguments: Vec<_> = arg_types
+        .iter()
+        .map(|&t| grammar.types.spanned_type(t.clone()))
+        .enumerate()
+        .map(|(i, t)| format!("{}{}: {}", grammar.prefix, i, t))
+        .collect();
+
+    // If no symbols are being reduced, add in the
+    // lookbehind/lookahead.
+    if arguments.len() == 0 {
+        arguments.extend(vec![
+            format!(
+                "{}lookbehind: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+            format!(
+                "{}lookahead: &{}",
+                grammar.prefix,
+                grammar.types.terminal_loc_type()
+            ),
+        ]);
+    }
+
+    try!(rust.write_fn_header(
+        grammar,
+        &r::Visibility::Priv,
+        format!("{}action{}", grammar.prefix, index),
+        vec![],
+        None,
+        arguments,
+        ret_type,
+        vec![]
+    ));
+    rust!(rust, "{{");
+
+    // For each inlined thing, compute the start/end locations.
+    // Do this first so that none of the arguments have been moved
+    // yet and we can easily access their locations.
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(_, ref syms) => {
+                if syms.len() > 0 {
+                    // If we are reducing symbols, then start and end
+                    // can be the start/end location of the first/last
+                    // symbol respectively. Easy peezy.
+
+                    rust!(
+                        rust,
+                        "let {}start{} = {}{}.0.clone();",
+                        grammar.prefix,
+                        temp_counter,
+                        grammar.prefix,
+                        arg_counter
+                    );
+
+                    let last_arg_index = arg_counter + syms.len() - 1;
+                    rust!(
+                        rust,
+                        "let {}end{} = {}{}.2.clone();",
+                        grammar.prefix,
+                        temp_counter,
+                        grammar.prefix,
+                        last_arg_index
+                    );
+                } else {
+                    // If we have no symbols, then `arg_counter`
+                    // represents index of the first symbol after this
+                    // inlined item (if any), and `arg_counter-1`
+                    // represents index of the symbol before this
+                    // item.
+
+                    if arg_counter > 0 {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}{}.2.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter - 1
+                        );
+                    } else if num_flat_args > 0 {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}{}.0.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter
+                        );
+                    } else {
+                        rust!(
+                            rust,
+                            "let {}start{} = {}lookbehind.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix
+                        );
+                    }
+
+                    if arg_counter < num_flat_args {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}{}.0.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            arg_counter
+                        );
+                    } else if num_flat_args > 0 {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}{}.2.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix,
+                            num_flat_args - 1
+                        );
+                    } else {
+                        rust!(
+                            rust,
+                            "let {}end{} = {}lookahead.clone();",
+                            grammar.prefix,
+                            temp_counter,
+                            grammar.prefix
+                        );
+                    }
+                }
+
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+
+    // Now create temporaries for the inlined things
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(inlined_action, ref syms) => {
+                // execute the inlined reduce action
+                rust!(
+                    rust,
+                    "let {}temp{} = {}action{}(",
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    inlined_action.index()
+                );
+                for parameter in &grammar.parameters {
+                    rust!(rust, "{},", parameter.name);
+                }
+                for i in 0..syms.len() {
+                    rust!(rust, "{}{},", grammar.prefix, arg_counter + i);
+                }
+                if syms.len() == 0 {
+                    rust!(rust, "&{}start{},", grammar.prefix, temp_counter);
+                    rust!(rust, "&{}end{},", grammar.prefix, temp_counter);
+                }
+                rust!(rust, ");");
+
+                // wrap up the inlined value along with its span
+                rust!(
+                    rust,
+                    "let {}temp{} = ({}start{}, {}temp{}, {}end{});",
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter,
+                    grammar.prefix,
+                    temp_counter
+                );
+
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+
+    rust!(rust, "{}action{}(", grammar.prefix, data.action.index());
+    for parameter in &grammar.parameters {
+        rust!(rust, "{},", parameter.name);
+    }
+    let mut arg_counter = 0;
+    let mut temp_counter = 0;
+    for symbol in &data.symbols {
+        match *symbol {
+            r::InlinedSymbol::Original(_) => {
+                rust!(rust, "{}{},", grammar.prefix, arg_counter);
+                arg_counter += 1;
+            }
+            r::InlinedSymbol::Inlined(_, ref syms) => {
+                rust!(rust, "{}temp{},", grammar.prefix, temp_counter);
+                temp_counter += 1;
+                arg_counter += syms.len();
+            }
+        }
+    }
+    assert!(data.symbols.len() > 0);
+    rust!(rust, ")");
+
+    rust!(rust, "}}");
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/build/fake_term.rs
@@ -0,0 +1,84 @@
+use std::io::{self, Write};
+use term::{self, Attr, Terminal};
+use term::color::Color;
+
+/// A `Terminal` that just ignores all attempts at formatting. Used
+/// to report errors when no ANSI terminfo is available.
+pub struct FakeTerminal<W: Write> {
+    write: W,
+}
+
+impl<W: Write> FakeTerminal<W> {
+    pub fn new(write: W) -> FakeTerminal<W> {
+        FakeTerminal { write: write }
+    }
+}
+
+impl<W: Write> Write for FakeTerminal<W> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.write.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.write.flush()
+    }
+}
+
+impl<W: Write> Terminal for FakeTerminal<W> {
+    type Output = W;
+
+    fn fg(&mut self, _color: Color) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn bg(&mut self, _color: Color) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn attr(&mut self, _attr: Attr) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn supports_attr(&self, _attr: Attr) -> bool {
+        false
+    }
+
+    fn reset(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn supports_reset(&self) -> bool {
+        false
+    }
+
+    fn supports_color(&self) -> bool {
+        false
+    }
+
+    fn cursor_up(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn delete_line(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn carriage_return(&mut self) -> term::Result<()> {
+        Ok(())
+    }
+
+    fn get_ref(&self) -> &Self::Output {
+        &self.write
+    }
+
+    fn get_mut(&mut self) -> &mut Self::Output {
+        &mut self.write
+    }
+
+    fn into_inner(self) -> Self::Output
+    where
+        Self: Sized,
+    {
+        self.write
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/build/mod.rs
@@ -0,0 +1,585 @@
+//! Utilies for running in a build script.
+
+use atty;
+use file_text::FileText;
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use lalrpop_util::ParseError;
+use lexer::intern_token;
+use lr1;
+use message::{Content, Message};
+use message::builder::InlineBuilder;
+use normalize;
+use parser;
+use rust::RustWrite;
+use session::{ColorConfig, Session};
+use term;
+use tls::Tls;
+use tok;
+
+use std::fs;
+use std::io::{self, BufRead, Write};
+use std::path::{Path, PathBuf};
+use std::process::exit;
+use std::rc::Rc;
+
+mod action;
+mod fake_term;
+
+use self::fake_term::FakeTerminal;
+
+const LALRPOP_VERSION_HEADER: &'static str = concat!(
+    "// auto-generated: \"",
+    env!("CARGO_PKG_NAME"),
+    " ",
+    env!("CARGO_PKG_VERSION"),
+    "\""
+);
+
+pub fn process_dir<P: AsRef<Path>>(session: Rc<Session>, root_dir: P) -> io::Result<()> {
+    let lalrpop_files = try!(lalrpop_files(root_dir));
+    for lalrpop_file in lalrpop_files {
+        try!(process_file(session.clone(), lalrpop_file));
+    }
+    Ok(())
+}
+
+pub fn process_file<P: AsRef<Path>>(session: Rc<Session>, lalrpop_file: P) -> io::Result<()> {
+    let lalrpop_file = lalrpop_file.as_ref();
+    let rs_file = try!(resolve_rs_file(&session, lalrpop_file));
+    let report_file = try!(resolve_report_file(&session, lalrpop_file));
+    process_file_into(session, lalrpop_file, &rs_file, &report_file)
+}
+
+fn resolve_rs_file(session: &Session, lalrpop_file: &Path) -> io::Result<PathBuf> {
+    gen_resolve_file(session, lalrpop_file, "rs")
+}
+
+fn resolve_report_file(session: &Session, lalrpop_file: &Path) -> io::Result<PathBuf> {
+    gen_resolve_file(session, lalrpop_file, "report")
+}
+
+fn gen_resolve_file(session: &Session, lalrpop_file: &Path, ext: &str) -> io::Result<PathBuf> {
+    let in_dir = if let Some(ref d) = session.in_dir {
+        d.as_path()
+    } else {
+        Path::new(".")
+    };
+    let out_dir = if let Some(ref d) = session.out_dir {
+        d.as_path()
+    } else {
+        in_dir
+    };
+
+    // If the lalrpop file is not in in_dir, the result is that the
+    // .rs file is created in the same directory as the lalrpop file
+    // for compatibility reasons
+    Ok(out_dir
+        .join(lalrpop_file.strip_prefix(&in_dir).unwrap_or(lalrpop_file))
+        .with_extension(ext))
+}
+
+fn process_file_into(
+    session: Rc<Session>,
+    lalrpop_file: &Path,
+    rs_file: &Path,
+    report_file: &Path,
+) -> io::Result<()> {
+    if session.force_build || try!(needs_rebuild(&lalrpop_file, &rs_file)) {
+        log!(
+            session,
+            Informative,
+            "processing file `{}`",
+            lalrpop_file.to_string_lossy()
+        );
+        if let Some(parent) = rs_file.parent() {
+            try!(fs::create_dir_all(parent));
+        }
+        try!(make_read_only(&rs_file, false));
+        try!(remove_old_file(&rs_file));
+
+        // Load the LALRPOP source text for this file:
+        let file_text = Rc::new(try!(FileText::from_path(lalrpop_file.to_path_buf())));
+
+        // Store the session and file-text in TLS -- this is not
+        // intended to be used in this high-level code, but it gives
+        // easy access to this information pervasively in the
+        // low-level LR(1) and grammar normalization code. This is
+        // particularly useful for error-reporting.
+        let _tls = Tls::install(session.clone(), file_text.clone());
+
+        // Do the LALRPOP processing itself and write the resulting
+        // buffer into a file. We use a buffer so that if LR(1)
+        // generation fails at some point, we don't leave a partial
+        // file behind.
+        {
+            let grammar = try!(parse_and_normalize_grammar(&session, &file_text));
+            let buffer = try!(emit_recursive_ascent(&session, &grammar, &report_file));
+            let mut output_file = try!(fs::File::create(&rs_file));
+            try!(writeln!(output_file, "{}", LALRPOP_VERSION_HEADER));
+            try!(output_file.write_all(&buffer));
+        }
+
+        try!(make_read_only(&rs_file, true));
+    }
+    Ok(())
+}
+
+fn remove_old_file(rs_file: &Path) -> io::Result<()> {
+    match fs::remove_file(rs_file) {
+        Ok(()) => Ok(()),
+        Err(e) => {
+            // Unix reports NotFound, Windows PermissionDenied!
+            match e.kind() {
+                io::ErrorKind::NotFound | io::ErrorKind::PermissionDenied => Ok(()),
+                _ => Err(e),
+            }
+        }
+    }
+}
+
+fn needs_rebuild(lalrpop_file: &Path, rs_file: &Path) -> io::Result<bool> {
+    return match fs::metadata(&rs_file) {
+        Ok(rs_metadata) => {
+            let lalrpop_metadata = try!(fs::metadata(&lalrpop_file));
+            if compare_modification_times(&lalrpop_metadata, &rs_metadata) {
+                return Ok(true);
+            }
+
+            compare_lalrpop_version(rs_file)
+        }
+        Err(e) => match e.kind() {
+            io::ErrorKind::NotFound => Ok(true),
+            _ => Err(e),
+        },
+    };
+
+    #[cfg(unix)]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        use std::os::unix::fs::MetadataExt;
+        lalrpop_metadata.mtime() >= rs_metadata.mtime()
+    }
+
+    #[cfg(windows)]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        use std::os::windows::fs::MetadataExt;
+        lalrpop_metadata.last_write_time() >= rs_metadata.last_write_time()
+    }
+
+    #[cfg(not(any(unix, windows)))]
+    fn compare_modification_times(
+        lalrpop_metadata: &fs::Metadata,
+        rs_metadata: &fs::Metadata,
+    ) -> bool {
+        true
+    }
+
+    fn compare_lalrpop_version(rs_file: &Path) -> io::Result<bool> {
+        let mut input_str = String::new();
+        let mut f = io::BufReader::new(try!(fs::File::open(&rs_file)));
+        try!(f.read_line(&mut input_str));
+
+        Ok(input_str.trim() != LALRPOP_VERSION_HEADER)
+    }
+}
+
+fn make_read_only(rs_file: &Path, ro: bool) -> io::Result<()> {
+    if rs_file.is_file() {
+        let rs_metadata = try!(fs::metadata(&rs_file));
+        let mut rs_permissions = rs_metadata.permissions();
+        rs_permissions.set_readonly(ro);
+        fs::set_permissions(&rs_file, rs_permissions)
+    } else {
+        Ok(())
+    }
+}
+
+fn lalrpop_files<P: AsRef<Path>>(root_dir: P) -> io::Result<Vec<PathBuf>> {
+    let mut result = vec![];
+    for entry in try!(fs::read_dir(root_dir)) {
+        let entry = try!(entry);
+        let file_type = try!(entry.file_type());
+
+        let path = entry.path();
+
+        if file_type.is_dir() {
+            result.extend(try!(lalrpop_files(&path)));
+        }
+
+        if file_type.is_file() && path.extension().is_some()
+            && path.extension().unwrap() == "lalrpop"
+        {
+            result.push(path);
+        }
+    }
+    Ok(result)
+}
+
+fn parse_and_normalize_grammar(session: &Session, file_text: &FileText) -> io::Result<r::Grammar> {
+    let grammar = match parser::parse_grammar(file_text.text()) {
+        Ok(grammar) => grammar,
+
+        Err(ParseError::InvalidToken { location }) => {
+            let ch = file_text.text()[location..].chars().next().unwrap();
+            report_error(
+                &file_text,
+                pt::Span(location, location),
+                &format!("invalid character `{}`", ch),
+            );
+        }
+
+        Err(ParseError::UnrecognizedToken {
+            token: None,
+            expected: _,
+        }) => {
+            let len = file_text.text().len();
+            report_error(
+                &file_text,
+                pt::Span(len, len),
+                &format!("unexpected end of file"),
+            );
+        }
+
+        Err(ParseError::UnrecognizedToken {
+            token: Some((lo, _, hi)),
+            expected,
+        }) => {
+            let _ = expected; // didn't implement this yet :)
+            let text = &file_text.text()[lo..hi];
+            report_error(
+                &file_text,
+                pt::Span(lo, hi),
+                &format!("unexpected token: `{}`", text),
+            );
+        }
+
+        Err(ParseError::ExtraToken { token: (lo, _, hi) }) => {
+            let text = &file_text.text()[lo..hi];
+            report_error(
+                &file_text,
+                pt::Span(lo, hi),
+                &format!("extra token at end of input: `{}`", text),
+            );
+        }
+
+        Err(ParseError::User { error }) => {
+            let string = match error.code {
+                tok::ErrorCode::UnrecognizedToken => "unrecognized token",
+                tok::ErrorCode::UnterminatedEscape => "unterminated escape; missing '`'?",
+                tok::ErrorCode::UnterminatedStringLiteral => {
+                    "unterminated string literal; missing `\"`?"
+                }
+                tok::ErrorCode::UnterminatedCharacterLiteral => {
+                    "unterminated character literal; missing `'`?"
+                }
+                tok::ErrorCode::UnterminatedAttribute => "unterminated #! attribute; missing `]`?",
+                tok::ErrorCode::ExpectedStringLiteral => "expected string literal; missing `\"`?",
+                tok::ErrorCode::UnterminatedCode => {
+                    "unterminated code block; perhaps a missing `;`, `)`, `]` or `}`?"
+                }
+            };
+
+            report_error(
+                &file_text,
+                pt::Span(error.location, error.location + 1),
+                string,
+            )
+        }
+    };
+
+    match normalize::normalize(session, grammar) {
+        Ok(grammar) => Ok(grammar),
+        Err(error) => report_error(&file_text, error.span, &error.message),
+    }
+}
+
+fn report_error(file_text: &FileText, span: pt::Span, message: &str) -> ! {
+    println!("{} error: {}", file_text.span_str(span), message);
+
+    let out = io::stderr();
+    let mut out = out.lock();
+    file_text.highlight(span, &mut out).unwrap();
+
+    exit(1);
+}
+
+fn report_messages(messages: Vec<Message>) -> term::Result<()> {
+    let builder = InlineBuilder::new().begin_paragraphs();
+    let builder = messages
+        .into_iter()
+        .fold(builder, |b, m| b.push(Box::new(m)));
+    let content = builder.end().end();
+    report_content(&*content)
+}
+
+fn report_content(content: &Content) -> term::Result<()> {
+    // FIXME -- can we query the size of the terminal somehow?
+    let canvas = content.emit_to_canvas(80);
+
+    let try_colors = match Tls::session().color_config {
+        ColorConfig::Yes => true,
+        ColorConfig::No => false,
+        ColorConfig::IfTty => atty::is(),
+    };
+
+    if try_colors {
+        if let Some(mut stdout) = term::stdout() {
+            return canvas.write_to(&mut *stdout);
+        }
+    }
+
+    let stdout = io::stdout();
+    let mut stdout = FakeTerminal::new(stdout.lock());
+    canvas.write_to(&mut stdout)
+}
+
+fn emit_module_attributes<W: Write>(
+    grammar: &r::Grammar,
+    rust: &mut RustWrite<W>,
+) -> io::Result<()> {
+    rust.write_module_attributes(grammar)
+}
+
+fn emit_uses<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    rust.write_uses("", grammar)
+}
+
+fn emit_recursive_ascent(
+    session: &Session,
+    grammar: &r::Grammar,
+    report_file: &Path,
+) -> io::Result<Vec<u8>> {
+    let mut rust = RustWrite::new(vec![]);
+
+    // We generate a module structure like this:
+    //
+    // ```
+    // mod <output-file> {
+    //     // For each public symbol:
+    //     pub fn parse_XYZ();
+    //     mod __XYZ { ... }
+    //
+    //     // For each bit of action code:
+    //     <action-code>
+    // }
+    // ```
+    //
+    // Note that the action code goes in the outer module.  This is
+    // intentional because it means that the foo.lalrpop file serves
+    // as a module in the rust hierarchy, so if the action code
+    // includes things like `super::` it will resolve in the natural
+    // way.
+
+    try!(emit_module_attributes(grammar, &mut rust));
+    try!(emit_uses(grammar, &mut rust));
+
+    if grammar.start_nonterminals.is_empty() {
+        println!("Error: no public symbols declared in grammar");
+        exit(1);
+    }
+
+    for (user_nt, start_nt) in &grammar.start_nonterminals {
+        // We generate these, so there should always be exactly 1
+        // production. Otherwise the LR(1) algorithm doesn't know
+        // where to stop!
+        assert_eq!(grammar.productions_for(start_nt).len(), 1);
+
+        log!(
+            session,
+            Verbose,
+            "Building states for public nonterminal `{}`",
+            user_nt
+        );
+
+        let _lr1_tls = lr1::Lr1Tls::install(grammar.terminals.clone());
+
+        let lr1result = lr1::build_states(&grammar, start_nt.clone());
+        if session.emit_report {
+            let mut output_report_file = try!(fs::File::create(&report_file));
+            try!(lr1::generate_report(&mut output_report_file, &lr1result));
+        }
+
+        let states = match lr1result {
+            Ok(states) => states,
+            Err(error) => {
+                let messages = lr1::report_error(&grammar, &error);
+                let _ = report_messages(messages);
+                exit(1) // FIXME -- propagate up instead of calling `exit`
+            }
+        };
+
+        match grammar.algorithm.codegen {
+            r::LrCodeGeneration::RecursiveAscent => try!(lr1::codegen::ascent::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                "super",
+                &mut rust,
+            )),
+            r::LrCodeGeneration::TableDriven => try!(lr1::codegen::parse_table::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                "super",
+                &mut rust,
+            )),
+
+            r::LrCodeGeneration::TestAll => try!(lr1::codegen::test_all::compile(
+                &grammar,
+                user_nt.clone(),
+                start_nt.clone(),
+                &states,
+                &mut rust,
+            )),
+        }
+
+        rust!(
+            rust,
+            "{}use self::{}parse{}::{}Parser;",
+            grammar.nonterminals[&user_nt].visibility,
+            grammar.prefix,
+            start_nt,
+            user_nt
+        );
+    }
+
+    if let Some(ref intern_token) = grammar.intern_token {
+        try!(intern_token::compile(&grammar, intern_token, &mut rust));
+        rust!(rust, "pub use self::{}intern_token::Token;", grammar.prefix);
+    }
+
+    try!(action::emit_action_code(grammar, &mut rust));
+
+    try!(emit_to_triple_trait(grammar, &mut rust));
+
+    Ok(rust.into_inner())
+}
+
+fn emit_to_triple_trait<W: Write>(grammar: &r::Grammar, rust: &mut RustWrite<W>) -> io::Result<()> {
+    #![allow(non_snake_case)]
+
+    let L = grammar.types.terminal_loc_type();
+    let T = grammar.types.terminal_token_type();
+    let E = grammar.types.error_type();
+
+    let mut user_type_parameters = String::new();
+    for type_parameter in &grammar.type_parameters {
+        user_type_parameters.push_str(&format!("{}, ", type_parameter));
+    }
+
+    rust!(rust, "");
+    rust!(
+        rust,
+        "pub trait {}ToTriple<{}> {{",
+        grammar.prefix,
+        user_type_parameters,
+    );
+    rust!(rust, "type Error;");
+    rust!(
+        rust,
+        "fn to_triple(value: Self) -> Result<({},{},{}),Self::Error>;",
+        L,
+        T,
+        L,
+    );
+    rust!(rust, "}}");
+
+    rust!(rust, "");
+    if grammar.types.opt_terminal_loc_type().is_some() {
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for ({}, {}, {}) {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            L,
+            T,
+            L,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<({},{},{}),{}> {{",
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "Ok(value)");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for Result<({}, {}, {}),{}> {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<({},{},{}),{}> {{",
+            L,
+            T,
+            L,
+            E,
+        );
+        rust!(rust, "value");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+    } else {
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for {} {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            T,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<((),{},()),{}> {{",
+            T,
+            E,
+        );
+        rust!(rust, "Ok(((), value, ()))");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+
+        rust!(
+            rust,
+            "impl<{}> {}ToTriple<{}> for Result<({}),{}> {{",
+            user_type_parameters,
+            grammar.prefix,
+            user_type_parameters,
+            T,
+            E,
+        );
+        rust!(rust, "type Error = {};", E);
+        rust!(
+            rust,
+            "fn to_triple(value: Self) -> Result<((),{},()),{}> {{",
+            T,
+            E,
+        );
+        rust!(rust, "value.map(|v| ((), v, ()))");
+        rust!(rust, "}}");
+        rust!(rust, "}}");
+    }
+
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/collections/map.rs
@@ -0,0 +1,15 @@
+use std::collections::BTreeMap;
+
+pub use std::collections::btree_map::Entry;
+
+/// In general, we avoid coding directly against any particular map,
+/// but rather build against `util::Map` (and `util::map` to construct
+/// an instance). This should be a deterministic map, such that two
+/// runs of LALRPOP produce the same output, but otherwise it doesn't
+/// matter much. I'd probably prefer to use `HashMap` with an
+/// alternative hasher, but that's not stable.
+pub type Map<K, V> = BTreeMap<K, V>;
+
+pub fn map<K: Ord, V>() -> Map<K, V> {
+    Map::<K, V>::default()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/collections/mod.rs
@@ -0,0 +1,7 @@
+mod map;
+mod multimap;
+mod set;
+
+pub use self::map::{map, Entry, Map};
+pub use self::multimap::{Collection, Multimap};
+pub use self::set::{set, Set};
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/collections/multimap.rs
@@ -0,0 +1,140 @@
+use std::collections::btree_map;
+use std::default::Default;
+use std::iter::FromIterator;
+
+use super::map::{map, Map};
+use super::set::Set;
+
+pub struct Multimap<K, C: Collection> {
+    map: Map<K, C>,
+}
+
+pub trait Collection: Default {
+    type Item;
+
+    /// Push `item` into the collection and return `true` if
+    /// collection changed.
+    fn push(&mut self, item: Self::Item) -> bool;
+}
+
+impl<K: Ord, C: Collection> Multimap<K, C> {
+    pub fn new() -> Multimap<K, C> {
+        Multimap { map: map() }
+    }
+
+    pub fn is_empty(&self) -> bool {
+        self.map.is_empty()
+    }
+
+    /// Push `value` to the collection associated with `key`. Returns
+    /// true if the collection was changed from the default.
+    pub fn push(&mut self, key: K, value: C::Item) -> bool {
+        let mut inserted = false;
+        let pushed = self.map
+            .entry(key)
+            .or_insert_with(|| {
+                inserted = true;
+                C::default()
+            })
+            .push(value);
+        inserted || pushed
+    }
+
+    pub fn get(&self, key: &K) -> Option<&C> {
+        self.map.get(key)
+    }
+
+    pub fn iter(&self) -> btree_map::Iter<K, C> {
+        self.map.iter()
+    }
+
+    pub fn into_iter(self) -> btree_map::IntoIter<K, C> {
+        self.map.into_iter()
+    }
+}
+
+impl<K: Ord, C: Collection> IntoIterator for Multimap<K, C> {
+    type Item = (K, C);
+    type IntoIter = btree_map::IntoIter<K, C>;
+    fn into_iter(self) -> btree_map::IntoIter<K, C> {
+        self.into_iter()
+    }
+}
+
+impl<'iter, K: Ord, C: Collection> IntoIterator for &'iter Multimap<K, C> {
+    type Item = (&'iter K, &'iter C);
+    type IntoIter = btree_map::Iter<'iter, K, C>;
+    fn into_iter(self) -> btree_map::Iter<'iter, K, C> {
+        self.iter()
+    }
+}
+
+impl<K: Ord, C: Collection> FromIterator<(K, C::Item)> for Multimap<K, C> {
+    fn from_iter<T>(iterator: T) -> Self
+    where
+        T: IntoIterator<Item = (K, C::Item)>,
+    {
+        let mut map = Multimap::new();
+        for (key, value) in iterator {
+            map.push(key, value);
+        }
+        map
+    }
+}
+
+impl Collection for () {
+    type Item = ();
+    fn push(&mut self, _item: ()) -> bool {
+        false
+    }
+}
+
+impl<T> Collection for Vec<T> {
+    type Item = T;
+
+    fn push(&mut self, item: T) -> bool {
+        self.push(item);
+        true // always changes
+    }
+}
+
+impl<T: Ord> Collection for Set<T> {
+    type Item = T;
+
+    fn push(&mut self, item: T) -> bool {
+        self.insert(item)
+    }
+}
+
+impl<K: Ord, C: Collection> Default for Multimap<K, C> {
+    fn default() -> Self {
+        Multimap::new()
+    }
+}
+
+impl<K: Ord, C: Collection<Item = I>, I> Collection for Multimap<K, C> {
+    type Item = (K, I);
+
+    fn push(&mut self, item: (K, I)) -> bool {
+        let (key, value) = item;
+        self.push(key, value)
+    }
+}
+
+#[test]
+fn push() {
+    let mut m: Multimap<u32, Set<char>> = Multimap::new();
+    assert!(m.push(0, 'a'));
+    assert!(m.push(0, 'b'));
+    assert!(!m.push(0, 'b'));
+    assert!(m.push(1, 'a'));
+}
+
+#[test]
+fn push_nil() {
+    let mut m: Multimap<u32, ()> = Multimap::new();
+    assert!(m.push(0, ()));
+    assert!(!m.push(0, ()));
+    assert!(m.push(1, ()));
+    assert!(!m.push(0, ()));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/collections/set.rs
@@ -0,0 +1,8 @@
+use std::collections::BTreeSet;
+
+/// As `Map`, but for sets.
+pub type Set<K> = BTreeSet<K>;
+
+pub fn set<K: Ord>() -> Set<K> {
+    Set::<K>::default()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/file_text.rs
@@ -0,0 +1,144 @@
+use grammar::parse_tree as pt;
+use std::fmt::{Display, Error, Formatter};
+use std::fs::File;
+use std::path::PathBuf;
+use std::io::{self, Read, Write};
+
+pub struct FileText {
+    path: PathBuf,
+    input_str: String,
+    newlines: Vec<usize>,
+}
+
+impl FileText {
+    pub fn from_path(path: PathBuf) -> io::Result<FileText> {
+        let mut input_str = String::new();
+        let mut f = try!(File::open(&path));
+        try!(f.read_to_string(&mut input_str));
+        Ok(FileText::new(path, input_str))
+    }
+
+    pub fn new(path: PathBuf, input_str: String) -> FileText {
+        let newline_indices: Vec<usize> = {
+            let input_indices = input_str
+                .as_bytes()
+                .iter()
+                .enumerate()
+                .filter(|&(_, &b)| b == ('\n' as u8))
+                .map(|(i, _)| i + 1); // index of first char in the line
+            Some(0).into_iter().chain(input_indices).collect()
+        };
+
+        FileText {
+            path: path,
+            input_str: input_str,
+            newlines: newline_indices,
+        }
+    }
+
+    #[cfg(test)]
+    pub fn test() -> FileText {
+        Self::new(PathBuf::from("test.lalrpop"), String::from(""))
+    }
+
+    pub fn text(&self) -> &String {
+        &self.input_str
+    }
+
+    pub fn span_str(&self, span: pt::Span) -> String {
+        let (start_line, start_col) = self.line_col(span.0);
+        let (end_line, end_col) = self.line_col(span.1);
+        format!(
+            "{}:{}:{}: {}:{}",
+            self.path.display(),
+            start_line + 1,
+            start_col + 1,
+            end_line + 1,
+            end_col
+        )
+    }
+
+    fn line_col(&self, pos: usize) -> (usize, usize) {
+        let num_lines = self.newlines.len();
+        let line = (0..num_lines)
+            .filter(|&i| self.newlines[i] > pos)
+            .map(|i| i - 1)
+            .next()
+            .unwrap_or(num_lines - 1);
+
+        // offset of the first character in `line`
+        let line_offset = self.newlines[line];
+
+        // find the column; use `saturating_sub` in case `pos` is the
+        // newline itself, which we'll call column 0
+        let col = pos - line_offset;
+
+        (line, col)
+    }
+
+    fn line_text(&self, line_num: usize) -> &str {
+        let start_offset = self.newlines[line_num];
+        if line_num == self.newlines.len() - 1 {
+            &self.input_str[start_offset..]
+        } else {
+            let end_offset = self.newlines[line_num + 1];
+            &self.input_str[start_offset..end_offset - 1]
+        }
+    }
+
+    pub fn highlight(&self, span: pt::Span, out: &mut Write) -> io::Result<()> {
+        let (start_line, start_col) = self.line_col(span.0);
+        let (end_line, end_col) = self.line_col(span.1);
+
+        // (*) use `saturating_sub` since the start line could be the newline
+        // itself, in which case we'll call it column zero
+
+        // span is within one line:
+        if start_line == end_line {
+            let text = self.line_text(start_line);
+            try!(writeln!(out, "  {}", text));
+
+            if end_col - start_col <= 1 {
+                try!(writeln!(out, "  {}^", Repeat(' ', start_col)));
+            } else {
+                let width = end_col - start_col;
+                try!(writeln!(
+                    out,
+                    "  {}~{}~",
+                    Repeat(' ', start_col),
+                    Repeat('~', width.saturating_sub(2))
+                ));
+            }
+        } else {
+            // span is across many lines, find the maximal width of any of those
+            let line_strs: Vec<_> = (start_line..end_line + 1)
+                .map(|i| self.line_text(i))
+                .collect();
+            let max_len = line_strs.iter().map(|l| l.len()).max().unwrap();
+            try!(writeln!(
+                out,
+                "  {}{}~+",
+                Repeat(' ', start_col),
+                Repeat('~', max_len - start_col)
+            ));
+            for line in &line_strs[..line_strs.len() - 1] {
+                try!(writeln!(out, "| {0:<1$} |", line, max_len));
+            }
+            try!(writeln!(out, "| {}", line_strs[line_strs.len() - 1]));
+            try!(writeln!(out, "+~{}", Repeat('~', end_col)));
+        }
+
+        Ok(())
+    }
+}
+
+struct Repeat(char, usize);
+
+impl Display for Repeat {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        for _ in 0..self.1 {
+            try!(write!(fmt, "{}", self.0));
+        }
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/generate.rs
@@ -0,0 +1,78 @@
+//! Generate valid parse trees.
+
+use grammar::repr::*;
+use rand::{self, Rng};
+use std::iter::Iterator;
+
+#[derive(PartialEq, Eq)]
+pub enum ParseTree {
+    Nonterminal(NonterminalString, Vec<ParseTree>),
+    Terminal(TerminalString),
+}
+
+pub fn random_parse_tree(grammar: &Grammar, symbol: NonterminalString) -> ParseTree {
+    let mut gen = Generator {
+        grammar: grammar,
+        rng: rand::thread_rng(),
+        depth: 0,
+    };
+    loop {
+        // sometimes, the random walk overflows the stack, so we have a max, and if
+        // it is exceeded, we just try again
+        if let Some(result) = gen.nonterminal(symbol.clone()) {
+            return result;
+        }
+        gen.depth = 0;
+    }
+}
+
+struct Generator<'grammar> {
+    grammar: &'grammar Grammar,
+    rng: rand::ThreadRng,
+    depth: u32,
+}
+
+const MAX_DEPTH: u32 = 10000;
+
+impl<'grammar> Generator<'grammar> {
+    fn nonterminal(&mut self, nt: NonterminalString) -> Option<ParseTree> {
+        if self.depth > MAX_DEPTH {
+            return None;
+        }
+
+        self.depth += 1;
+        let productions = self.grammar.productions_for(&nt);
+        let index: usize = self.rng.gen_range(0, productions.len());
+        let production = &productions[index];
+        let trees: Option<Vec<_>> = production
+            .symbols
+            .iter()
+            .map(|sym| self.symbol(sym.clone()))
+            .collect();
+        trees.map(|trees| ParseTree::Nonterminal(nt, trees))
+    }
+
+    fn symbol(&mut self, symbol: Symbol) -> Option<ParseTree> {
+        match symbol {
+            Symbol::Nonterminal(nt) => self.nonterminal(nt),
+            Symbol::Terminal(t) => Some(ParseTree::Terminal(t)),
+        }
+    }
+}
+
+impl ParseTree {
+    pub fn terminals(&self) -> Vec<TerminalString> {
+        let mut vec = vec![];
+        self.push_terminals(&mut vec);
+        vec
+    }
+
+    fn push_terminals(&self, vec: &mut Vec<TerminalString>) {
+        match *self {
+            ParseTree::Terminal(ref s) => vec.push(s.clone()),
+            ParseTree::Nonterminal(_, ref trees) => for tree in trees {
+                tree.push_terminals(vec);
+            },
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/consts.rs
@@ -0,0 +1,26 @@
+/// Recognized associated type for the token location
+pub const LOCATION: &'static str = "Location";
+
+/// Recognized associated type for custom errors
+pub const ERROR: &'static str = "Error";
+
+/// The lifetime parameter injected when we do not have an external token enum
+pub const INPUT_LIFETIME: &'static str = "'input";
+
+/// The parameter injected when we do not have an external token enum
+pub const INPUT_PARAMETER: &'static str = "input";
+
+/// The annotation to request inlining.
+pub const INLINE: &'static str = "inline";
+
+/// Annotation to request LALR.
+pub const LALR: &'static str = "LALR";
+
+/// Annotation to request recursive-ascent-style code generation.
+pub const TABLE_DRIVEN: &'static str = "table_driven";
+
+/// Annotation to request recursive-ascent-style code generation.
+pub const RECURSIVE_ASCENT: &'static str = "recursive_ascent";
+
+/// Annotation to request test-all-style code generation.
+pub const TEST_ALL: &'static str = "test_all";
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/mod.rs
@@ -0,0 +1,7 @@
+//! The grammar definition.
+
+pub mod consts;
+pub mod parse_tree;
+pub mod pattern;
+pub mod repr;
+// pub mod token;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/parse_tree.rs
@@ -0,0 +1,1103 @@
+//! The "parse-tree" is what is produced by the parser. We use it do
+//! some pre-expansion and so forth before creating the proper AST.
+
+use string_cache::DefaultAtom as Atom;
+use lexer::dfa::DFA;
+use grammar::consts::{LALR, RECURSIVE_ASCENT, TABLE_DRIVEN, TEST_ALL};
+use grammar::repr::{self as r, NominalTypeRepr, TypeRepr};
+use grammar::pattern::Pattern;
+use message::Content;
+use message::builder::InlineBuilder;
+use std::fmt::{Debug, Display, Error, Formatter};
+use tls::Tls;
+use util::Sep;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Grammar {
+    // see field `prefix` in `grammar::repr::Grammar`
+    pub prefix: String,
+    pub span: Span,
+    pub type_parameters: Vec<TypeParameter>,
+    pub parameters: Vec<Parameter>,
+    pub where_clauses: Vec<WhereClause<TypeRef>>,
+    pub items: Vec<GrammarItem>,
+    pub annotations: Vec<Annotation>,
+    pub module_attributes: Vec<String>,
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Span(pub usize, pub usize);
+
+impl Into<Box<Content>> for Span {
+    fn into(self) -> Box<Content> {
+        let file_text = Tls::file_text();
+        let string = file_text.span_str(self);
+
+        // Insert an Adjacent block to prevent wrapping inside this
+        // string:
+        InlineBuilder::new()
+            .begin_adjacent()
+            .text(string)
+            .end()
+            .end()
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum GrammarItem {
+    MatchToken(MatchToken),
+    ExternToken(ExternToken),
+    InternToken(InternToken),
+    Nonterminal(NonterminalData),
+    Use(String),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MatchToken {
+    pub contents: Vec<MatchContents>,
+    pub span: Span,
+}
+
+impl MatchToken {
+    pub fn new(contents: MatchContents, span: Span) -> MatchToken {
+        MatchToken {
+            contents: vec![contents],
+            span: span,
+        }
+    }
+
+    // Not really sure if this is the best way to do it
+    pub fn add(self, contents: MatchContents) -> MatchToken {
+        let mut new_contents = self.contents.clone();
+        new_contents.push(contents);
+        MatchToken {
+            contents: new_contents,
+            span: self.span,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MatchContents {
+    pub items: Vec<MatchItem>,
+}
+
+// FIXME: Validate that MatchSymbol is actually a TerminalString::Literal
+//          and that MatchMapping is an Id or String
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum MatchItem {
+    CatchAll(Span),
+    Unmapped(MatchSymbol, Span),
+    Mapped(MatchSymbol, MatchMapping, Span),
+}
+
+impl MatchItem {
+    pub fn is_catch_all(&self) -> bool {
+        match *self {
+            MatchItem::CatchAll(_) => true,
+            _ => false,
+        }
+    }
+
+    pub fn span(&self) -> Span {
+        match *self {
+            MatchItem::CatchAll(span) => span,
+            MatchItem::Unmapped(_, span) => span,
+            MatchItem::Mapped(_, _, span) => span,
+        }
+    }
+}
+
+pub type MatchSymbol = TerminalLiteral;
+pub type MatchMapping = TerminalString;
+
+/// Intern tokens are not typed by the user: they are synthesized in
+/// the absence of an "extern" declaration with information about the
+/// string literals etc that appear in the grammar.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct InternToken {
+    /// Set of `r"foo"` and `"foo"` literals extracted from the
+    /// grammar. Sorted by order of increasing precedence.
+    pub match_entries: Vec<MatchEntry>,
+    pub dfa: DFA,
+}
+
+/// In `token_check`, as we prepare to generate a tokenizer, we
+/// combine any `match` declaration the user may have given with the
+/// set of literals (e.g. `"foo"` or `r"[a-z]"`) that appear elsewhere
+/// in their in the grammar to produce a series of `MatchEntry`. Each
+/// `MatchEntry` roughly corresponds to one line in a `match` declaration.
+///
+/// So e.g. if you had
+///
+/// ```
+/// match {
+///    r"(?i)BEGIN" => "BEGIN",
+///    "+" => "+",
+/// } else {
+///    _
+/// }
+///
+/// ID = r"[a-zA-Z]+"
+/// ```
+///
+/// This would correspond to three match entries:
+/// - `MatchEntry { match_literal: r"(?i)BEGIN", user_name: "BEGIN", precedence: 2 }`
+/// - `MatchEntry { match_literal: "+", user_name: "+", precedence: 3 }`
+/// - `MatchEntry { match_literal: "r[a-zA-Z]+"", user_name: r"[a-zA-Z]+", precedence: 0 }`
+///
+/// A couple of things to note:
+///
+/// - Literals appearing in the grammar are converting into an "identity" mapping
+/// - Each match group G is combined with the implicit priority IP of 1 for literals and 0 for
+///   regex to yield the final precedence; the formula is `G*2 + IP`.
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct MatchEntry {
+    /// The precedence of this match entry.
+    ///
+    /// NB: This field must go first, so that `PartialOrd` sorts by precedence first!
+    pub precedence: usize,
+    pub match_literal: TerminalLiteral,
+    pub user_name: TerminalString,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ExternToken {
+    pub span: Span,
+    pub associated_types: Vec<AssociatedType>,
+    pub enum_token: Option<EnumToken>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct AssociatedType {
+    pub type_span: Span,
+    pub type_name: Atom,
+    pub type_ref: TypeRef,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct EnumToken {
+    pub type_name: TypeRef,
+    pub type_span: Span,
+    pub conversions: Vec<Conversion>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Conversion {
+    pub span: Span,
+    pub from: TerminalString,
+    pub to: Pattern<TypeRef>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Path {
+    pub absolute: bool,
+    pub ids: Vec<Atom>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum TypeRef {
+    // (T1, T2)
+    Tuple(Vec<TypeRef>),
+
+    // Foo<'a, 'b, T1, T2>, Foo::Bar, etc
+    Nominal {
+        path: Path,
+        types: Vec<TypeRef>,
+    },
+
+    Ref {
+        lifetime: Option<Atom>,
+        mutable: bool,
+        referent: Box<TypeRef>,
+    },
+
+    // 'x ==> only should appear within nominal types, but what do we care
+    Lifetime(Atom),
+
+    // Foo or Bar ==> treated specially since macros may care
+    Id(Atom),
+
+    // <N> ==> type of a nonterminal, emitted by macro expansion
+    OfSymbol(SymbolKind),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum WhereClause<T> {
+    // 'a: 'b + 'c
+    Lifetime {
+        lifetime: Atom,
+        bounds: Vec<Atom>,
+    },
+    // where for<'a> &'a T: Debug + Into<usize>
+    Type {
+        forall: Option<Vec<Atom>>,
+        ty: T,
+        bounds: Vec<TypeBound<T>>,
+    },
+}
+
+impl<T> WhereClause<T> {
+    pub fn map<F, U>(&self, mut f: F) -> WhereClause<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            WhereClause::Lifetime {
+                ref lifetime,
+                ref bounds,
+            } => WhereClause::Lifetime {
+                lifetime: lifetime.clone(),
+                bounds: bounds.clone(),
+            },
+            WhereClause::Type {
+                ref forall,
+                ref ty,
+                ref bounds,
+            } => WhereClause::Type {
+                forall: forall.clone(),
+                ty: f(ty),
+                bounds: bounds.iter().map(|b| b.map(&mut f)).collect(),
+            },
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeBound<T> {
+    // The `'a` in `T: 'a`.
+    Lifetime(Atom),
+    // `for<'a> FnMut(&'a usize)`
+    Fn {
+        forall: Option<Vec<Atom>>,
+        path: Path,
+        parameters: Vec<T>,
+        ret: Option<T>,
+    },
+    // `some::Trait` or `some::Trait<Param, ...>` or `some::Trait<Item = Assoc>`
+    // or `for<'a> Trait<'a, T>`
+    Trait {
+        forall: Option<Vec<Atom>>,
+        path: Path,
+        parameters: Vec<TypeBoundParameter<T>>,
+    },
+}
+
+impl<T> TypeBound<T> {
+    pub fn map<F, U>(&self, mut f: F) -> TypeBound<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            TypeBound::Lifetime(ref l) => TypeBound::Lifetime(l.clone()),
+            TypeBound::Fn {
+                ref forall,
+                ref path,
+                ref parameters,
+                ref ret,
+            } => TypeBound::Fn {
+                forall: forall.clone(),
+                path: path.clone(),
+                parameters: parameters.iter().map(&mut f).collect(),
+                ret: ret.as_ref().map(f),
+            },
+            TypeBound::Trait {
+                ref forall,
+                ref path,
+                ref parameters,
+            } => TypeBound::Trait {
+                forall: forall.clone(),
+                path: path.clone(),
+                parameters: parameters.iter().map(|p| p.map(&mut f)).collect(),
+            },
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeBoundParameter<T> {
+    // 'a
+    Lifetime(Atom),
+    // `T` or `'a`
+    TypeParameter(T),
+    // `Item = T`
+    Associated(Atom, T),
+}
+
+impl<T> TypeBoundParameter<T> {
+    pub fn map<F, U>(&self, mut f: F) -> TypeBoundParameter<U>
+    where
+        F: FnMut(&T) -> U,
+    {
+        match *self {
+            TypeBoundParameter::Lifetime(ref l) => TypeBoundParameter::Lifetime(l.clone()),
+            TypeBoundParameter::TypeParameter(ref t) => TypeBoundParameter::TypeParameter(f(t)),
+            TypeBoundParameter::Associated(ref id, ref t) => {
+                TypeBoundParameter::Associated(id.clone(), f(t))
+            }
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub enum TypeParameter {
+    Lifetime(Atom),
+    Id(Atom),
+}
+
+impl TypeParameter {
+    pub fn is_lifetime(&self) -> bool {
+        match *self {
+            TypeParameter::Lifetime(_) => true,
+            _ => false,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Parameter {
+    pub name: Atom,
+    pub ty: TypeRef,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Visibility {
+    Pub(Option<Path>),
+    Priv,
+}
+
+impl Visibility {
+    pub fn is_pub(&self) -> bool {
+        match *self {
+            Visibility::Pub(_) => true,
+            Visibility::Priv => false,
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct NonterminalData {
+    pub visibility: Visibility,
+    pub name: NonterminalString,
+    pub annotations: Vec<Annotation>,
+    pub span: Span,
+    pub args: Vec<NonterminalString>, // macro arguments
+    pub type_decl: Option<TypeRef>,
+    pub alternatives: Vec<Alternative>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Annotation {
+    pub id_span: Span,
+    pub id: Atom,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Alternative {
+    pub span: Span,
+
+    pub expr: ExprSymbol,
+
+    // if C, only legal in macros
+    pub condition: Option<Condition>,
+
+    // => { code }
+    pub action: Option<ActionKind>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ActionKind {
+    User(String),
+    Fallible(String),
+    Lookahead,
+    Lookbehind,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Condition {
+    pub span: Span,
+    pub lhs: NonterminalString, // X
+    pub rhs: Atom,              // "Foo"
+    pub op: ConditionOp,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ConditionOp {
+    // X == "Foo", equality
+    Equals,
+
+    // X != "Foo", inequality
+    NotEquals,
+
+    // X ~~ "Foo", regexp match
+    Match,
+
+    // X !~ "Foo", regexp non-match
+    NotMatch,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Symbol {
+    pub span: Span,
+    pub kind: SymbolKind,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum SymbolKind {
+    // (X Y)
+    Expr(ExprSymbol),
+
+    // foo, before name resolution
+    AmbiguousId(Atom),
+
+    // "foo" and foo (after name resolution)
+    Terminal(TerminalString),
+
+    // foo, after name resolution
+    Nonterminal(NonterminalString),
+
+    // foo<..>
+    Macro(MacroSymbol),
+
+    // X+, X?, X*
+    Repeat(Box<RepeatSymbol>),
+
+    // <X>
+    Choose(Box<Symbol>),
+
+    // x:X
+    Name(Atom, Box<Symbol>),
+
+    // @L
+    Lookahead,
+
+    // @R
+    Lookbehind,
+
+    Error,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TerminalString {
+    Literal(TerminalLiteral),
+    Bare(Atom),
+    Error,
+}
+
+impl TerminalString {
+    pub fn as_literal(&self) -> Option<TerminalLiteral> {
+        match *self {
+            TerminalString::Literal(ref l) => Some(l.clone()),
+            _ => None,
+        }
+    }
+
+    pub fn display_len(&self) -> usize {
+        match *self {
+            TerminalString::Literal(ref x) => x.display_len(),
+            TerminalString::Bare(ref x) => x.len(),
+            TerminalString::Error => "error".len(),
+        }
+    }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TerminalLiteral {
+    Quoted(Atom),
+    Regex(Atom),
+}
+
+impl TerminalLiteral {
+    /// The *base precedence* is the precedence within a `match { }`
+    /// block level. It indicates that quoted things like `"foo"` get
+    /// precedence over regex matches.
+    pub fn base_precedence(&self) -> usize {
+        match *self {
+            TerminalLiteral::Quoted(_) => 1,
+            TerminalLiteral::Regex(_) => 0,
+        }
+    }
+
+    pub fn display_len(&self) -> usize {
+        match *self {
+            TerminalLiteral::Quoted(ref x) => x.len(),
+            TerminalLiteral::Regex(ref x) => x.len() + "####r".len(),
+        }
+    }
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NonterminalString(pub Atom);
+
+impl NonterminalString {
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+}
+
+impl Into<Box<Content>> for NonterminalString {
+    fn into(self) -> Box<Content> {
+        let session = Tls::session();
+
+        InlineBuilder::new()
+            .text(self)
+            .styled(session.nonterminal_symbol)
+            .end()
+    }
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum RepeatOp {
+    Star,
+    Plus,
+    Question,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct RepeatSymbol {
+    pub op: RepeatOp,
+    pub symbol: Symbol,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ExprSymbol {
+    pub symbols: Vec<Symbol>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct MacroSymbol {
+    pub name: NonterminalString,
+    pub args: Vec<Symbol>,
+}
+
+impl TerminalString {
+    pub fn quoted(i: Atom) -> TerminalString {
+        TerminalString::Literal(TerminalLiteral::Quoted(i))
+    }
+
+    pub fn regex(i: Atom) -> TerminalString {
+        TerminalString::Literal(TerminalLiteral::Regex(i))
+    }
+}
+
+impl Into<Box<Content>> for TerminalString {
+    fn into(self) -> Box<Content> {
+        let session = Tls::session();
+        InlineBuilder::new()
+            .text(self)
+            .styled(session.terminal_symbol)
+            .end()
+    }
+}
+
+impl Grammar {
+    pub fn extern_token(&self) -> Option<&ExternToken> {
+        self.items.iter().flat_map(|i| i.as_extern_token()).next()
+    }
+
+    pub fn enum_token(&self) -> Option<&EnumToken> {
+        self.items
+            .iter()
+            .flat_map(|i| i.as_extern_token())
+            .flat_map(|et| et.enum_token.as_ref())
+            .next()
+    }
+
+    pub fn intern_token(&self) -> Option<&InternToken> {
+        self.items.iter().flat_map(|i| i.as_intern_token()).next()
+    }
+
+    pub fn match_token(&self) -> Option<&MatchToken> {
+        self.items.iter().flat_map(|i| i.as_match_token()).next()
+    }
+}
+
+impl GrammarItem {
+    pub fn is_macro_def(&self) -> bool {
+        match *self {
+            GrammarItem::Nonterminal(ref d) => d.is_macro_def(),
+            _ => false,
+        }
+    }
+
+    pub fn as_nonterminal(&self) -> Option<&NonterminalData> {
+        match *self {
+            GrammarItem::Nonterminal(ref d) => Some(d),
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_match_token(&self) -> Option<&MatchToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(ref d) => Some(d),
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_extern_token(&self) -> Option<&ExternToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(ref d) => Some(d),
+            GrammarItem::InternToken(..) => None,
+        }
+    }
+
+    pub fn as_intern_token(&self) -> Option<&InternToken> {
+        match *self {
+            GrammarItem::Nonterminal(..) => None,
+            GrammarItem::Use(..) => None,
+            GrammarItem::MatchToken(..) => None,
+            GrammarItem::ExternToken(..) => None,
+            GrammarItem::InternToken(ref d) => Some(d),
+        }
+    }
+}
+
+impl NonterminalData {
+    pub fn is_macro_def(&self) -> bool {
+        !self.args.is_empty()
+    }
+}
+
+impl Symbol {
+    pub fn new(span: Span, kind: SymbolKind) -> Symbol {
+        Symbol {
+            span: span,
+            kind: kind,
+        }
+    }
+
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl Display for Visibility {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Visibility::Pub(Some(ref path)) => write!(fmt, "pub({}) ", path),
+            Visibility::Pub(None) => write!(fmt, "pub "),
+            Visibility::Priv => Ok(()),
+        }
+    }
+}
+
+impl<T: Display> Display for WhereClause<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            WhereClause::Lifetime {
+                ref lifetime,
+                ref bounds,
+            } => {
+                write!(fmt, "{}:", lifetime)?;
+                for (i, b) in bounds.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, " +")?;
+                    }
+                    write!(fmt, " {}", b)?;
+                }
+                Ok(())
+            }
+            WhereClause::Type {
+                ref forall,
+                ref ty,
+                ref bounds,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}: ", ty)?;
+                for (i, b) in bounds.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, " +")?;
+                    }
+                    write!(fmt, " {}", b)?;
+                }
+                Ok(())
+            }
+        }
+    }
+}
+
+impl<T: Display> Display for TypeBound<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeBound::Lifetime(ref l) => write!(fmt, "{}", l),
+            TypeBound::Fn {
+                ref forall,
+                ref path,
+                ref parameters,
+                ref ret,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}(", path)?;
+                for (i, p) in parameters.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, ", ")?;
+                    }
+                    write!(fmt, "{}", p)?;
+                }
+                write!(fmt, ")")?;
+
+                if let Some(ref ret) = *ret {
+                    write!(fmt, " -> {}", ret)?;
+                }
+
+                Ok(())
+            }
+            TypeBound::Trait {
+                ref forall,
+                ref path,
+                ref parameters,
+            } => {
+                if let Some(ref forall) = *forall {
+                    write!(fmt, "for<")?;
+                    for (i, l) in forall.iter().enumerate() {
+                        if i != 0 {
+                            write!(fmt, ", ")?;
+                        }
+                        write!(fmt, "{}", l)?;
+                    }
+                    write!(fmt, "> ")?;
+                }
+
+                write!(fmt, "{}", path)?;
+                if parameters.is_empty() {
+                    return Ok(());
+                }
+
+                write!(fmt, "<")?;
+                for (i, p) in parameters.iter().enumerate() {
+                    if i != 0 {
+                        write!(fmt, ", ")?;
+                    }
+                    write!(fmt, "{}", p)?;
+                }
+                write!(fmt, ">")
+            }
+        }
+    }
+}
+
+impl<T: Display> Display for TypeBoundParameter<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeBoundParameter::Lifetime(ref l) => write!(fmt, "{}", l),
+            TypeBoundParameter::TypeParameter(ref t) => write!(fmt, "{}", t),
+            TypeBoundParameter::Associated(ref id, ref t) => write!(fmt, "{} = {}", id, t),
+        }
+    }
+}
+
+impl Display for TerminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TerminalString::Literal(ref s) => write!(fmt, "{}", s),
+            TerminalString::Bare(ref s) => write!(fmt, "{}", s),
+            TerminalString::Error => write!(fmt, "error"),
+        }
+    }
+}
+
+impl Debug for TerminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for TerminalLiteral {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TerminalLiteral::Quoted(ref s) => write!(fmt, "{:?}", s.as_ref()), // the Debug impl adds the `"` and escaping
+            TerminalLiteral::Regex(ref s) => write!(fmt, "r#{:?}#", s.as_ref()), // FIXME -- need to determine proper number of #
+        }
+    }
+}
+
+impl Debug for TerminalLiteral {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self)
+    }
+}
+
+impl Display for Path {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(
+            fmt,
+            "{}{}",
+            if self.absolute { "::" } else { "" },
+            Sep("::", &self.ids),
+        )
+    }
+}
+
+impl Display for NonterminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+impl Debug for NonterminalString {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(&self.kind, fmt)
+    }
+}
+
+impl Display for SymbolKind {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            SymbolKind::Expr(ref expr) => write!(fmt, "{}", expr),
+            SymbolKind::Terminal(ref s) => write!(fmt, "{}", s),
+            SymbolKind::Nonterminal(ref s) => write!(fmt, "{}", s),
+            SymbolKind::AmbiguousId(ref s) => write!(fmt, "{}", s),
+            SymbolKind::Macro(ref m) => write!(fmt, "{}", m),
+            SymbolKind::Repeat(ref r) => write!(fmt, "{}", r),
+            SymbolKind::Choose(ref s) => write!(fmt, "<{}>", s),
+            SymbolKind::Name(ref n, ref s) => write!(fmt, "{}:{}", n, s),
+            SymbolKind::Lookahead => write!(fmt, "@L"),
+            SymbolKind::Lookbehind => write!(fmt, "@R"),
+            SymbolKind::Error => write!(fmt, "error"),
+        }
+    }
+}
+
+impl Display for RepeatSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}{}", self.symbol, self.op)
+    }
+}
+
+impl Display for RepeatOp {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            RepeatOp::Plus => write!(fmt, "+"),
+            RepeatOp::Star => write!(fmt, "*"),
+            RepeatOp::Question => write!(fmt, "?"),
+        }
+    }
+}
+
+impl Display for ExprSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({})", Sep(" ", &self.symbols))
+    }
+}
+
+impl ExternToken {
+    pub fn associated_type(&self, name: Atom) -> Option<&AssociatedType> {
+        self.associated_types
+            .iter()
+            .filter(|a| a.type_name == name)
+            .next()
+    }
+}
+
+impl ExprSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl MacroSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl RepeatSymbol {
+    pub fn canonical_form(&self) -> String {
+        format!("{}", self)
+    }
+}
+
+impl Display for MacroSymbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}<{}>", self.name, Sep(", ", &self.args))
+    }
+}
+
+impl Display for TypeParameter {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeParameter::Lifetime(ref s) => write!(fmt, "{}", s),
+            TypeParameter::Id(ref s) => write!(fmt, "{}", s),
+        }
+    }
+}
+
+impl Display for TypeRef {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeRef::Tuple(ref types) => write!(fmt, "({})", Sep(", ", types)),
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } if types.len() == 0 =>
+            {
+                write!(fmt, "{}", path)
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => write!(fmt, "{}<{}>", path, Sep(", ", types)),
+            TypeRef::Lifetime(ref s) => write!(fmt, "{}", s),
+            TypeRef::Id(ref s) => write!(fmt, "{}", s),
+            TypeRef::OfSymbol(ref s) => write!(fmt, "`{}`", s),
+            TypeRef::Ref {
+                lifetime: None,
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{}", referent),
+            TypeRef::Ref {
+                lifetime: Some(ref l),
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{} {}", l, referent),
+            TypeRef::Ref {
+                lifetime: None,
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&mut {}", referent),
+            TypeRef::Ref {
+                lifetime: Some(ref l),
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&{} mut {}", l, referent),
+        }
+    }
+}
+
+impl TypeRef {
+    // Converts a TypeRef to a TypeRepr, assuming no inference is
+    // required etc. This is safe for all types a user can directly
+    // type, but not safe for the result of expanding macros.
+    pub fn type_repr(&self) -> TypeRepr {
+        match *self {
+            TypeRef::Tuple(ref types) => {
+                TypeRepr::Tuple(types.iter().map(TypeRef::type_repr).collect())
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => TypeRepr::Nominal(NominalTypeRepr {
+                path: path.clone(),
+                types: types.iter().map(TypeRef::type_repr).collect(),
+            }),
+            TypeRef::Lifetime(ref id) => TypeRepr::Lifetime(id.clone()),
+            TypeRef::Id(ref id) => TypeRepr::Nominal(NominalTypeRepr {
+                path: Path::from_id(id.clone()),
+                types: vec![],
+            }),
+            TypeRef::OfSymbol(_) => unreachable!("OfSymbol produced by parser"),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => TypeRepr::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(referent.type_repr()),
+            },
+        }
+    }
+}
+
+impl Path {
+    pub fn from_id(id: Atom) -> Path {
+        Path {
+            absolute: false,
+            ids: vec![id],
+        }
+    }
+
+    pub fn usize() -> Path {
+        Path {
+            absolute: false,
+            ids: vec![Atom::from("usize")],
+        }
+    }
+
+    pub fn str() -> Path {
+        Path {
+            absolute: false,
+            ids: vec![Atom::from("str")],
+        }
+    }
+
+    pub fn vec() -> Path {
+        Path {
+            absolute: true,
+            ids: vec![Atom::from("std"), Atom::from("vec"), Atom::from("Vec")],
+        }
+    }
+
+    pub fn option() -> Path {
+        Path {
+            absolute: true,
+            ids: vec![
+                Atom::from("std"),
+                Atom::from("option"),
+                Atom::from("Option"),
+            ],
+        }
+    }
+
+    pub fn as_id(&self) -> Option<Atom> {
+        if !self.absolute && self.ids.len() == 1 {
+            Some(self.ids[0].clone())
+        } else {
+            None
+        }
+    }
+}
+
+pub fn read_algorithm(annotations: &[Annotation], algorithm: &mut r::Algorithm) {
+    for annotation in annotations {
+        if annotation.id == Atom::from(LALR) {
+            algorithm.lalr = true;
+        } else if annotation.id == Atom::from(TABLE_DRIVEN) {
+            algorithm.codegen = r::LrCodeGeneration::TableDriven;
+        } else if annotation.id == Atom::from(RECURSIVE_ASCENT) {
+            algorithm.codegen = r::LrCodeGeneration::RecursiveAscent;
+        } else if annotation.id == Atom::from(TEST_ALL) {
+            algorithm.codegen = r::LrCodeGeneration::TestAll;
+        } else {
+            panic!(
+                "validation permitted unknown annotation: {:?}",
+                annotation.id,
+            );
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/pattern.rs
@@ -0,0 +1,129 @@
+/*!
+
+The definition of patterns is shared between the parse-tree and the
+repr, but customized by a type T that represents the different type
+representations.
+
+*/
+
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::{Path, Span};
+use std::fmt::{Display, Error, Formatter};
+use util::Sep;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Pattern<T> {
+    pub span: Span,
+    pub kind: PatternKind<T>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct FieldPattern<T> {
+    pub field_span: Span,
+    pub field_name: Atom,
+    pub pattern: Pattern<T>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum PatternKind<T> {
+    Enum(Path, Vec<Pattern<T>>),
+    Struct(Path, Vec<FieldPattern<T>>, /* trailing ..? */ bool),
+    Path(Path),
+    Tuple(Vec<Pattern<T>>),
+    TupleStruct(Path, Vec<Pattern<T>>),
+    Usize(usize),
+    Underscore,
+    DotDot,
+    Choose(T),
+    CharLiteral(Atom),
+}
+
+impl<T> Pattern<T> {
+    pub fn for_each_binding<U>(&self, map_fn: &mut FnMut(&T) -> U) {
+        self.map(map_fn);
+    }
+
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> Pattern<U> {
+        Pattern {
+            span: self.span,
+            kind: self.kind.map(map_fn),
+        }
+    }
+}
+
+impl<T> PatternKind<T> {
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> PatternKind<U> {
+        match *self {
+            PatternKind::Path(ref path) => PatternKind::Path(path.clone()),
+            PatternKind::Enum(ref path, ref pats) => PatternKind::Enum(
+                path.clone(),
+                pats.iter().map(|pat| pat.map(map_fn)).collect(),
+            ),
+            PatternKind::Struct(ref path, ref fields, dotdot) => PatternKind::Struct(
+                path.clone(),
+                fields.iter().map(|pat| pat.map(map_fn)).collect(),
+                dotdot,
+            ),
+            PatternKind::Tuple(ref pats) => {
+                PatternKind::Tuple(pats.iter().map(|p| p.map(map_fn)).collect())
+            }
+            PatternKind::TupleStruct(ref path, ref pats) => {
+                PatternKind::TupleStruct(path.clone(), pats.iter().map(|p| p.map(map_fn)).collect())
+            }
+            PatternKind::Underscore => PatternKind::Underscore,
+            PatternKind::DotDot => PatternKind::DotDot,
+            PatternKind::Usize(n) => PatternKind::Usize(n),
+            PatternKind::Choose(ref ty) => PatternKind::Choose(map_fn(ty)),
+            PatternKind::CharLiteral(ref c) => PatternKind::CharLiteral(c.clone()),
+        }
+    }
+}
+
+impl<T> FieldPattern<T> {
+    pub fn map<U>(&self, map_fn: &mut FnMut(&T) -> U) -> FieldPattern<U> {
+        FieldPattern {
+            field_name: self.field_name.clone(),
+            field_span: self.field_span,
+            pattern: self.pattern.map(map_fn),
+        }
+    }
+}
+
+impl<T: Display> Display for Pattern<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.kind)
+    }
+}
+
+impl<T: Display> Display for PatternKind<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            PatternKind::Path(ref path) => write!(fmt, "{}", path),
+            PatternKind::Enum(ref path, ref pats) => write!(fmt, "{}({})", path, Sep(", ", pats)),
+            PatternKind::Struct(ref path, ref fields, false) => {
+                write!(fmt, "{} {{ {} }}", path, Sep(", ", fields))
+            }
+            PatternKind::Struct(ref path, ref fields, true) if fields.len() == 0 => {
+                write!(fmt, "{} {{ .. }}", path)
+            }
+            PatternKind::Struct(ref path, ref fields, true) => {
+                write!(fmt, "{} {{ {}, .. }}", path, Sep(", ", fields))
+            }
+            PatternKind::Tuple(ref paths) => write!(fmt, "({})", Sep(", ", paths)),
+            PatternKind::TupleStruct(ref path, ref paths) => {
+                write!(fmt, "{}({})", path, Sep(", ", paths))
+            }
+            PatternKind::Underscore => write!(fmt, "_"),
+            PatternKind::DotDot => write!(fmt, ".."),
+            PatternKind::Usize(n) => write!(fmt, "{}", n),
+            PatternKind::Choose(ref ty) => write!(fmt, "{}", ty),
+            PatternKind::CharLiteral(ref c) => write!(fmt, "'{}'", c),
+        }
+    }
+}
+
+impl<T: Display> Display for FieldPattern<T> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}: {}", self.field_name, self.pattern)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/repr.rs
@@ -0,0 +1,600 @@
+/*!
+ * Compiled representation of a grammar. Simplified, normalized
+ * version of `parse_tree`. The normalization passes produce this
+ * representation incrementally.
+ */
+
+use string_cache::DefaultAtom as Atom;
+use grammar::pattern::Pattern;
+use message::Content;
+use std::fmt::{Debug, Display, Error, Formatter};
+use collections::{map, Map};
+use util::Sep;
+
+// These concepts we re-use wholesale
+pub use grammar::parse_tree::{Annotation, InternToken, NonterminalString, Path, Span,
+                              TerminalLiteral, TerminalString, TypeParameter, Visibility,
+                              WhereClause};
+
+#[derive(Clone, Debug)]
+pub struct Grammar {
+    // a unique prefix that can be appended to identifiers to ensure
+    // that they do not conflict with any action strings
+    pub prefix: String,
+
+    // algorithm user requested for this parser
+    pub algorithm: Algorithm,
+
+    // true if the grammar mentions the `!` terminal anywhere
+    pub uses_error_recovery: bool,
+
+    // these are the nonterminals that were declared to be public; the
+    // key is the user's name for the symbol, the value is the
+    // artificial symbol we introduce, which will always have a single
+    // production like `Foo' = Foo`.
+    pub start_nonterminals: Map<NonterminalString, NonterminalString>,
+
+    // the "use foo;" statements that the user declared
+    pub uses: Vec<String>,
+
+    // type parameters declared on the grammar, like `grammar<T>;`
+    pub type_parameters: Vec<TypeParameter>,
+
+    // actual parameters declared on the grammar, like the `x: u32` in `grammar(x: u32);`
+    pub parameters: Vec<Parameter>,
+
+    // where clauses declared on the grammar, like `grammar<T> where T: Sized`
+    pub where_clauses: Vec<WhereClause<TypeRepr>>,
+
+    // optional tokenizer DFA; this is only needed if the user did not supply
+    // an extern token declaration
+    pub intern_token: Option<InternToken>,
+
+    // the grammar proper:
+    pub action_fn_defns: Vec<ActionFnDefn>,
+    pub terminals: TerminalSet,
+    pub nonterminals: Map<NonterminalString, NonterminalData>,
+    pub token_span: Span,
+    pub conversions: Map<TerminalString, Pattern<TypeRepr>>,
+    pub types: Types,
+    pub module_attributes: Vec<String>,
+}
+
+/// For each terminal, we map it to a small integer from 0 to N.
+/// This struct contains the mappings to go back and forth.
+#[derive(Clone, Debug)]
+pub struct TerminalSet {
+    pub all: Vec<TerminalString>,
+    pub bits: Map<TerminalString, usize>,
+}
+
+#[derive(Clone, Debug)]
+pub struct NonterminalData {
+    pub name: NonterminalString,
+    pub visibility: Visibility,
+    pub span: Span,
+    pub annotations: Vec<Annotation>,
+    pub productions: Vec<Production>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Algorithm {
+    pub lalr: bool,
+    pub codegen: LrCodeGeneration,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum LrCodeGeneration {
+    TableDriven,
+    RecursiveAscent,
+    TestAll,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Parameter {
+    pub name: Atom,
+    pub ty: TypeRepr,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Production {
+    // this overlaps with the key in the hashmap, obviously, but it's
+    // handy to have it
+    pub nonterminal: NonterminalString,
+    pub symbols: Vec<Symbol>,
+    pub action: ActionFn,
+    pub span: Span,
+}
+
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Symbol {
+    Nonterminal(NonterminalString),
+    Terminal(TerminalString),
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub struct ActionFnDefn {
+    pub fallible: bool,
+    pub ret_type: TypeRepr,
+    pub kind: ActionFnDefnKind,
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub enum ActionFnDefnKind {
+    User(UserActionFnDefn),
+    Inline(InlineActionFnDefn),
+    Lookaround(LookaroundActionFnDefn),
+}
+
+/// An action fn written by a user.
+#[derive(Clone, PartialEq, Eq)]
+pub struct UserActionFnDefn {
+    pub arg_patterns: Vec<Atom>,
+    pub arg_types: Vec<TypeRepr>,
+    pub code: String,
+}
+
+/// An action fn generated by the inlining pass.  If we were
+/// inlining `A = B C D` (with action 44) into `X = Y A Z` (with
+/// action 22), this would look something like:
+///
+/// ```
+/// fn __action66(__0: Y, __1: B, __2: C, __3: D, __4: Z) {
+///     __action22(__0, __action44(__1, __2, __3), __4)
+/// }
+/// ```
+#[derive(Clone, PartialEq, Eq)]
+pub struct InlineActionFnDefn {
+    /// in the example above, this would be `action22`
+    pub action: ActionFn,
+
+    /// in the example above, this would be `Y, {action44: B, C, D}, Z`
+    pub symbols: Vec<InlinedSymbol>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum LookaroundActionFnDefn {
+    Lookahead,
+    Lookbehind,
+}
+
+#[derive(Clone, PartialEq, Eq)]
+pub enum InlinedSymbol {
+    Original(Symbol),
+    Inlined(ActionFn, Vec<Symbol>),
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub enum TypeRepr {
+    Tuple(Vec<TypeRepr>),
+    Nominal(NominalTypeRepr),
+    Associated {
+        type_parameter: Atom,
+        id: Atom,
+    },
+    Lifetime(Atom),
+    Ref {
+        lifetime: Option<Atom>,
+        mutable: bool,
+        referent: Box<TypeRepr>,
+    },
+}
+
+impl TypeRepr {
+    pub fn is_unit(&self) -> bool {
+        match *self {
+            TypeRepr::Tuple(ref v) => v.is_empty(),
+            _ => false,
+        }
+    }
+
+    pub fn usize() -> TypeRepr {
+        TypeRepr::Nominal(NominalTypeRepr {
+            path: Path::usize(),
+            types: vec![],
+        })
+    }
+
+    pub fn str() -> TypeRepr {
+        TypeRepr::Nominal(NominalTypeRepr {
+            path: Path::str(),
+            types: vec![],
+        })
+    }
+
+    /// Returns the type parameters (or potential type parameters)
+    /// referenced by this type. e.g., for the type `&'x X`, would
+    /// return `[TypeParameter::Lifetime('x), TypeParameter::Id(X)]`.
+    /// This is later used to prune the type parameters list so that
+    /// only those that are actually used are included.
+    pub fn referenced(&self) -> Vec<TypeParameter> {
+        match *self {
+            TypeRepr::Tuple(ref tys) => tys.iter().flat_map(|t| t.referenced()).collect(),
+            TypeRepr::Nominal(ref data) => data.types
+                .iter()
+                .flat_map(|t| t.referenced())
+                .chain(match data.path.as_id() {
+                    Some(id) => vec![TypeParameter::Id(id)],
+                    None => vec![],
+                })
+                .collect(),
+            TypeRepr::Associated {
+                ref type_parameter, ..
+            } => vec![TypeParameter::Id(type_parameter.clone())],
+            TypeRepr::Lifetime(ref l) => vec![TypeParameter::Lifetime(l.clone())],
+            TypeRepr::Ref {
+                ref lifetime,
+                mutable: _,
+                ref referent,
+            } => lifetime
+                .iter()
+                .map(|id| TypeParameter::Lifetime(id.clone()))
+                .chain(referent.referenced())
+                .collect(),
+        }
+    }
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NominalTypeRepr {
+    pub path: Path,
+    pub types: Vec<TypeRepr>,
+}
+
+#[derive(Clone, Debug)]
+pub struct Types {
+    terminal_token_type: TypeRepr,
+    terminal_loc_type: Option<TypeRepr>,
+    error_type: Option<TypeRepr>,
+    terminal_types: Map<TerminalString, TypeRepr>,
+    nonterminal_types: Map<NonterminalString, TypeRepr>,
+    parse_error_type: TypeRepr,
+    error_recovery_type: TypeRepr,
+}
+
+impl Types {
+    pub fn new(
+        prefix: &str,
+        terminal_loc_type: Option<TypeRepr>,
+        error_type: Option<TypeRepr>,
+        terminal_token_type: TypeRepr,
+    ) -> Types {
+        let mut types = Types {
+            terminal_loc_type: terminal_loc_type,
+            error_type: error_type,
+            terminal_token_type: terminal_token_type,
+            terminal_types: map(),
+            nonterminal_types: map(),
+            // the following two will be overwritten later
+            parse_error_type: TypeRepr::Tuple(vec![]),
+            error_recovery_type: TypeRepr::Tuple(vec![]),
+        };
+
+        let args = vec![
+            types.terminal_loc_type().clone(),
+            types.terminal_token_type().clone(),
+            types.error_type(),
+        ];
+        types.parse_error_type = TypeRepr::Nominal(NominalTypeRepr {
+            path: Path {
+                absolute: false,
+                ids: vec![
+                    Atom::from(format!("{}lalrpop_util", prefix)),
+                    Atom::from("ParseError"),
+                ],
+            },
+            types: args.clone(),
+        });
+        types.error_recovery_type = TypeRepr::Nominal(NominalTypeRepr {
+            path: Path {
+                absolute: false,
+                ids: vec![
+                    Atom::from(format!("{}lalrpop_util", prefix)),
+                    Atom::from("ErrorRecovery"),
+                ],
+            },
+            types: args,
+        });
+        types
+            .terminal_types
+            .insert(TerminalString::Error, types.error_recovery_type.clone());
+        types
+    }
+
+    pub fn add_type(&mut self, nt_id: NonterminalString, ty: TypeRepr) {
+        assert!(self.nonterminal_types.insert(nt_id, ty).is_none());
+    }
+
+    pub fn add_term_type(&mut self, term: TerminalString, ty: TypeRepr) {
+        assert!(self.terminal_types.insert(term, ty).is_none());
+    }
+
+    pub fn terminal_token_type(&self) -> &TypeRepr {
+        &self.terminal_token_type
+    }
+
+    pub fn opt_terminal_loc_type(&self) -> Option<&TypeRepr> {
+        self.terminal_loc_type.as_ref()
+    }
+
+    pub fn terminal_loc_type(&self) -> TypeRepr {
+        self.terminal_loc_type
+            .clone()
+            .unwrap_or_else(|| TypeRepr::Tuple(vec![]))
+    }
+
+    pub fn error_type(&self) -> TypeRepr {
+        self.error_type.clone().unwrap_or_else(|| TypeRepr::Ref {
+            lifetime: Some(Atom::from("'static")),
+            mutable: false,
+            referent: Box::new(TypeRepr::str()),
+        })
+    }
+
+    pub fn terminal_type(&self, id: &TerminalString) -> &TypeRepr {
+        self.terminal_types
+            .get(&id)
+            .unwrap_or(&self.terminal_token_type)
+    }
+
+    pub fn terminal_types(&self) -> Vec<TypeRepr> {
+        self.terminal_types.values().cloned().collect()
+    }
+
+    pub fn lookup_nonterminal_type(&self, id: &NonterminalString) -> Option<&TypeRepr> {
+        self.nonterminal_types.get(&id)
+    }
+
+    pub fn nonterminal_type(&self, id: &NonterminalString) -> &TypeRepr {
+        &self.nonterminal_types[&id]
+    }
+
+    pub fn nonterminal_types(&self) -> Vec<TypeRepr> {
+        self.nonterminal_types.values().cloned().collect()
+    }
+
+    pub fn parse_error_type(&self) -> &TypeRepr {
+        &self.parse_error_type
+    }
+
+    pub fn error_recovery_type(&self) -> &TypeRepr {
+        &self.error_recovery_type
+    }
+
+    /// Returns a type `(L, T, L)` where L is the location type and T
+    /// is the token type.
+    pub fn triple_type(&self) -> TypeRepr {
+        self.spanned_type(self.terminal_token_type().clone())
+    }
+
+    /// Returns a type `(L, T, L)` where L is the location type and T
+    /// is the argument.
+    pub fn spanned_type(&self, ty: TypeRepr) -> TypeRepr {
+        let location_type = self.terminal_loc_type();
+        TypeRepr::Tuple(vec![location_type.clone(), ty, location_type])
+    }
+}
+
+impl Display for Parameter {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}: {}", self.name, self.ty)
+    }
+}
+
+impl Display for TypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            TypeRepr::Tuple(ref types) => write!(fmt, "({})", Sep(", ", types)),
+            TypeRepr::Nominal(ref data) => write!(fmt, "{}", data),
+            TypeRepr::Associated {
+                ref type_parameter,
+                ref id,
+            } => write!(fmt, "{}::{}", type_parameter, id),
+            TypeRepr::Lifetime(ref id) => write!(fmt, "{}", id),
+            TypeRepr::Ref {
+                lifetime: None,
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{}", referent),
+            TypeRepr::Ref {
+                lifetime: Some(ref l),
+                mutable: false,
+                ref referent,
+            } => write!(fmt, "&{} {}", l, referent),
+            TypeRepr::Ref {
+                lifetime: None,
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&mut {}", referent),
+            TypeRepr::Ref {
+                lifetime: Some(ref l),
+                mutable: true,
+                ref referent,
+            } => write!(fmt, "&{} mut {}", l, referent),
+        }
+    }
+}
+
+impl Debug for TypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for NominalTypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        if self.types.len() == 0 {
+            write!(fmt, "{}", self.path)
+        } else {
+            write!(fmt, "{}<{}>", self.path, Sep(", ", &self.types))
+        }
+    }
+}
+
+impl Debug for NominalTypeRepr {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
+pub struct ActionFn(u32);
+
+impl ActionFn {
+    pub fn new(x: usize) -> ActionFn {
+        ActionFn(x as u32)
+    }
+
+    pub fn index(&self) -> usize {
+        self.0 as usize
+    }
+}
+
+impl Symbol {
+    pub fn is_terminal(&self) -> bool {
+        match *self {
+            Symbol::Terminal(..) => true,
+            Symbol::Nonterminal(..) => false,
+        }
+    }
+
+    pub fn ty<'ty>(&self, t: &'ty Types) -> &'ty TypeRepr {
+        match *self {
+            Symbol::Terminal(ref id) => t.terminal_type(id),
+            Symbol::Nonterminal(ref id) => t.nonterminal_type(id),
+        }
+    }
+}
+
+impl Display for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Symbol::Nonterminal(ref id) => write!(fmt, "{}", id.clone()),
+            Symbol::Terminal(ref id) => write!(fmt, "{}", id.clone()),
+        }
+    }
+}
+
+impl Debug for Symbol {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Into<Box<Content>> for Symbol {
+    fn into(self) -> Box<Content> {
+        match self {
+            Symbol::Nonterminal(nt) => nt.into(),
+            Symbol::Terminal(term) => term.into(),
+        }
+    }
+}
+
+impl Debug for Production {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(
+            fmt,
+            "{} = {} => {:?};",
+            self.nonterminal,
+            Sep(", ", &self.symbols),
+            self.action,
+        )
+    }
+}
+
+impl Debug for ActionFnDefn {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.to_fn_string("_"))
+    }
+}
+
+impl ActionFnDefn {
+    fn to_fn_string(&self, name: &str) -> String {
+        match self.kind {
+            ActionFnDefnKind::User(ref data) => data.to_fn_string(self, name),
+            ActionFnDefnKind::Inline(ref data) => data.to_fn_string(name),
+            ActionFnDefnKind::Lookaround(ref data) => format!("{:?}", data),
+        }
+    }
+}
+
+impl UserActionFnDefn {
+    fn to_fn_string(&self, defn: &ActionFnDefn, name: &str) -> String {
+        let arg_strings: Vec<String> = self.arg_patterns
+            .iter()
+            .zip(self.arg_types.iter())
+            .map(|(p, t)| format!("{}: {}", p, t))
+            .collect();
+
+        format!(
+            "fn {}({}) -> {} {{ {} }}",
+            name,
+            Sep(", ", &arg_strings),
+            defn.ret_type,
+            self.code,
+        )
+    }
+}
+
+impl InlineActionFnDefn {
+    fn to_fn_string(&self, name: &str) -> String {
+        let arg_strings: Vec<String> = self.symbols
+            .iter()
+            .map(|inline_sym| match *inline_sym {
+                InlinedSymbol::Original(ref s) => format!("{}", s),
+                InlinedSymbol::Inlined(a, ref s) => format!("{:?}({})", a, Sep(", ", s)),
+            })
+            .collect();
+
+        format!(
+            "fn {}(..) {{ {:?}({}) }}",
+            name,
+            self.action,
+            Sep(", ", &arg_strings),
+        )
+    }
+}
+
+impl Grammar {
+    pub fn pattern(&self, t: &TerminalString) -> &Pattern<TypeRepr> {
+        &self.conversions[t]
+    }
+
+    pub fn productions_for(&self, nonterminal: &NonterminalString) -> &[Production] {
+        match self.nonterminals.get(nonterminal) {
+            Some(v) => &v.productions[..],
+            None => &[], // this...probably shouldn't happen actually?
+        }
+    }
+
+    pub fn user_parameter_refs(&self) -> String {
+        let mut result = String::new();
+        for parameter in &self.parameters {
+            result.push_str(&format!("{}, ", parameter.name));
+        }
+        result
+    }
+
+    pub fn action_is_fallible(&self, f: ActionFn) -> bool {
+        self.action_fn_defns[f.index()].fallible
+    }
+
+    pub fn non_lifetime_type_parameters(&self) -> Vec<&TypeParameter> {
+        self.type_parameters
+            .iter()
+            .filter(|&tp| match *tp {
+                TypeParameter::Lifetime(_) => false,
+                TypeParameter::Id(_) => true,
+            })
+            .collect()
+    }
+}
+
+impl Default for Algorithm {
+    fn default() -> Self {
+        Algorithm {
+            lalr: false,
+            codegen: LrCodeGeneration::TableDriven,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/token/mod.rs
@@ -0,0 +1,28 @@
+use std::collections::HashMap;
+
+use grammar::parse_tree::TypeRef;
+use string_cache::DefaultAtom as Atom;
+
+#[cfg(test)]
+mod test;
+
+pub struct TokenDefinition {
+    // if the enum type is `foo::bar::baz<X,Y>` then:
+    enum_type: TypeRef,
+
+    // map from a custom string, like `"("` to a variant name like LPAREN
+    token_map: HashMap<Atom, Atom>,
+}
+
+impl TokenDefinition {
+    pub fn new(enum_type: TypeRef, token_map: Vec<(Atom, Atom)>) -> TokenDefinition {
+        TokenDefinition {
+            enum_type: enum_type,
+            token_map: token_map.into_iter().collect(),
+        }
+    }
+
+    pub fn enum_type(&self) -> &TypeRef {
+        &self.enum_type
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/grammar/token/test.rs
@@ -0,0 +1,1 @@
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/kernel_set.rs
@@ -0,0 +1,41 @@
+use std::collections::VecDeque;
+use std::fmt::Debug;
+use std::hash::Hash;
+use collections::{map, Map};
+
+pub struct KernelSet<K: Kernel> {
+    counter: usize,
+    kernels: VecDeque<K>,
+    map: Map<K, K::Index>,
+}
+
+pub trait Kernel: Clone + Debug + Hash + Eq + PartialOrd + Ord {
+    type Index: Copy + Debug;
+
+    fn index(c: usize) -> Self::Index;
+}
+
+impl<K: Kernel> KernelSet<K> {
+    pub fn new() -> KernelSet<K> {
+        KernelSet {
+            kernels: VecDeque::new(),
+            map: map(),
+            counter: 0,
+        }
+    }
+
+    pub fn add_state(&mut self, kernel: K) -> K::Index {
+        let kernels = &mut self.kernels;
+        let counter = &mut self.counter;
+        *self.map.entry(kernel.clone()).or_insert_with(|| {
+            let index = *counter;
+            *counter += 1;
+            kernels.push_back(kernel);
+            K::index(index)
+        })
+    }
+
+    pub fn next(&mut self) -> Option<K> {
+        self.kernels.pop_front()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/dfa/interpret.rs
@@ -0,0 +1,40 @@
+use lexer::dfa::{Kind, NFAIndex, DFA, START};
+
+pub fn interpret<'text>(dfa: &DFA, input: &'text str) -> Option<(NFAIndex, &'text str)> {
+    let mut longest: Option<(NFAIndex, usize)> = None;
+    let mut state_index = START;
+
+    for (offset, ch) in input.char_indices() {
+        let state = &dfa.states[state_index.0];
+
+        let target = dfa.state(state_index)
+            .test_edges
+            .iter()
+            .filter_map(|&(test, target)| {
+                if test.contains_char(ch) {
+                    Some(target)
+                } else {
+                    None
+                }
+            })
+            .next();
+
+        if let Some(target) = target {
+            state_index = target;
+        } else {
+            state_index = state.other_edge;
+        }
+
+        match dfa.state(state_index).kind {
+            Kind::Accepts(nfa) => {
+                longest = Some((nfa, offset + ch.len_utf8()));
+            }
+            Kind::Reject => {
+                break;
+            }
+            Kind::Neither => {}
+        }
+    }
+
+    longest.map(|(index, offset)| (index, &input[..offset]))
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/dfa/mod.rs
@@ -0,0 +1,326 @@
+//! Constructs a DFA which picks the longest matching regular
+//! expression from the input.
+
+use collections::Set;
+use kernel_set::{Kernel, KernelSet};
+use std::fmt::{Debug, Display, Error, Formatter};
+use std::rc::Rc;
+use lexer::re;
+use lexer::nfa::{self, NFAConstructionError, NFAStateIndex, Test, NFA};
+
+#[cfg(test)]
+mod test;
+
+#[cfg(test)]
+pub mod interpret;
+
+mod overlap;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct DFA {
+    pub states: Vec<State>,
+}
+
+#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub struct Precedence(pub usize);
+
+#[derive(Debug)]
+pub enum DFAConstructionError {
+    NFAConstructionError {
+        index: NFAIndex,
+        error: NFAConstructionError,
+    },
+
+    /// Either of the two regexs listed could match, and they have equal
+    /// priority.
+    Ambiguity { match0: NFAIndex, match1: NFAIndex },
+}
+
+pub fn build_dfa(
+    regexs: &[re::Regex],
+    precedences: &[Precedence],
+) -> Result<DFA, DFAConstructionError> {
+    assert_eq!(regexs.len(), precedences.len());
+    let nfas: Vec<_> = try! {
+        regexs.iter()
+              .enumerate()
+              .map(|(i, r)| match NFA::from_re(r) {
+                  Ok(nfa) => Ok(nfa),
+                  Err(e) => Err(DFAConstructionError::NFAConstructionError {
+                      index: NFAIndex(i),
+                      error: e
+                  }),
+              })
+              .collect()
+    };
+    let builder = DFABuilder {
+        nfas: &nfas,
+        precedences: precedences.to_vec(),
+    };
+    let dfa = try!(builder.build());
+    Ok(dfa)
+}
+
+struct DFABuilder<'nfa> {
+    nfas: &'nfa [NFA],
+    precedences: Vec<Precedence>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct State {
+    item_set: DFAItemSet,
+    pub kind: Kind,
+    pub test_edges: Vec<(Test, DFAStateIndex)>,
+    pub other_edge: DFAStateIndex,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Kind {
+    Accepts(NFAIndex),
+    Reject,
+    Neither,
+}
+
+#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NFAIndex(usize);
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct DFAStateIndex(usize);
+
+type DFAKernelSet = KernelSet<DFAItemSet>;
+
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct DFAItemSet {
+    items: Rc<Vec<Item>>,
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct Item {
+    // which regular expression?
+    nfa_index: NFAIndex,
+
+    // what state within the NFA are we at?
+    nfa_state: NFAStateIndex,
+}
+
+const START: DFAStateIndex = DFAStateIndex(0);
+
+impl<'nfa> DFABuilder<'nfa> {
+    fn build(&self) -> Result<DFA, DFAConstructionError> {
+        let mut kernel_set = KernelSet::new();
+        let mut states = vec![];
+
+        let start_state_index = self.start_state(&mut kernel_set);
+        assert_eq!(start_state_index, START);
+
+        while let Some(item_set) = kernel_set.next() {
+            // collect all the specific tests we expect from any of
+            // the items in this state
+            let tests: Set<Test> = item_set
+                .items
+                .iter()
+                .flat_map(|&item| {
+                    self.nfa(item)
+                        .edges::<Test>(item.nfa_state)
+                        .map(|edge| edge.label)
+                })
+                .collect();
+            let tests = overlap::remove_overlap(&tests);
+
+            // if any NFA is in an accepting state, that makes this
+            // DFA state an accepting state
+            let mut all_accepts: Vec<(Precedence, NFAIndex)> = item_set
+                .items
+                .iter()
+                .cloned()
+                .filter(|&item| self.nfa(item).is_accepting_state(item.nfa_state))
+                .map(|item| (self.precedences[item.nfa_index.0], item.nfa_index))
+                .collect();
+
+            // if all NFAs are in a rejecting state, that makes this
+            // DFA a rejecting state
+            let all_rejects: bool = item_set
+                .items
+                .iter()
+                .all(|&item| self.nfa(item).is_rejecting_state(item.nfa_state));
+
+            let kind = if all_rejects || item_set.items.is_empty() {
+                Kind::Reject
+            } else if all_accepts.len() == 0 {
+                Kind::Neither
+            } else if all_accepts.len() == 1 {
+                // accepts just one NFA, easy case
+                Kind::Accepts(all_accepts[0].1)
+            } else {
+                all_accepts.sort(); // sort regex with higher precedence, well, higher
+                let (best_priority, best_nfa) = all_accepts[all_accepts.len() - 1];
+                let (next_priority, next_nfa) = all_accepts[all_accepts.len() - 2];
+                if best_priority == next_priority {
+                    return Err(DFAConstructionError::Ambiguity {
+                        match0: best_nfa,
+                        match1: next_nfa,
+                    });
+                }
+                Kind::Accepts(best_nfa)
+            };
+
+            // for each specific test, find what happens if we see a
+            // character matching that test
+            let mut test_edges: Vec<(Test, DFAStateIndex)> = tests
+                .iter()
+                .map(|&test| {
+                    let items: Vec<_> = item_set
+                        .items
+                        .iter()
+                        .filter_map(|&item| self.accept_test(item, test))
+                        .collect();
+
+                    // at least one of those items should accept this test
+                    assert!(!items.is_empty());
+
+                    (test, kernel_set.add_state(self.transitive_closure(items)))
+                })
+                .collect();
+
+            test_edges.sort();
+
+            // Consider what there is some character that doesn't meet
+            // any of the tests. In this case, we can just ignore all
+            // the test edges for each of the items and just union all
+            // the "other" edges -- because if it were one of those
+            // test edges, then that transition is represented above.
+            let other_transitions: Vec<_> = item_set
+                .items
+                .iter()
+                .filter_map(|&item| self.accept_other(item))
+                .collect();
+
+            // we never know the full set
+            assert!(item_set.items.is_empty() || !other_transitions.is_empty());
+
+            let other_edge = kernel_set.add_state(self.transitive_closure(other_transitions));
+
+            let state = State {
+                item_set: item_set,
+                kind: kind,
+                test_edges: test_edges,
+                other_edge: other_edge,
+            };
+
+            states.push(state);
+        }
+
+        Ok(DFA { states: states })
+    }
+
+    fn start_state(&self, kernel_set: &mut DFAKernelSet) -> DFAStateIndex {
+        // starting state is at the beginning of all regular expressions
+        let items: Vec<_> = (0..self.nfas.len())
+            .map(|i| Item {
+                nfa_index: NFAIndex(i),
+                nfa_state: nfa::START,
+            })
+            .collect();
+        let item_set = self.transitive_closure(items);
+        kernel_set.add_state(item_set)
+    }
+
+    fn accept_test(&self, item: Item, test: Test) -> Option<Item> {
+        let nfa = self.nfa(item);
+
+        let matching_test = nfa.edges::<Test>(item.nfa_state)
+            .filter(|edge| edge.label.intersects(test))
+            .map(|edge| item.to(edge.to));
+
+        let matching_other = nfa.edges::<nfa::Other>(item.nfa_state)
+            .map(|edge| item.to(edge.to));
+
+        matching_test.chain(matching_other).next()
+    }
+
+    fn accept_other(&self, item: Item) -> Option<Item> {
+        let nfa = self.nfa(item);
+        nfa.edges::<nfa::Other>(item.nfa_state)
+            .map(|edge| item.to(edge.to))
+            .next()
+    }
+
+    fn transitive_closure(&self, mut items: Vec<Item>) -> DFAItemSet {
+        let mut observed: Set<Item> = items.iter().cloned().collect();
+
+        let mut counter = 0;
+        while counter < items.len() {
+            let item = items[counter];
+            let derived_states = self.nfa(item)
+                .edges::<nfa::Noop>(item.nfa_state)
+                .map(|edge| item.to(edge.to))
+                .filter(|&item| observed.insert(item));
+            items.extend(derived_states);
+            counter += 1;
+        }
+
+        items.sort();
+        items.dedup();
+
+        DFAItemSet {
+            items: Rc::new(items),
+        }
+    }
+
+    fn nfa(&self, item: Item) -> &NFA {
+        &self.nfas[item.nfa_index.0]
+    }
+}
+
+impl Kernel for DFAItemSet {
+    type Index = DFAStateIndex;
+
+    fn index(c: usize) -> DFAStateIndex {
+        DFAStateIndex(c)
+    }
+}
+
+impl DFA {
+    fn state(&self, index: DFAStateIndex) -> &State {
+        &self.states[index.0]
+    }
+}
+
+impl Item {
+    fn to(&self, s: NFAStateIndex) -> Item {
+        Item {
+            nfa_index: self.nfa_index,
+            nfa_state: s,
+        }
+    }
+}
+
+impl Debug for DFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "DFA{}", self.0)
+    }
+}
+
+impl Display for DFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Debug::fmt(self, fmt)
+    }
+}
+
+impl NFAIndex {
+    pub fn index(&self) -> usize {
+        self.0
+    }
+}
+
+impl DFAStateIndex {
+    pub fn index(&self) -> usize {
+        self.0
+    }
+}
+
+impl Debug for Item {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({:?}:{:?})", self.nfa_index, self.nfa_state)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/dfa/overlap.rs
@@ -0,0 +1,149 @@
+//! When we are combining two NFAs, we will grab all the outgoing
+//! edges from a set of nodes and wind up with a bunch of potentially
+//! overlapping character ranges like:
+//!
+//!     a-z
+//!     c-l
+//!     0-9
+//!
+//! This module contains code to turn those into non-overlapping ranges like:
+//!
+//!     a-b
+//!     c-l
+//!     m-z
+//!     0-9
+//!
+//! Specifically, we want to ensure that the same set of characters is
+//! covered when we started, and that each of the input ranges is
+//! covered precisely by some set of ranges in the output.
+
+use collections::Set;
+use lexer::nfa::Test;
+use std::cmp;
+
+pub fn remove_overlap(ranges: &Set<Test>) -> Vec<Test> {
+    // We will do this in the dumbest possible way to start. :)
+    // Maintain a result vector that contains disjoint ranges.  To
+    // insert a new range, we walk over this vector and split things
+    // up as we go. This algorithm is so naive as to be exponential, I
+    // think. Sue me.
+
+    let mut disjoint_ranges = vec![];
+
+    for &range in ranges {
+        add_range(range, 0, &mut disjoint_ranges);
+    }
+
+    // the algorithm above leaves some empty ranges in for simplicity;
+    // prune them out.
+    disjoint_ranges.retain(|r| !r.is_empty());
+
+    disjoint_ranges
+}
+
+fn add_range(range: Test, start_index: usize, disjoint_ranges: &mut Vec<Test>) {
+    if range.is_empty() {
+        return;
+    }
+
+    // Find first overlapping range in `disjoint_ranges`, if any.
+    match disjoint_ranges[start_index..]
+        .iter()
+        .position(|r| r.intersects(range))
+    {
+        Some(index) => {
+            let index = index + start_index;
+            let overlapping_range = disjoint_ranges[index];
+
+            // If the range we are trying to add already exists, we're all done.
+            if overlapping_range == range {
+                return;
+            }
+
+            // Otherwise, we want to create three ranges (some of which may
+            // be empty). e.g. imagine one range is `a-z` and the other
+            // is `c-l`, we want `a-b`, `c-l`, and `m-z`.
+            let min_min = cmp::min(range.start, overlapping_range.start);
+            let mid_min = cmp::max(range.start, overlapping_range.start);
+            let mid_max = cmp::min(range.end, overlapping_range.end);
+            let max_max = cmp::max(range.end, overlapping_range.end);
+            let low_range = Test {
+                start: min_min,
+                end: mid_min,
+            };
+            let mid_range = Test {
+                start: mid_min,
+                end: mid_max,
+            };
+            let max_range = Test {
+                start: mid_max,
+                end: max_max,
+            };
+
+            assert!(low_range.is_disjoint(mid_range));
+            assert!(low_range.is_disjoint(max_range));
+            assert!(mid_range.is_disjoint(max_range));
+
+            // Replace the existing range with the low range, and then
+            // add the mid and max ranges in. (The low range may be
+            // empty, but we'll prune that out later.)
+            disjoint_ranges[index] = low_range;
+            add_range(mid_range, index + 1, disjoint_ranges);
+            add_range(max_range, index + 1, disjoint_ranges);
+        }
+
+        None => {
+            // no overlap -- easy case.
+            disjoint_ranges.push(range);
+        }
+    }
+}
+
+#[cfg(test)]
+macro_rules! test {
+    ($($range:expr,)*) => {
+        {
+            use collections::set;
+            use lexer::nfa::Test;
+            use std::char;
+            let mut s = set();
+            $({ let r = $range; s.insert(Test::exclusive_range(r.start, r.end)); })*
+            remove_overlap(&s).into_iter()
+                              .map(|r|
+                                   char::from_u32(r.start).unwrap() ..
+                                   char::from_u32(r.end).unwrap())
+                              .collect::<Vec<_>>()
+        }
+    }
+}
+
+#[test]
+fn alphabet() {
+    let result = test! {
+        'a' .. 'z',
+        'c' .. 'l',
+        '0' .. '9',
+    };
+    assert_eq!(result, vec!['0'..'9', 'a'..'c', 'c'..'l', 'l'..'z']);
+}
+
+#[test]
+fn repeat() {
+    let result = test! {
+        'a' .. 'z',
+        'c' .. 'l',
+        'l' .. 'z',
+        '0' .. '9',
+    };
+    assert_eq!(result, vec!['0'..'9', 'a'..'c', 'c'..'l', 'l'..'z']);
+}
+
+#[test]
+fn stagger() {
+    let result = test! {
+        '0' .. '3',
+        '2' .. '4',
+        '3' .. '5',
+    };
+    assert_eq!(result, vec!['0'..'2', '2'..'3', '3'..'4', '4'..'5']);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/dfa/test.rs
@@ -0,0 +1,76 @@
+use lexer::dfa::{self, DFAConstructionError, NFAIndex, Precedence, DFA};
+use lexer::dfa::interpret::interpret;
+use lexer::re;
+
+pub fn dfa(inputs: &[(&str, Precedence)]) -> Result<DFA, DFAConstructionError> {
+    let regexs: Result<Vec<_>, _> = inputs.iter().map(|&(s, _)| re::parse_regex(s)).collect();
+    let regexs = match regexs {
+        Ok(rs) => rs,
+        Err(_) => panic!("unexpected parse error"),
+    };
+    let precedences: Vec<_> = inputs.iter().map(|&(_, p)| p).collect();
+    dfa::build_dfa(&regexs, &precedences)
+}
+
+const P1: Precedence = Precedence(1);
+const P0: Precedence = Precedence(0);
+
+#[test]
+fn tokenizer() {
+    let dfa = dfa(&[
+        /* 0 */ (r#"class"#, P1),
+        /* 1 */ (r#"[a-zA-Z_][a-zA-Z0-9_]*"#, P0),
+        /* 2 */ (r#"[0-9]+"#, P0),
+        /* 3 */ (r#" +"#, P0),
+        /* 4 */ (r#">>"#, P0),
+        /* 5 */ (r#">"#, P0),
+    ]).unwrap();
+
+    assert_eq!(interpret(&dfa, "class Foo"), Some((NFAIndex(0), "class")));
+    assert_eq!(interpret(&dfa, "classz Foo"), Some((NFAIndex(1), "classz")));
+    assert_eq!(interpret(&dfa, "123"), Some((NFAIndex(2), "123")));
+    assert_eq!(interpret(&dfa, "  classz Foo"), Some((NFAIndex(3), "  ")));
+    assert_eq!(interpret(&dfa, ">"), Some((NFAIndex(5), ">")));
+    assert_eq!(interpret(&dfa, ">>"), Some((NFAIndex(4), ">>")));
+}
+
+#[test]
+fn ambiguous_regex() {
+    // here the keyword and the regex have same precedence, so we have
+    // an ambiguity
+    assert!(dfa(&[(r#"class"#, P0), (r#"[a-zA-Z_][a-zA-Z0-9_]*"#, P0)]).is_err());
+}
+
+#[test]
+fn issue_32() {
+    assert!(dfa(&[(r#"."#, P0)]).is_ok());
+}
+
+#[test]
+fn issue_35() {
+    assert!(dfa(&[(r#".*"#, P0), (r"[-+]?[0-9]*\.?[0-9]+", P0)]).is_err());
+}
+
+#[test]
+fn alternatives() {
+    let dfa = dfa(&[(r#"abc|abd"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abd"), Some((NFAIndex(0), "abd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
+
+#[test]
+fn alternatives_extension() {
+    let dfa = dfa(&[(r#"abc|abcd"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abcd"), Some((NFAIndex(0), "abcd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
+
+#[test]
+fn alternatives_contraction() {
+    let dfa = dfa(&[(r#"abcd|abc"#, P0)]).unwrap();
+    assert_eq!(interpret(&dfa, "abc"), Some((NFAIndex(0), "abc")));
+    assert_eq!(interpret(&dfa, "abcd"), Some((NFAIndex(0), "abcd")));
+    assert_eq!(interpret(&dfa, "123"), None);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/intern_token/mod.rs
@@ -0,0 +1,293 @@
+/*!
+
+Generates an iterator type `Matcher` that looks roughly like
+
+```ignore
+mod intern_token {
+    extern crate regex as regex;
+
+    #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+    pub struct Token<'input>(pub usize, pub &'input str);
+    //                           ~~~~~~     ~~~~~~~~~~~
+    //                           token      token
+    //                           index      text
+    //                           (type)
+
+    impl<'a> fmt::Display for Token<'a> { ... }
+
+    pub struct MatcherBuilder {
+        regex_set: regex::RegexSet,
+        regex_vec: Vec<regex::Regex>,
+    }
+
+    impl MatcherBuilder {
+        fn new() -> MatchBuilder { ... }
+        fn matcher<'input, 'builder>(&'builder self, s: &'input str) -> Matcher<'input, 'builder> { ... }
+    }
+
+    pub struct Matcher<'input, 'builder> {
+        text: &'input str,
+        consumed: usize,
+        regex_set: &'builder regex::RegexSet,
+        regex_vec: &'builder Vec<regex::Regex>,
+    }
+
+    impl Matcher<'input> {
+        fn tokenize(&self, text: &str) -> Option<(usize, usize)> { ... }
+    }
+
+    impl<'input> Iterator for Matcher<'input> {
+        type Item = Result<(usize, Token<'input>, usize), ParseError>;
+        //                  ~~~~~  ~~~~~~~~~~~~~  ~~~~~
+        //                  start  token          end
+    }
+}
+```
+
+ */
+
+use lexer::re;
+use grammar::parse_tree::InternToken;
+use grammar::repr::{Grammar, TerminalLiteral};
+use rust::RustWrite;
+use std::io::{self, Write};
+
+pub fn compile<W: Write>(
+    grammar: &Grammar,
+    intern_token: &InternToken,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let prefix = &grammar.prefix;
+
+    rust!(out, "#[cfg_attr(rustfmt, rustfmt_skip)]");
+    rust!(out, "mod {}intern_token {{", prefix);
+    rust!(out, "#![allow(unused_imports)]");
+    try!(out.write_uses("", &grammar));
+    rust!(out, "extern crate regex as {}regex;", prefix);
+    rust!(out, "use std::fmt as {}fmt;", prefix);
+    rust!(out, "");
+    rust!(
+        out,
+        "#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]"
+    );
+    rust!(out, "pub struct Token<'input>(pub usize, pub &'input str);");
+    rust!(out, "impl<'a> {}fmt::Display for Token<'a> {{", prefix);
+    rust!(
+        out,
+        "fn fmt(&self, formatter: &mut {}fmt::Formatter) -> Result<(), {}fmt::Error> {{",
+        prefix,
+        prefix
+    );
+    rust!(out, "{}fmt::Display::fmt(self.1, formatter)", prefix);
+    rust!(out, "}}");
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(out, "pub struct {}MatcherBuilder {{", prefix);
+    rust!(out, "regex_set: {}regex::RegexSet,", prefix);
+    rust!(out, "regex_vec: Vec<{}regex::Regex>,", prefix);
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(out, "impl {}MatcherBuilder {{", prefix);
+    rust!(out, "pub fn new() -> {}MatcherBuilder {{", prefix);
+
+    // create a vector of rust string literals with the text of each
+    // regular expression
+    let regex_strings: Vec<String> = {
+        intern_token
+            .match_entries
+            .iter()
+            .map(|match_entry| match match_entry.match_literal {
+                TerminalLiteral::Quoted(ref s) => re::parse_literal(&s),
+                TerminalLiteral::Regex(ref s) => re::parse_regex(&s).unwrap(),
+            })
+            .map(|regex| {
+                // make sure all regex are anchored at the beginning of the input
+                format!("^({})", regex)
+            })
+            .map(|regex_str| {
+                // create a rust string with text of the regex; the Debug impl
+                // will add quotes and escape
+                format!("{:?}", regex_str)
+            })
+            .collect()
+    };
+
+    rust!(out, "let {}strs: &[&str] = &[", prefix);
+    for literal in &regex_strings {
+        rust!(out, "{},", literal);
+    }
+    rust!(out, "];");
+    rust!(
+        out,
+        "let {}regex_set = {}regex::RegexSet::new({}strs).unwrap();",
+        prefix,
+        prefix,
+        prefix
+    );
+
+    rust!(out, "let {}regex_vec = vec![", prefix);
+    for literal in &regex_strings {
+        rust!(out, "{}regex::Regex::new({}).unwrap(),", prefix, literal);
+    }
+    rust!(out, "];");
+
+    rust!(
+        out,
+        "{0}MatcherBuilder {{ regex_set: {0}regex_set, regex_vec: {0}regex_vec }}",
+        prefix
+    );
+    rust!(out, "}}"); // fn new()
+    rust!(
+        out,
+        "pub fn matcher<'input, 'builder>(&'builder self, s: &'input str) \
+         -> {}Matcher<'input, 'builder> {{",
+        prefix
+    );
+    rust!(out, "{}Matcher {{", prefix);
+    rust!(out, "text: s,");
+    rust!(out, "consumed: 0,");
+    rust!(out, "regex_set: &self.regex_set,");
+    rust!(out, "regex_vec: &self.regex_vec,");
+    rust!(out, "}}"); // struct literal
+    rust!(out, "}}"); // fn matcher()
+    rust!(out, "}}"); // impl MatcherBuilder
+    rust!(out, "");
+    rust!(out, "pub struct {}Matcher<'input, 'builder> {{", prefix);
+    rust!(out, "text: &'input str,"); // remaining input
+    rust!(out, "consumed: usize,"); // number of chars consumed thus far
+    rust!(out, "regex_set: &'builder {}regex::RegexSet,", prefix);
+    rust!(out, "regex_vec: &'builder Vec<{}regex::Regex>,", prefix);
+    rust!(out, "}}");
+    rust!(out, "");
+    rust!(
+        out,
+        "impl<'input, 'builder> Iterator for {}Matcher<'input, 'builder> {{",
+        prefix
+    );
+    rust!(
+        out,
+        "type Item = Result<(usize, Token<'input>, usize), \
+         {}lalrpop_util::ParseError<usize,Token<'input>,{}>>;",
+        prefix,
+        grammar.types.error_type()
+    );
+    rust!(out, "");
+    rust!(out, "fn next(&mut self) -> Option<Self::Item> {{");
+
+    // start by trimming whitespace from left
+    rust!(out, "let {}text = self.text.trim_left();", prefix);
+    rust!(
+        out,
+        "let {}whitespace = self.text.len() - {}text.len();",
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}start_offset = self.consumed + {}whitespace;",
+        prefix,
+        prefix
+    );
+
+    // if nothing left, return None
+    rust!(out, "if {}text.is_empty() {{", prefix);
+    rust!(out, "self.text = {}text;", prefix);
+    rust!(out, "self.consumed = {}start_offset;", prefix);
+    rust!(out, "None");
+    rust!(out, "}} else {{");
+
+    // otherwise, use regex-set to find list of matching tokens
+    rust!(
+        out,
+        "let {}matches = self.regex_set.matches({}text);",
+        prefix,
+        prefix
+    );
+
+    // if nothing matched, return an error
+    rust!(out, "if !{}matches.matched_any() {{", prefix);
+    rust!(
+        out,
+        "Some(Err({}lalrpop_util::ParseError::InvalidToken {{",
+        prefix
+    );
+    rust!(out, "location: {}start_offset,", prefix);
+    rust!(out, "}}))");
+    rust!(out, "}} else {{");
+
+    // otherwise, have to find longest, highest-priority match. We have the literals
+    // sorted in order of increasing precedence, so we'll iterate over them one by one,
+    // checking if each one matches, and remembering the longest one.
+    rust!(out, "let mut {}longest_match = 0;", prefix); // length of longest match
+    rust!(out, "let mut {}index = 0;", prefix); // index of longest match
+    rust!(
+        out,
+        "for {}i in 0 .. {} {{",
+        prefix,
+        intern_token.match_entries.len()
+    );
+    rust!(out, "if {}matches.matched({}i) {{", prefix, prefix);
+
+    // re-run the regex to find out how long this particular match
+    // was, then compare that against the longest-match so far. Note
+    // that the order of the tuple is carefully constructed to ensure
+    // that (a) we get the longest-match but (b) if two matches are
+    // equal, we get the largest index. This is because the indices
+    // are sorted in order of increasing priority, and because we know
+    // that indices of equal priority cannot both match (because of
+    // the DFA check).
+    rust!(
+        out,
+        "let {}match = self.regex_vec[{}i].find({}text).unwrap();",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(out, "let {}len = {}match.end();", prefix, prefix);
+    rust!(out, "if {}len >= {}longest_match {{", prefix, prefix);
+    rust!(out, "{}longest_match = {}len;", prefix, prefix);
+    rust!(out, "{}index = {}i;", prefix, prefix);
+    rust!(out, "}}"); // if is longest match
+    rust!(out, "}}"); // if matches.matched(i)
+    rust!(out, "}}"); // for loop
+
+    // transform the result into the expected return value
+    rust!(
+        out,
+        "let {}result = &{}text[..{}longest_match];",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}remaining = &{}text[{}longest_match..];",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(
+        out,
+        "let {}end_offset = {}start_offset + {}longest_match;",
+        prefix,
+        prefix,
+        prefix
+    );
+    rust!(out, "self.text = {}remaining;", prefix);
+    rust!(out, "self.consumed = {}end_offset;", prefix);
+    rust!(
+        out,
+        "Some(Ok(({}start_offset, Token({}index, {}result), {}end_offset)))",
+        prefix,
+        prefix,
+        prefix,
+        prefix
+    );
+
+    rust!(out, "}}"); // else
+    rust!(out, "}}"); // else
+    rust!(out, "}}"); // fn
+    rust!(out, "}}"); // impl
+    rust!(out, "}}"); // mod
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/mod.rs
@@ -0,0 +1,8 @@
+//! Code related to generating tokenizers.
+
+#![allow(dead_code)] // not yet fully activated
+
+pub mod dfa;
+pub mod intern_token;
+pub mod re;
+pub mod nfa;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/nfa/interpret.rs
@@ -0,0 +1,72 @@
+//! A depth-first interpreter for NFAs.
+
+use lexer::nfa::{NFAStateIndex, Noop, Other, StateKind, Test, NFA, START};
+use std::cmp::max;
+
+/// Interpret `nfa` applied to `test`, returning the longest matching
+/// string that we can find (if any).
+pub fn interpret<'text>(nfa: &NFA, text: &'text str) -> Option<&'text str> {
+    let mut longest: Option<usize> = None;
+    let mut stack: Vec<(NFAStateIndex, usize)> = vec![(START, 0)];
+
+    while let Some((state, offset)) = stack.pop() {
+        match nfa.kind(state) {
+            StateKind::Accept => match longest {
+                None => longest = Some(offset),
+                Some(o) => longest = Some(max(o, offset)),
+            },
+            StateKind::Reject => {
+                // the rejection state is a dead-end
+                continue;
+            }
+            StateKind::Neither => {}
+        }
+
+        // transition the no-op edges, to start
+        for edge in nfa.edges::<Noop>(state) {
+            push(&mut stack, (edge.to, offset));
+        }
+
+        // check whether there is another character
+        let ch = match text[offset..].chars().next() {
+            Some(ch) => ch, // yep
+            None => {
+                continue;
+            } // nope
+        };
+
+        let offset1 = offset + ch.len_utf8();
+
+        // transition test edges
+        let mut tests = 0;
+        for edge in nfa.edges::<Test>(state) {
+            if edge.label.contains_char(ch) {
+                push(&mut stack, (edge.to, offset1));
+                tests += 1;
+            }
+        }
+
+        // should *never* match more than one test, because tests
+        // ought to be disjoint
+        assert!(tests <= 1);
+
+        // if no tests passed, use the "Other" edge
+        if tests == 0 {
+            for edge in nfa.edges::<Other>(state) {
+                push(&mut stack, (edge.to, offset1));
+                tests += 1;
+            }
+
+            // should *never* have more than one "otherwise" edge
+            assert!(tests <= 1);
+        }
+    }
+
+    longest.map(|offset| &text[..offset])
+}
+
+fn push<T: Eq>(v: &mut Vec<T>, t: T) {
+    if !v.contains(&t) {
+        v.push(t);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/nfa/mod.rs
@@ -0,0 +1,637 @@
+//! The NFA we construct for each regex. Since the states are not
+//! really of interest, we represent this just as a vector of labeled
+//! edges.
+
+use lexer::re::Regex;
+use regex_syntax::{ClassRange, Expr, Repeater};
+use std::char;
+use std::fmt::{Debug, Error as FmtError, Formatter};
+use std::usize;
+
+#[cfg(test)]
+mod interpret;
+
+#[cfg(test)]
+mod test;
+
+#[derive(Debug)]
+pub struct NFA {
+    states: Vec<State>,
+    edges: Edges,
+}
+
+/// An edge label representing a range of characters, inclusive. Note
+/// that this range may contain some endpoints that are not valid
+/// unicode, hence we store u32.
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Test {
+    pub start: u32,
+    pub end: u32,
+}
+
+/// An "epsilon" edge -- no input
+#[derive(Debug, PartialEq, Eq)]
+pub struct Noop;
+
+/// An "other" edge -- fallback if no other edges apply
+#[derive(Debug, PartialEq, Eq)]
+pub struct Other;
+
+/// For each state, we just store the indices of the first char and
+/// test edges, or usize::MAX if no such edge. You can then find all
+/// edges by enumerating subsequent edges in the vectors until you
+/// find one with a different `from` value.
+#[derive(Debug)]
+pub struct State {
+    kind: StateKind,
+    first_noop_edge: usize,
+    first_test_edge: usize,
+    first_other_edge: usize,
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum StateKind {
+    Accept,
+    Reject,
+    Neither,
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct NFAStateIndex(usize);
+
+/// A set of edges for the state machine. Edges are kept sorted by the
+/// type of label they have. Within a vector, all edges with the same
+/// `from` are grouped together so they can be enumerated later (for
+/// now we just ensure this during construction, but one could easily
+/// sort).
+#[derive(Debug)]
+pub struct Edges {
+    noop_edges: Vec<Edge<Noop>>,
+
+    // edges where we are testing the character in some way; for any
+    // given state, there should not be multiple edges with the same
+    // test
+    test_edges: Vec<Edge<Test>>,
+
+    // fallback rules if no test_edge applies
+    other_edges: Vec<Edge<Other>>,
+}
+
+#[derive(PartialEq, Eq)]
+pub struct Edge<L> {
+    pub from: NFAStateIndex,
+    pub label: L,
+    pub to: NFAStateIndex,
+}
+
+pub const ACCEPT: NFAStateIndex = NFAStateIndex(0);
+pub const REJECT: NFAStateIndex = NFAStateIndex(1);
+pub const START: NFAStateIndex = NFAStateIndex(2);
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum NFAConstructionError {
+    NamedCaptures,
+    NonGreedy,
+    WordBoundary,
+    LineBoundary,
+    TextBoundary,
+    ByteRegex,
+}
+
+impl NFA {
+    pub fn from_re(regex: &Regex) -> Result<NFA, NFAConstructionError> {
+        let mut nfa = NFA::new();
+        let s0 = try!(nfa.expr(regex, ACCEPT, REJECT));
+        nfa.push_edge(START, Noop, s0);
+        Ok(nfa)
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Public methods for querying an NFA
+
+    pub fn edges<L: EdgeLabel>(&self, from: NFAStateIndex) -> EdgeIterator<L> {
+        let vec = L::vec(&self.edges);
+        let first = *L::first(&self.states[from.0]);
+        EdgeIterator {
+            edges: vec,
+            from: from,
+            index: first,
+        }
+    }
+
+    pub fn kind(&self, from: NFAStateIndex) -> StateKind {
+        self.states[from.0].kind
+    }
+
+    pub fn is_accepting_state(&self, from: NFAStateIndex) -> bool {
+        self.states[from.0].kind == StateKind::Accept
+    }
+
+    pub fn is_rejecting_state(&self, from: NFAStateIndex) -> bool {
+        self.states[from.0].kind == StateKind::Reject
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Private methods for building an NFA
+
+    fn new() -> NFA {
+        let mut nfa = NFA {
+            states: vec![],
+            edges: Edges {
+                noop_edges: vec![],
+                test_edges: vec![],
+                other_edges: vec![],
+            },
+        };
+
+        // reserve the ACCEPT, REJECT, and START states ahead of time
+        assert!(nfa.new_state(StateKind::Accept) == ACCEPT);
+        assert!(nfa.new_state(StateKind::Reject) == REJECT);
+        assert!(nfa.new_state(StateKind::Neither) == START);
+
+        // the ACCEPT state, given another token, becomes a REJECT
+        nfa.push_edge(ACCEPT, Other, REJECT);
+
+        // the REJECT state loops back to itself no matter what
+        nfa.push_edge(REJECT, Other, REJECT);
+
+        nfa
+    }
+
+    fn new_state(&mut self, kind: StateKind) -> NFAStateIndex {
+        let index = self.states.len();
+
+        // these edge indices will be patched later by patch_edges()
+        self.states.push(State {
+            kind: kind,
+            first_noop_edge: usize::MAX,
+            first_test_edge: usize::MAX,
+            first_other_edge: usize::MAX,
+        });
+
+        NFAStateIndex(index)
+    }
+
+    // pushes an edge: note that all outgoing edges from a particular
+    // state should be pushed together, so that the edge vectors are
+    // suitably sorted
+    fn push_edge<L: EdgeLabel>(&mut self, from: NFAStateIndex, label: L, to: NFAStateIndex) {
+        let edge_vec = L::vec_mut(&mut self.edges);
+        let edge_index = edge_vec.len();
+        edge_vec.push(Edge {
+            from: from,
+            label: label,
+            to: to,
+        });
+
+        // if this is the first edge from the `from` state, set the
+        // index
+        let first_index = L::first_mut(&mut self.states[from.0]);
+        if *first_index == usize::MAX {
+            *first_index = edge_index;
+        } else {
+            // otherwise, check that all edges are continuous
+            assert_eq!(edge_vec[edge_index - 1].from, from);
+        }
+    }
+
+    fn expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        match *expr {
+            Expr::Empty => Ok(accept),
+
+            Expr::Literal { ref chars, casei } => {
+                // for e.g. "abc":
+                // [s0] -a-> [ ] -b-> [ ] -c-> [accept]
+                //   |        |        |
+                //   +--------+--------+--otherwise-> [reject]
+
+                Ok(if casei {
+                    chars.iter().rev().fold(accept, |s, &ch| {
+                        let s1 = self.new_state(StateKind::Neither);
+                        for ch1 in ch.to_lowercase().chain(ch.to_uppercase()) {
+                            self.push_edge(s1, Test::char(ch1), s);
+                        }
+                        self.push_edge(s1, Other, reject);
+                        s1
+                    })
+                } else {
+                    chars.iter().rev().fold(accept, |s, &ch| {
+                        let s1 = self.new_state(StateKind::Neither);
+                        self.push_edge(s1, Test::char(ch), s);
+                        self.push_edge(s1, Other, reject);
+                        s1
+                    })
+                })
+            }
+
+            Expr::AnyCharNoNL => {
+                // [s0] -otherwise-> [accept]
+                //   |
+                // '\n' etc
+                //   |
+                //   v
+                // [reject]
+
+                let s0 = self.new_state(StateKind::Neither);
+                for nl_char in "\n\r".chars() {
+                    self.push_edge(s0, Test::char(nl_char), reject);
+                }
+                self.push_edge(s0, Other, accept);
+                Ok(s0)
+            }
+
+            Expr::AnyChar => {
+                // [s0] -otherwise-> [accept]
+
+                let s0 = self.new_state(StateKind::Neither);
+                self.push_edge(s0, Other, accept);
+                Ok(s0)
+            }
+
+            Expr::Class(ref class) => {
+                // [s0] --c0--> [accept]
+                //  | |            ^
+                //  | |   ...      |
+                //  | |            |
+                //  | +---cn-------+
+                //  +---------------> [reject]
+
+                let s0 = self.new_state(StateKind::Neither);
+                for &range in class {
+                    let test: Test = range.into();
+                    self.push_edge(s0, test, accept);
+                }
+                self.push_edge(s0, Other, reject);
+                Ok(s0)
+            }
+
+            // currently we don't support any boundaries because
+            // I was too lazy to code them up or think about them
+            Expr::StartLine | Expr::EndLine => Err(NFAConstructionError::LineBoundary),
+
+            Expr::StartText | Expr::EndText => Err(NFAConstructionError::TextBoundary),
+
+            Expr::WordBoundaryAscii
+            | Expr::NotWordBoundaryAscii
+            | Expr::WordBoundary
+            | Expr::NotWordBoundary => Err(NFAConstructionError::WordBoundary),
+
+            // currently we treat all groups the same, whether they
+            // capture or not; but we don't permit named groups,
+            // in case we want to give them significance in the future
+            Expr::Group {
+                ref e,
+                i: _,
+                name: None,
+            } => self.expr(e, accept, reject),
+            Expr::Group { name: Some(_), .. } => Err(NFAConstructionError::NamedCaptures),
+
+            // currently we always report the longest match possible
+            Expr::Repeat { greedy: false, .. } => Err(NFAConstructionError::NonGreedy),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::ZeroOrOne,
+                greedy: true,
+            } => self.optional_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::ZeroOrMore,
+                greedy: true,
+            } => self.star_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::OneOrMore,
+                greedy: true,
+            } => self.plus_expr(e, accept, reject),
+
+            Expr::Repeat {
+                ref e,
+                r: Repeater::Range { min, max: None },
+                greedy: true,
+            } => {
+                // +---min times----+
+                // |                |
+                //
+                // [s0] --..e..-- [s1] --..e*..--> [accept]
+                //          |      |
+                //          |      v
+                //          +-> [reject]
+
+                let mut s = try!(self.star_expr(e, accept, reject));
+                for _ in 0..min {
+                    s = try!(self.expr(e, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Repeat {
+                ref e,
+                r:
+                    Repeater::Range {
+                        min,
+                        max: Some(max),
+                    },
+                greedy: true,
+            } => {
+                let mut s = accept;
+                for _ in min..max {
+                    s = try!(self.optional_expr(e, s, reject));
+                }
+                for _ in 0..min {
+                    s = try!(self.expr(e, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Concat(ref exprs) => {
+                let mut s = accept;
+                for expr in exprs.iter().rev() {
+                    s = try!(self.expr(expr, s, reject));
+                }
+                Ok(s)
+            }
+
+            Expr::Alternate(ref exprs) => {
+                // [s0] --exprs[0]--> [accept/reject]
+                //   |                   ^
+                //   |                   |
+                //   +----exprs[..]------+
+                //   |                   |
+                //   |                   |
+                //   +----exprs[n-1]-----+
+
+                let s0 = self.new_state(StateKind::Neither);
+                let targets: Vec<_> = try!(
+                    exprs
+                        .iter()
+                        .map(|expr| self.expr(expr, accept, reject))
+                        .collect()
+                );
+
+                // push edges from s0 all together so they are
+                // adjacant in the edge array
+                for target in targets {
+                    self.push_edge(s0, Noop, target);
+                }
+                Ok(s0)
+            }
+
+            // If we ever support byte regexs, these
+            // can be merged in with the cases above.
+            Expr::AnyByte | Expr::AnyByteNoNL | Expr::ClassBytes(_) | Expr::LiteralBytes { .. } => {
+                Err(NFAConstructionError::ByteRegex)
+            }
+        }
+    }
+
+    fn optional_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        // [s0] ----> [accept]
+        //   |           ^
+        //   v           |
+        // [s1] --...----+
+        //         |
+        //         v
+        //      [reject]
+
+        let s1 = try!(self.expr(expr, accept, reject));
+
+        let s0 = self.new_state(StateKind::Neither);
+        self.push_edge(s0, Noop, accept); // they might supply nothing
+        self.push_edge(s0, Noop, s1);
+
+        Ok(s0)
+    }
+
+    fn star_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        // [s0] ----> [accept]
+        //  | ^
+        //  | |
+        //  | +----------+
+        //  v            |
+        // [s1] --...----+
+        //         |
+        //         v
+        //      [reject]
+
+        let s0 = self.new_state(StateKind::Neither);
+
+        let s1 = try!(self.expr(expr, s0, reject));
+
+        self.push_edge(s0, Noop, accept);
+        self.push_edge(s0, Noop, s1);
+
+        Ok(s0)
+    }
+
+    fn plus_expr(
+        &mut self,
+        expr: &Expr,
+        accept: NFAStateIndex,
+        reject: NFAStateIndex,
+    ) -> Result<NFAStateIndex, NFAConstructionError> {
+        //            [accept]
+        //               ^
+        //               |
+        //    +----------+
+        //    v          |
+        // [s0] --...--[s1]
+        //         |
+        //         v
+        //      [reject]
+
+        let s1 = self.new_state(StateKind::Neither);
+
+        let s0 = try!(self.expr(expr, s1, reject));
+
+        self.push_edge(s1, Noop, accept);
+        self.push_edge(s1, Noop, s0);
+
+        Ok(s0)
+    }
+}
+
+pub trait EdgeLabel: Sized {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Self>>;
+    fn vec(nfa: &Edges) -> &Vec<Edge<Self>>;
+    fn first_mut(state: &mut State) -> &mut usize;
+    fn first(state: &State) -> &usize;
+}
+
+impl EdgeLabel for Noop {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Noop>> {
+        &mut nfa.noop_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_noop_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Noop>> {
+        &nfa.noop_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_noop_edge
+    }
+}
+
+impl EdgeLabel for Other {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Other>> {
+        &mut nfa.other_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_other_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Other>> {
+        &nfa.other_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_other_edge
+    }
+}
+
+impl EdgeLabel for Test {
+    fn vec_mut(nfa: &mut Edges) -> &mut Vec<Edge<Test>> {
+        &mut nfa.test_edges
+    }
+    fn first_mut(state: &mut State) -> &mut usize {
+        &mut state.first_test_edge
+    }
+    fn vec(nfa: &Edges) -> &Vec<Edge<Test>> {
+        &nfa.test_edges
+    }
+    fn first(state: &State) -> &usize {
+        &state.first_test_edge
+    }
+}
+
+pub struct EdgeIterator<'nfa, L: EdgeLabel + 'nfa> {
+    edges: &'nfa [Edge<L>],
+    from: NFAStateIndex,
+    index: usize,
+}
+
+impl<'nfa, L: EdgeLabel> Iterator for EdgeIterator<'nfa, L> {
+    type Item = &'nfa Edge<L>;
+
+    fn next(&mut self) -> Option<&'nfa Edge<L>> {
+        let index = self.index;
+        if index == usize::MAX {
+            return None;
+        }
+
+        let next_index = index + 1;
+        if next_index >= self.edges.len() || self.edges[next_index].from != self.from {
+            self.index = usize::MAX;
+        } else {
+            self.index = next_index;
+        }
+
+        Some(&self.edges[index])
+    }
+}
+
+impl Test {
+    pub fn char(c: char) -> Test {
+        let c = c as u32;
+        Test {
+            start: c,
+            end: c + 1,
+        }
+    }
+
+    pub fn inclusive_range(s: char, e: char) -> Test {
+        Test {
+            start: s as u32,
+            end: e as u32 + 1,
+        }
+    }
+
+    pub fn exclusive_range(s: char, e: char) -> Test {
+        Test {
+            start: s as u32,
+            end: e as u32,
+        }
+    }
+
+    pub fn is_char(self) -> bool {
+        self.len() == 1
+    }
+
+    pub fn len(self) -> u32 {
+        self.end - self.start
+    }
+
+    pub fn contains_u32(self, c: u32) -> bool {
+        c >= self.start && c < self.end
+    }
+
+    pub fn contains_char(self, c: char) -> bool {
+        self.contains_u32(c as u32)
+    }
+
+    pub fn intersects(self, r: Test) -> bool {
+        !self.is_empty() && !r.is_empty()
+            && (self.contains_u32(r.start) || r.contains_u32(self.start))
+    }
+
+    pub fn is_disjoint(self, r: Test) -> bool {
+        !self.intersects(r)
+    }
+
+    pub fn is_empty(self) -> bool {
+        self.start == self.end
+    }
+}
+
+impl From<ClassRange> for Test {
+    fn from(range: ClassRange) -> Test {
+        Test::inclusive_range(range.start, range.end)
+    }
+}
+
+impl Debug for Test {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        match (char::from_u32(self.start), char::from_u32(self.end)) {
+            (Some(start), Some(end)) => {
+                if self.is_char() {
+                    if ".[]()?+*!".contains(start) {
+                        write!(fmt, "\\{}", start)
+                    } else {
+                        write!(fmt, "{}", start)
+                    }
+                } else {
+                    write!(fmt, "[{:?}..{:?}]", start, end)
+                }
+            }
+            _ => write!(fmt, "[{:?}..{:?}]", self.start, self.end),
+        }
+    }
+}
+
+impl Debug for NFAStateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        write!(fmt, "NFA{}", self.0)
+    }
+}
+
+impl<L: Debug> Debug for Edge<L> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
+        write!(fmt, "{:?} -{:?}-> {:?}", self.from, self.label, self.to)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/nfa/test.rs
@@ -0,0 +1,159 @@
+use lexer::nfa::{NFAConstructionError, Noop, Other, StateKind, Test, NFA};
+use lexer::nfa::interpret::interpret;
+use lexer::re;
+
+#[test]
+fn edge_iter() {
+    let mut nfa = NFA::new();
+    let s0 = nfa.new_state(StateKind::Neither);
+    let s1 = nfa.new_state(StateKind::Neither);
+    let s2 = nfa.new_state(StateKind::Neither);
+    let s3 = nfa.new_state(StateKind::Neither);
+
+    nfa.push_edge(s2, Noop, s3);
+    nfa.push_edge(s0, Noop, s1);
+    nfa.push_edge(s0, Noop, s3);
+    nfa.push_edge(s1, Noop, s2);
+
+    // check that if we mixed up the indies between Noop/Other, we'd get wrong thing here
+    nfa.push_edge(s0, Other, s2);
+
+    let s0_edges: Vec<_> = nfa.edges::<Noop>(s0).map(|e| e.to).collect();
+    let s1_edges: Vec<_> = nfa.edges::<Noop>(s1).map(|e| e.to).collect();
+    let s2_edges: Vec<_> = nfa.edges::<Noop>(s2).map(|e| e.to).collect();
+    let s3_edges: Vec<_> = nfa.edges::<Noop>(s3).map(|e| e.to).collect();
+
+    let s0_other_edges: Vec<_> = nfa.edges::<Other>(s0).map(|e| e.to).collect();
+    let s0_test_edges: Vec<_> = nfa.edges::<Test>(s0).map(|e| e.to).collect();
+
+    assert_eq!(s0_edges, &[s1, s3]);
+    assert_eq!(s1_edges, &[s2]);
+    assert_eq!(s2_edges, &[s3]);
+    assert_eq!(s3_edges, &[]);
+
+    assert_eq!(s0_other_edges, &[s2]);
+    assert_eq!(s0_test_edges, &[]);
+}
+
+#[test]
+fn identifier_regex() {
+    let ident = re::parse_regex(r#"[a-zA-Z_][a-zA-Z0-9_]*"#).unwrap();
+    println!("{:#?}", ident);
+    let nfa = NFA::from_re(&ident).unwrap();
+    println!("{:#?}", nfa);
+    assert_eq!(interpret(&nfa, "0123"), None);
+    assert_eq!(interpret(&nfa, "hello0123"), Some("hello0123"));
+    assert_eq!(interpret(&nfa, "hello0123 abc"), Some("hello0123"));
+    assert_eq!(interpret(&nfa, "_0123 abc"), Some("_0123"));
+}
+
+#[test]
+fn regex_star_group() {
+    let ident = re::parse_regex(r#"(abc)*"#).unwrap();
+    let nfa = NFA::from_re(&ident).unwrap();
+    assert_eq!(interpret(&nfa, "abcabcabcab"), Some("abcabcabc"));
+}
+
+#[test]
+fn regex_number() {
+    let num = re::parse_regex(r#"[0-9]+"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "123"), Some("123"));
+}
+
+#[test]
+fn dot_newline() {
+    let num = re::parse_regex(r#"."#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "\n"), None);
+}
+
+#[test]
+fn max_range() {
+    let num = re::parse_regex(r#"ab{2,4}"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "a"), None);
+    assert_eq!(interpret(&nfa, "ab"), None);
+    assert_eq!(interpret(&nfa, "abb"), Some("abb"));
+    assert_eq!(interpret(&nfa, "abbb"), Some("abbb"));
+    assert_eq!(interpret(&nfa, "abbbb"), Some("abbbb"));
+    assert_eq!(interpret(&nfa, "abbbbb"), Some("abbbb"));
+    assert_eq!(interpret(&nfa, "ac"), None);
+}
+
+#[test]
+fn literal() {
+    let num = re::parse_regex(r#"(?i:aBCdeF)"#).unwrap();
+    let nfa = NFA::from_re(&num).unwrap();
+    assert_eq!(interpret(&nfa, "abcdef"), Some("abcdef"));
+    assert_eq!(interpret(&nfa, "AbcDEf"), Some("AbcDEf"));
+}
+
+// Test that uses of disallowed features trigger errors
+// during NFA construction:
+
+#[test]
+fn captures() {
+    let num = re::parse_regex(r#"(aBCdeF)"#).unwrap();
+    NFA::from_re(&num).unwrap(); // captures are ok
+
+    let num = re::parse_regex(r#"(?:aBCdeF)"#).unwrap();
+    NFA::from_re(&num).unwrap(); // non-captures are ok
+
+    let num = re::parse_regex(r#"(?P<foo>aBCdeF)"#).unwrap(); // named captures are not
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::NamedCaptures
+    );
+}
+
+#[test]
+fn line_boundaries() {
+    let num = re::parse_regex(r#"^aBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::TextBoundary
+    );
+
+    let num = re::parse_regex(r#"aBCdeF$"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::TextBoundary
+    );
+}
+
+#[test]
+fn text_boundaries() {
+    let num = re::parse_regex(r#"(?m)^aBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::LineBoundary
+    );
+
+    let num = re::parse_regex(r#"(?m)aBCdeF$"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::LineBoundary
+    );
+}
+
+#[test]
+fn word_boundaries() {
+    let num = re::parse_regex(r#"\baBCdeF"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::WordBoundary
+    );
+
+    let num = re::parse_regex(r#"aBCdeF\B"#).unwrap();
+    assert_eq!(
+        NFA::from_re(&num).unwrap_err(),
+        NFAConstructionError::WordBoundary
+    );
+}
+
+#[test]
+fn issue_101() {
+    let num = re::parse_regex(r#"(1|0?)"#).unwrap();
+    NFA::from_re(&num).unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/re/mod.rs
@@ -0,0 +1,23 @@
+//! A parser and representation of regular expressions.
+
+use regex_syntax::{self, Error, Expr};
+
+#[cfg(test)]
+mod test;
+
+pub type Regex = Expr;
+pub type RegexError = Error;
+
+/// Convert a string literal into a parsed regular expression.
+pub fn parse_literal(s: &str) -> Regex {
+    match parse_regex(&regex_syntax::escape(s)) {
+        Ok(v) => v,
+        Err(_) => panic!("failed to parse literal regular expression"),
+    }
+}
+
+/// Parse a regular expression like `a+` etc.
+pub fn parse_regex(s: &str) -> Result<Regex, RegexError> {
+    let expr = try!(Expr::parse(s));
+    Ok(expr)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lexer/re/test.rs
@@ -0,0 +1,11 @@
+use super::*;
+
+#[test]
+fn parse_unclosed_group() {
+    parse_regex(r"(123").unwrap_err();
+}
+
+#[test]
+fn alt_oom() {
+    parse_regex(r"(%%|[^%])+").unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lib.rs
@@ -0,0 +1,56 @@
+// Need this for rusty_peg
+#![recursion_limit = "256"]
+// I hate this lint.
+#![allow(unused_parens)]
+// The builtin tests don't cover the CLI and so forth, and it's just
+// too darn annoying to try and make them do so.
+#![cfg_attr(test, allow(dead_code))]
+
+extern crate ascii_canvas;
+extern crate atty;
+extern crate bit_set;
+extern crate diff;
+extern crate ena;
+extern crate itertools;
+extern crate lalrpop_util;
+extern crate petgraph;
+extern crate regex;
+extern crate regex_syntax;
+extern crate string_cache;
+extern crate term;
+extern crate unicode_xid;
+
+#[cfg(test)]
+extern crate rand;
+
+// hoist the modules that define macros up earlier
+#[macro_use]
+mod rust;
+#[macro_use]
+mod log;
+
+mod api;
+mod build;
+mod collections;
+mod file_text;
+mod grammar;
+mod lexer;
+mod lr1;
+mod message;
+mod normalize;
+mod parser;
+mod kernel_set;
+mod session;
+mod tls;
+mod tok;
+mod util;
+
+#[cfg(test)]
+mod generate;
+#[cfg(test)]
+mod test_util;
+
+pub use api::Configuration;
+pub use api::process_root;
+pub use api::process_root_unconditionally;
+use ascii_canvas::style;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/log.rs
@@ -0,0 +1,64 @@
+#[derive(Clone)]
+pub struct Log {
+    level: Level,
+}
+
+#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)]
+pub enum Level {
+    /// No updates unless an error arises.
+    Taciturn,
+
+    /// Timing and minimal progress.
+    Informative,
+
+    /// More details, but still stuff an end-user is likely to understand.
+    Verbose,
+
+    /// Everything you could ever want and then some more.
+    Debug,
+}
+
+impl Log {
+    pub fn new(level: Level) -> Log {
+        Log { level: level }
+    }
+
+    pub fn set_level(&mut self, level: Level) {
+        self.level = level;
+    }
+
+    pub fn log<M>(&self, level: Level, message: M)
+    where
+        M: FnOnce() -> String,
+    {
+        if self.level >= level {
+            println!("{}", message());
+        }
+    }
+}
+
+macro_rules! log {
+    ($session:expr, $level:ident, $($args:expr),*) => {
+        $session.log(::log::Level::$level, || ::std::fmt::format(format_args!($($args),*)))
+    }
+}
+
+macro_rules! debug {
+    ($($args:expr),*) => {
+        log!(::tls::Tls::session(), Debug, $($args),*)
+    }
+}
+
+macro_rules! profile {
+    ($session:expr, $phase_name:expr, $action:expr) => {
+        {
+            log!($session, Verbose, "Phase `{}` begun", $phase_name);
+            let time_stamp = ::std::time::Instant::now();
+            let result = $action;
+            let elapsed = time_stamp.elapsed();
+            log!($session, Verbose, "Phase `{}` completed in {} seconds",
+                 $phase_name, elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1000_000_000.0);
+            result
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/build/mod.rs
@@ -0,0 +1,357 @@
+//! LR(1) state construction algorithm.
+
+use collections::{map, Multimap};
+use kernel_set;
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::first;
+use lr1::lane_table::*;
+use lr1::lookahead::*;
+use std::rc::Rc;
+use std::env;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+fn build_lr1_states_legacy<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    let eof = TokenSet::eof();
+    let mut lr1: LR<'grammar, TokenSet> = LR::new(grammar, start, eof);
+    lr1.set_permit_early_stop(true);
+    lr1.build_states()
+}
+
+type ConstructionFunction<'grammar> =
+    fn(&'grammar Grammar, NonterminalString) -> LR1Result<'grammar>;
+
+pub fn use_lane_table() -> bool {
+    match env::var("LALRPOP_LANE_TABLE") {
+        Ok(ref s) => s != "disabled",
+        _ => true,
+    }
+}
+
+pub fn build_lr1_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    let (method_name, method_fn) = if use_lane_table() {
+        ("lane", build_lane_table_states as ConstructionFunction)
+    } else {
+        ("legacy", build_lr1_states_legacy as ConstructionFunction)
+    };
+
+    profile! {
+        &Tls::session(),
+        format!("LR(1) state construction ({})", method_name),
+        {
+            method_fn(grammar, start)
+        }
+    }
+}
+
+pub fn build_lr0_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> Result<Vec<LR0State<'grammar>>, LR0TableConstructionError<'grammar>> {
+    let lr1 = LR::new(grammar, start, Nil);
+    lr1.build_states()
+}
+
+pub struct LR<'grammar, L: LookaheadBuild> {
+    grammar: &'grammar Grammar,
+    first_sets: first::FirstSets,
+    start_nt: NonterminalString,
+    start_lookahead: L,
+    permit_early_stop: bool,
+}
+
+impl<'grammar, L: LookaheadBuild> LR<'grammar, L> {
+    fn new(grammar: &'grammar Grammar, start_nt: NonterminalString, start_lookahead: L) -> Self {
+        LR {
+            grammar: grammar,
+            first_sets: first::FirstSets::new(grammar),
+            start_nt: start_nt,
+            start_lookahead: start_lookahead,
+            permit_early_stop: false,
+        }
+    }
+
+    fn set_permit_early_stop(&mut self, v: bool) {
+        self.permit_early_stop = v;
+    }
+
+    fn build_states(&self) -> Result<Vec<State<'grammar, L>>, TableConstructionError<'grammar, L>> {
+        let session = Tls::session();
+        let mut kernel_set = kernel_set::KernelSet::new();
+        let mut states = vec![];
+        let mut conflicts = vec![];
+
+        // create the starting state
+        kernel_set.add_state(Kernel::start(self.items(
+            &self.start_nt,
+            0,
+            &self.start_lookahead,
+        )));
+
+        while let Some(Kernel { items: seed_items }) = kernel_set.next() {
+            let items = self.transitive_closure(seed_items);
+            let index = StateIndex(states.len());
+
+            if index.0 % 5000 == 0 && index.0 > 0 {
+                log!(session, Verbose, "{} states created so far.", index.0);
+            }
+
+            let mut this_state = State {
+                index: index,
+                items: items.clone(),
+                shifts: map(),
+                reductions: vec![],
+                gotos: map(),
+            };
+
+            // group the items that we can transition into by shifting
+            // over a term or nonterm
+            let transitions: Multimap<Symbol, Multimap<LR0Item<'grammar>, L>> = items
+                .vec
+                .iter()
+                .filter_map(|item| item.shifted_item())
+                .map(
+                    |(
+                        symbol,
+                        Item {
+                            production,
+                            index,
+                            lookahead,
+                        },
+                    )| { (symbol, (Item::lr0(production, index), lookahead)) },
+                )
+                .collect();
+
+            for (symbol, shifted_items) in transitions.into_iter() {
+                let shifted_items: Vec<Item<'grammar, L>> = shifted_items
+                    .into_iter()
+                    .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+                    .collect();
+
+                // Not entirely obvious: if the original set of items
+                // is sorted to begin with (and it is), then this new
+                // set of shifted items is *also* sorted. This is
+                // because it is produced from the old items by simply
+                // incrementing the index by 1.
+                let next_state = kernel_set.add_state(Kernel::shifted(shifted_items));
+
+                match symbol {
+                    Symbol::Terminal(s) => {
+                        let prev = this_state.shifts.insert(s, next_state);
+                        assert!(prev.is_none()); // cannot have a shift/shift conflict
+                    }
+
+                    Symbol::Nonterminal(s) => {
+                        let prev = this_state.gotos.insert(s, next_state);
+                        assert!(prev.is_none());
+                    }
+                }
+            }
+
+            // finally, consider the reductions
+            for item in items.vec.iter().filter(|i| i.can_reduce()) {
+                this_state
+                    .reductions
+                    .push((item.lookahead.clone(), item.production));
+            }
+
+            // check for shift-reduce conflicts (reduce-reduce detected above)
+            conflicts.extend(L::conflicts(&this_state));
+
+            // extract a new state
+            states.push(this_state);
+
+            if self.permit_early_stop && session.stop_after(conflicts.len()) {
+                log!(
+                    session,
+                    Verbose,
+                    "{} conflicts encountered, stopping.",
+                    conflicts.len()
+                );
+                break;
+            }
+        }
+
+        if !conflicts.is_empty() {
+            Err(TableConstructionError {
+                states: states,
+                conflicts: conflicts,
+            })
+        } else {
+            Ok(states)
+        }
+    }
+
+    fn items(&self, id: &NonterminalString, index: usize, lookahead: &L) -> Vec<Item<'grammar, L>> {
+        self.grammar
+            .productions_for(id)
+            .iter()
+            .map(|production| {
+                debug_assert!(index <= production.symbols.len());
+                Item {
+                    production: production,
+                    index: index,
+                    lookahead: lookahead.clone(),
+                }
+            })
+            .collect()
+    }
+
+    // expands `state` with epsilon moves
+    fn transitive_closure(&self, items: Vec<Item<'grammar, L>>) -> Items<'grammar, L> {
+        let mut stack: Vec<LR0Item<'grammar>> = items.iter().map(|item| item.to_lr0()).collect();
+        let mut map: Multimap<LR0Item<'grammar>, L> = items
+            .into_iter()
+            .map(|item| (item.to_lr0(), item.lookahead))
+            .collect();
+
+        while let Some(item) = stack.pop() {
+            let lookahead = map.get(&item).unwrap().clone();
+
+            let shift_symbol = item.shift_symbol();
+
+            // Check whether this is an item where the cursor
+            // is resting on a non-terminal:
+            //
+            // I = ... (*) X z... [lookahead]
+            //
+            // The `nt` will be X and the `remainder` will be `z...`.
+            let (nt, remainder) = match shift_symbol {
+                None => continue, // requires a reduce
+                Some((Symbol::Terminal(_), _)) => {
+                    continue; // requires a shift
+                }
+                Some((Symbol::Nonterminal(nt), remainder)) => (nt, remainder),
+            };
+
+            // In that case, for each production of `X`, we are also
+            // in a state where the cursor rests at the start of that production:
+            //
+            // X = (*) a... [lookahead']
+            // X = (*) b... [lookahead']
+            //
+            // Here `lookahead'` is computed based on the `remainder` and our
+            // `lookahead`. In LR1 at least, it is the union of:
+            //
+            //   (a) FIRST(remainder)
+            //   (b) if remainder may match epsilon, also our lookahead.
+            for new_item in L::epsilon_moves(self, &nt, remainder, &lookahead) {
+                let new_item0 = new_item.to_lr0();
+                if map.push(new_item0, new_item.lookahead) {
+                    stack.push(new_item0);
+                }
+            }
+        }
+
+        let final_items = map.into_iter()
+            .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+            .collect();
+
+        Items {
+            vec: Rc::new(final_items),
+        }
+    }
+}
+
+/// Except for the initial state, the kernel sets always contain
+/// a set of "seed" items where something has been pushed (that is,
+/// index > 0). In other words, items like this:
+///
+///    A = ...p (*) ...
+///
+/// where ...p is non-empty. We now have to expand to include any
+/// epsilon moves:
+///
+///    A = ... (*) B ...
+///    B = (*) ...        // added by transitive_closure algorithm
+///
+/// But note that the state is completely identified by its
+/// kernel set: the same kernel sets always expand to the
+/// same transitive closures, and different kernel sets
+/// always expand to different transitive closures. The
+/// first point is obvious, but the latter point follows
+/// because the transitive closure algorithm only adds
+/// items where `index == 0`, and hence it can never add an
+/// item found in a kernel set.
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+struct Kernel<'grammar, L: LookaheadBuild> {
+    items: Vec<Item<'grammar, L>>,
+}
+
+impl<'grammar, L: LookaheadBuild> Kernel<'grammar, L> {
+    pub fn start(items: Vec<Item<'grammar, L>>) -> Kernel<'grammar, L> {
+        // In start state, kernel should have only items with `index == 0`.
+        debug_assert!(items.iter().all(|item| item.index == 0));
+        Kernel { items: items }
+    }
+
+    pub fn shifted(items: Vec<Item<'grammar, L>>) -> Kernel<'grammar, L> {
+        // Assert that this kernel consists only of shifted items
+        // where `index > 0`. This assertion could cost real time to
+        // check so only do it in debug mode.
+        debug_assert!(items.iter().all(|item| item.index > 0));
+        Kernel { items: items }
+    }
+}
+
+impl<'grammar, L: LookaheadBuild> kernel_set::Kernel for Kernel<'grammar, L> {
+    type Index = StateIndex;
+
+    fn index(c: usize) -> StateIndex {
+        StateIndex(c)
+    }
+}
+
+pub trait LookaheadBuild: Lookahead {
+    // Given that there exists an item
+    //
+    //     X = ... (*) Y ...s [L]
+    //
+    // where `nt` is `Y`, `remainder` is `...s`, and `lookahead` is
+    // `L`, computes the new items resulting from epsilon moves (if
+    // any). The technique of doing this will depend on the amount of
+    // lookahead.
+    //
+    // For example, if we have an LR0 item, then for each `Y = ...`
+    // production, we just add an `Y = (*) ...` item. But for LR1
+    // items, we have to add multiple items where we consider the
+    // lookahead from `FIRST(...s, L)`.
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        remainder: &[Symbol],
+        lookahead: &Self,
+    ) -> Vec<Item<'grammar, Self>>;
+}
+
+impl LookaheadBuild for Nil {
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        _remainder: &[Symbol],
+        lookahead: &Nil,
+    ) -> Vec<LR0Item<'grammar>> {
+        lr.items(nt, 0, &lookahead)
+    }
+}
+
+impl LookaheadBuild for TokenSet {
+    fn epsilon_moves<'grammar>(
+        lr: &LR<'grammar, Self>,
+        nt: &NonterminalString,
+        remainder: &[Symbol],
+        lookahead: &Self,
+    ) -> Vec<LR1Item<'grammar>> {
+        let first_set = lr.first_sets.first1(remainder, lookahead);
+        lr.items(nt, 0, &first_set)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/build/test.rs
@@ -0,0 +1,354 @@
+use string_cache::DefaultAtom as Atom;
+use generate;
+use grammar::repr::*;
+use test_util::{compare, expect_debug, normalized_grammar};
+use lr1::core::*;
+use lr1::interpret::interpret;
+use lr1::lookahead::Token;
+use lr1::lookahead::Token::EOF;
+use lr1::lookahead::TokenSet;
+use lr1::tls::Lr1Tls;
+use tls::Tls;
+
+use super::{use_lane_table, build_lr0_states, build_lr1_states, LR};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+const ITERATIONS: usize = 22;
+
+fn random_test<'g>(grammar: &Grammar, states: &'g [LR1State<'g>], start_symbol: NonterminalString) {
+    for i in 0..ITERATIONS {
+        let input_tree = generate::random_parse_tree(grammar, start_symbol.clone());
+        let output_tree = interpret(&states, input_tree.terminals()).unwrap();
+
+        println!("test {}", i);
+        println!("input_tree = {}", input_tree);
+        println!("output_tree = {}", output_tree);
+
+        compare(output_tree, input_tree);
+    }
+}
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+fn items<'g>(grammar: &'g Grammar, nonterminal: &str, index: usize, la: Token) -> LR1Items<'g> {
+    let set = TokenSet::from(la);
+    let lr1: LR<TokenSet> = LR::new(&grammar, nt(nonterminal), set.clone());
+    let items = lr1.transitive_closure(lr1.items(&nt(nonterminal), index, &set));
+    items
+}
+
+#[test]
+fn start_state() {
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "C" => .., "D" => .. } }
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        () => None
+    };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let items = items(&grammar, "A", 0, EOF);
+    expect_debug(
+        items.vec,
+        r#"[
+    A = (*) B "C" [EOF],
+    B = (*) ["C"],
+    B = (*) "D" ["C"]
+]"#,
+    );
+}
+
+#[test]
+fn start_state_1() {
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+extern { enum Tok { "B1" => .., "C1" => .. } }
+A = B C;
+B: Option<u32> = {
+    "B1" => Some(1),
+    () => None
+};
+C: Option<u32> = {
+    "C1" => Some(1),
+    () => None
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    expect_debug(
+        items(&grammar, "A", 0, EOF).vec,
+        r#"[
+    A = (*) B C [EOF],
+    B = (*) ["C1", EOF],
+    B = (*) "B1" ["C1", EOF]
+]"#,
+    );
+
+    expect_debug(
+        items(&grammar, "A", 1, EOF).vec,
+        r#"[
+    A = B (*) C [EOF],
+    C = (*) [EOF],
+    C = (*) "C1" [EOF]
+]"#,
+    );
+}
+
+#[test]
+fn expr_grammar1() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "-" => .., "N" => .., "(" => .., ")" => .. } }
+
+    S: () =
+        E => ();
+
+    E: () = {
+        E "-" T => (),
+        T => ()
+    };
+
+    T: () = {
+        "N" => (),
+        "(" E ")" => ()
+    };
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    // for now, just test that process does not result in an error
+    // and yields expected number of states.
+    let states = build_lr1_states(&grammar, nt("S")).unwrap();
+    println!("{:#?}", states);
+    assert_eq!(states.len(), if use_lane_table() { 9 } else { 16 });
+
+    // execute it on some sample inputs.
+    let tree = interpret(&states, tokens!["N", "-", "(", "N", "-", "N", ")"]).unwrap();
+    assert_eq!(
+        &format!("{}", tree)[..],
+        r#"[S: [E: [E: [T: "N"]], "-", [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]]]"#
+    );
+
+    // incomplete:
+    assert!(interpret(&states, tokens!["N", "-", "(", "N", "-", "N"]).is_err());
+
+    // incomplete:
+    assert!(interpret(&states, tokens!["N", "-"]).is_err());
+
+    // unexpected character:
+    assert!(interpret(&states, tokens!["N", "-", ")", "N", "-", "N", "("]).is_err());
+
+    // parens first:
+    let tree = interpret(&states, tokens!["(", "N", "-", "N", ")", "-", "N"]).unwrap();
+    println!("{}", tree);
+    assert_eq!(
+        &format!("{}", tree)[..],
+        r#"[S: [E: [E: [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]], "-", [T: "N"]]]"#
+    );
+
+    // run some random tests
+    random_test(&grammar, &states, nt("S"));
+}
+
+#[test]
+fn shift_reduce_conflict1() {
+    let _tls = Tls::test();
+
+    // This grammar gets a shift-reduce conflict because if the input
+    // is "&" (*) "L", then we see two possibilities, and we must decide
+    // between them:
+    //
+    // "&" (*) "L" E
+    //  |       |  |
+    //  +-------+--|
+    //          |
+    //          E
+    //
+    // or
+    //
+    // "&"      (*) "L"
+    //  |            |
+    //  |  OPT_L     E
+    //  |   |        |
+    //  +---+---+----+
+    //          |
+    //          E
+    //
+    // to some extent this may be a false conflict, in that inlined
+    // rules would address it, but it's an interesting one for
+    // producing a useful error message.
+
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+        extern { enum Tok { "L" => .., "&" => .., } }
+        E: () = {
+            "L",
+            "&" OPT_L E
+        };
+        OPT_L: () = {
+            (),
+            "L"
+        };
+    "#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    assert!(build_lr1_states(&grammar, nt("E")).is_err());
+}
+
+/// One of the few grammars that IS LR(0).
+#[test]
+fn lr0_expr_grammar_with_explicit_eof() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+S: () = E "$";
+
+E: () = {
+    E "-" T,
+    T,
+};
+
+T: () = {
+    "N",
+    "(" E ")",
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    // for now, just test that process does not result in an error
+    // and yields expected number of states.
+    let states = build_lr0_states(&grammar, nt("S")).unwrap();
+    assert_eq!(states.len(), 10);
+}
+
+/// Without the artifical '$', grammar is not LR(0).
+#[test]
+fn lr0_expr_grammar_with_implicit_eof() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+S: () = E;
+
+E: () = {
+    E "-" T,
+    T,
+};
+
+T: () = {
+    "N",
+    "(" E ")",
+};
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    build_lr0_states(&grammar, nt("S")).unwrap_err();
+}
+
+/// When we moved to storing items as (lr0 -> TokenSet) pairs, a bug
+/// in the transitive closure routine could cause us to have `(Foo,
+/// S0)` and `(Foo, S1)` as distinct items instead of `(Foo, S0|S1)`.
+#[test]
+fn issue_144() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub ForeignItem: () = {
+  AttrsAndVis "item_foreign_fn",
+  AttrsAndVis "unsafe" "item_foreign_fn",
+};
+
+AttrsAndVis: () = {
+    MaybeOuterAttrs visibility,
+};
+
+MaybeOuterAttrs: () = {
+    OuterAttrs,
+    (),
+};
+
+visibility: () = {
+  "pub",
+  (),
+};
+
+OuterAttrs: () = {
+    OuterAttr,
+    OuterAttrs OuterAttr,
+};
+
+OuterAttr: () = {
+    "#" "[" "]",
+};
+
+Ident: () = {
+    "IDENT",
+};
+
+ty: () = {
+    "ty"
+};
+"##,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    build_lr1_states(&grammar, nt("ForeignItem")).unwrap();
+}
+
+// Not sure if this is the right spot
+#[test]
+fn match_grammar() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+
+match {
+    r"(?i)select" => SELECT
+} else {
+    _
+}
+
+pub Query = SELECT r"[a-z]+";
+"#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    let states = build_lr0_states(&grammar, nt("Query")).expect("build states");
+    println!("states: {:?}", states);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/build_lalr/mod.rs
@@ -0,0 +1,163 @@
+//! Mega naive LALR(1) generation algorithm.
+
+use collections::{map, Map, Multimap};
+use itertools::Itertools;
+use lr1::build;
+use lr1::core::*;
+use lr1::lookahead::*;
+use grammar::repr::*;
+use std::rc::Rc;
+use std::mem;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+// Intermediate LALR(1) state. Identical to an LR(1) state, but that
+// the items can be pushed to. We initially create these with an empty
+// set of actions, as well.
+struct LALR1State<'grammar> {
+    pub index: StateIndex,
+    pub items: Vec<LR1Item<'grammar>>,
+    pub shifts: Map<TerminalString, StateIndex>,
+    pub reductions: Multimap<&'grammar Production, TokenSet>,
+    pub gotos: Map<NonterminalString, StateIndex>,
+}
+
+pub fn build_lalr_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    // First build the LR(1) states
+    let lr_states = try!(build::build_lr1_states(grammar, start));
+
+    // With lane table, there is no reason to do state collapse
+    // for LALR. In fact, LALR is pointless!
+    if build::use_lane_table() {
+        println!("Warning: Now that the new lane-table algorithm is the default,");
+        println!("         #[lalr] mode has no effect and can be removed.");
+        return Ok(lr_states);
+    }
+
+    profile! {
+        &Tls::session(),
+        "LALR(1) state collapse",
+        collapse_to_lalr_states(&lr_states)
+    }
+}
+
+pub fn collapse_to_lalr_states<'grammar>(lr_states: &[LR1State<'grammar>]) -> LR1Result<'grammar> {
+    // Now compress them. This vector stores, for each state, the
+    // LALR(1) state to which we will remap it.
+    let mut remap: Vec<_> = (0..lr_states.len()).map(|_| StateIndex(0)).collect();
+    let mut lalr1_map: Map<Vec<LR0Item>, StateIndex> = map();
+    let mut lalr1_states: Vec<LALR1State> = vec![];
+
+    for (lr1_index, lr1_state) in lr_states.iter().enumerate() {
+        let lr0_kernel: Vec<_> = lr1_state
+            .items
+            .vec
+            .iter()
+            .map(|item| item.to_lr0())
+            .dedup()
+            .collect();
+
+        let lalr1_index = *lalr1_map.entry(lr0_kernel).or_insert_with(|| {
+            let index = StateIndex(lalr1_states.len());
+            lalr1_states.push(LALR1State {
+                index: index,
+                items: vec![],
+                shifts: map(),
+                reductions: Multimap::new(),
+                gotos: map(),
+            });
+            index
+        });
+
+        lalr1_states[lalr1_index.0]
+            .items
+            .extend(lr1_state.items.vec.iter().cloned());
+
+        remap[lr1_index] = lalr1_index;
+    }
+
+    // The reduction process can leave us with multiple
+    // overlapping LR(0) items, whose lookaheads must be
+    // unioned. e.g. we may now have:
+    //
+    //     X = "(" (*) ")" ["Foo"]
+    //     X = "(" (*) ")" ["Bar"]
+    //
+    // which we will convert to:
+    //
+    //     X = "(" (*) ")" ["Foo", "Bar"]
+    for lalr1_state in &mut lalr1_states {
+        let items = mem::replace(&mut lalr1_state.items, vec![]);
+
+        let items: Multimap<LR0Item<'grammar>, TokenSet> = items
+            .into_iter()
+            .map(
+                |Item {
+                     production,
+                     index,
+                     lookahead,
+                 }| { (Item::lr0(production, index), lookahead) },
+            )
+            .collect();
+
+        lalr1_state.items = items
+            .into_iter()
+            .map(|(lr0_item, lookahead)| lr0_item.with_lookahead(lookahead))
+            .collect();
+    }
+
+    // Now that items are fully built, create the actions
+    for (lr1_index, lr1_state) in lr_states.iter().enumerate() {
+        let lalr1_index = remap[lr1_index];
+        let lalr1_state = &mut lalr1_states[lalr1_index.0];
+
+        for (terminal, &lr1_state) in &lr1_state.shifts {
+            let target_state = remap[lr1_state.0];
+            let prev = lalr1_state.shifts.insert(terminal.clone(), target_state);
+            assert!(prev.unwrap_or(target_state) == target_state);
+        }
+
+        for (nt, lr1_state) in &lr1_state.gotos {
+            let target_state = remap[lr1_state.0];
+            let prev = lalr1_state.gotos.insert(nt.clone(), target_state);
+            assert!(prev.unwrap_or(target_state) == target_state); // as above
+        }
+
+        for &(ref token_set, production) in &lr1_state.reductions {
+            lalr1_state.reductions.push(production, token_set.clone());
+        }
+    }
+
+    // Finally, create the new states and detect conflicts
+    let lr1_states: Vec<_> = lalr1_states
+        .into_iter()
+        .map(|lr| State {
+            index: lr.index,
+            items: Items {
+                vec: Rc::new(lr.items),
+            },
+            shifts: lr.shifts,
+            reductions: lr.reductions.into_iter().map(|(p, ts)| (ts, p)).collect(),
+            gotos: lr.gotos,
+        })
+        .collect();
+
+    let conflicts: Vec<_> = lr1_states
+        .iter()
+        .flat_map(|s| TokenSet::conflicts(s))
+        .collect();
+
+    if !conflicts.is_empty() {
+        Err(TableConstructionError {
+            states: lr1_states,
+            conflicts: conflicts,
+        })
+    } else {
+        Ok(lr1_states)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/build_lalr/test.rs
@@ -0,0 +1,49 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use tls::Tls;
+use super::build_lalr_states;
+use super::super::interpret::interpret;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+#[test]
+fn figure9_23() {
+    let _tls = Tls::test();
+
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+        extern { enum Tok { "-" => .., "N" => .., "(" => .., ")" => .. } }
+        S: () = E       => ();
+        E: () = {
+            E "-" T     => (),
+            T           => ()
+        };
+        T: () = {
+            "N"         => (),
+            "(" E ")"   => ()
+        };
+   "#,
+    );
+
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+
+    let states = build_lalr_states(&grammar, nt("S")).unwrap();
+    println!("{:#?}", states);
+
+    let tree = interpret(&states, tokens!["N", "-", "(", "N", "-", "N", ")"]).unwrap();
+    assert_eq!(
+        &format!("{:?}", tree)[..],
+        r#"[S: [E: [E: [T: "N"]], "-", [T: "(", [E: [E: [T: "N"]], "-", [T: "N"]], ")"]]]"#
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/codegen/ascent.rs
@@ -0,0 +1,1019 @@
+//! A compiler from an LR(1) table to a [recursive ascent] parser.
+//!
+//! [recursive ascent]: https://en.wikipedia.org/wiki/Recursive_ascent_parser
+
+use collections::{Multimap, Set};
+use grammar::parse_tree::WhereClause;
+use grammar::repr::{Grammar, NonterminalString, Production, Symbol, TerminalString, TypeParameter,
+                    TypeRepr, Visibility};
+use lr1::core::*;
+use lr1::lookahead::Token;
+use lr1::state_graph::StateGraph;
+use rust::RustWrite;
+use std::io::{self, Write};
+use tls::Tls;
+use util::{Escape, Sep};
+
+use super::base::CodeGenerator;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    action_module: &str,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let graph = StateGraph::new(&states);
+    let mut ascent = CodeGenerator::new_ascent(
+        grammar,
+        user_start_symbol,
+        start_symbol,
+        &graph,
+        states,
+        action_module,
+        out,
+    );
+    ascent.write()
+}
+
+struct RecursiveAscent<'ascent, 'grammar> {
+    graph: &'ascent StateGraph,
+
+    /// for each state, the set of symbols that it will require for
+    /// input
+    state_inputs: Vec<StackSuffix<'grammar>>,
+
+    /// type parameters for the `Nonterminal` type
+    nonterminal_type_params: Vec<TypeParameter>,
+
+    nonterminal_where_clauses: Vec<WhereClause<TypeRepr>>,
+}
+
+/// Tracks the suffix of the stack (that is, top-most elements) that any
+/// particular state is aware of. We break the suffix into two parts:
+/// optional and fixed, which always look like this:
+///
+/// ```
+/// ... A B C X Y Z
+/// ~~~ ~~~~~ ~~~~~
+///  |    |     |
+///  |    |   Fixed (top of the stack)
+///  |    |
+///  |  Optional (will be popped after the fixed portion)
+///  |
+/// Prefix (stuff we don't know about that is also on the stack
+/// ```
+///
+/// The idea of an "optional" member is not that it may or may not be
+/// on the stack. The entire suffix will always be on the stack. An
+/// *optional* member is one that *we* may or may not *consume*. So
+/// the above stack suffix could occur given a state with items like:
+///
+/// ```
+/// NT1 = A B C X Y Z (*) "."
+/// NT2 = X Y Z (*) ","
+/// ```
+///
+/// Depending on what comes next, if we reduce NT1, we will consume
+/// all six symbols, but if we reduce NT2, we will only reduce three.
+#[derive(Copy, Clone, Debug)]
+struct StackSuffix<'grammar> {
+    /// all symbols that are known to be on the stack (optional + fixed).
+    all: &'grammar [Symbol],
+
+    /// optional symbols will be consumed by *some* reductions in this
+    /// state, but not all
+    len_optional: usize,
+}
+
+impl<'grammar> StackSuffix<'grammar> {
+    fn len(&self) -> usize {
+        self.all.len()
+    }
+
+    /// returns the (optional, fixed) -- number of optional
+    /// items in stack prefix and numer of fixed
+    fn optional_fixed_lens(&self) -> (usize, usize) {
+        (self.len_optional, self.len() - self.len_optional)
+    }
+
+    fn is_not_empty(&self) -> bool {
+        self.len() > 0
+    }
+
+    fn optional(&self) -> &'grammar [Symbol] {
+        &self.all[..self.len_optional]
+    }
+
+    fn fixed(&self) -> &'grammar [Symbol] {
+        &self.all[self.len_optional..]
+    }
+}
+
+impl<'ascent, 'grammar, W: Write>
+    CodeGenerator<'ascent, 'grammar, W, RecursiveAscent<'ascent, 'grammar>>
+{
+    fn new_ascent(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        graph: &'ascent StateGraph,
+        states: &'ascent [LR1State<'grammar>],
+        action_module: &str,
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        // The nonterminal type needs to be parameterized by all the
+        // type parameters that actually appear in the types of
+        // nonterminals.  We can't just use *all* type parameters
+        // because that would leave unused lifetime/type parameters in
+        // some cases.
+        let referenced_ty_params: Set<TypeParameter> = grammar
+            .types
+            .nonterminal_types()
+            .into_iter()
+            .flat_map(|t| t.referenced())
+            .collect();
+
+        let nonterminal_type_params: Vec<_> = grammar
+            .type_parameters
+            .iter()
+            .filter(|t| referenced_ty_params.contains(t))
+            .cloned()
+            .collect();
+
+        let mut referenced_where_clauses = Set::new();
+        for wc in &grammar.where_clauses {
+            wc.map(|ty| {
+                if ty.referenced()
+                    .iter()
+                    .any(|p| nonterminal_type_params.contains(p))
+                {
+                    referenced_where_clauses.insert(wc.clone());
+                }
+            });
+        }
+
+        let nonterminal_where_clauses: Vec<_> = grammar
+            .where_clauses
+            .iter()
+            .filter(|wc| referenced_where_clauses.contains(wc))
+            .cloned()
+            .collect();
+
+        let state_inputs = states
+            .iter()
+            .map(|state| Self::state_input_for(state))
+            .collect();
+
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            false,
+            action_module,
+            RecursiveAscent {
+                graph: graph,
+                state_inputs: state_inputs,
+                nonterminal_type_params: nonterminal_type_params,
+                nonterminal_where_clauses: nonterminal_where_clauses,
+            },
+        )
+    }
+
+    /// Compute the stack suffix that the state expects on entry.
+    fn state_input_for(state: &'ascent LR1State<'grammar>) -> StackSuffix<'grammar> {
+        let max_prefix = state.max_prefix();
+        let will_pop = state.will_pop();
+        StackSuffix {
+            all: max_prefix,
+            len_optional: max_prefix.len() - will_pop.len(),
+        }
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_start_fn());
+            rust!(this.out, "");
+            try!(this.write_return_type_defn());
+            for i in 0..this.states.len() {
+                try!(this.write_state_fn(StateIndex(i)));
+            }
+            Ok(())
+        })
+    }
+
+    fn write_return_type_defn(&mut self) -> io::Result<()> {
+        // sometimes some of the variants are not used, particularly
+        // if we are generating multiple parsers from the same file:
+        rust!(self.out, "#[allow(dead_code)]");
+        rust!(
+            self.out,
+            "pub enum {}Nonterminal<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.nonterminal_type_params)
+        );
+
+        if !self.custom.nonterminal_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.nonterminal_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        // make an enum with one variant per nonterminal; I considered
+        // making different enums per state, but this would mean we
+        // have to unwrap and rewrap as we pass up the stack, which
+        // seems silly
+        for ref nt in self.grammar.nonterminals.keys() {
+            let ty = self.types
+                .spanned_type(self.types.nonterminal_type(nt).clone());
+            rust!(self.out, "{}({}),", Escape(nt), ty);
+        }
+
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    // Generates a function `parse_Foo` that will parse an entire
+    // input as `Foo`. An error is reported if the entire input is not
+    // consumed.
+    fn write_start_fn(&mut self) -> io::Result<()> {
+        let phantom_data = self.phantom_data_expr();
+        try!(self.start_parser_fn());
+        try!(self.define_tokens());
+
+        try!(self.next_token("lookahead", "tokens"));
+        rust!(
+            self.out,
+            "match try!({}state0({}&mut {}tokens, {}lookahead, {})) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            phantom_data
+        );
+
+        // extra tokens?
+        rust!(self.out, "(Some({}lookahead), _) => {{", self.prefix);
+        rust!(
+            self.out,
+            "Err({}lalrpop_util::ParseError::ExtraToken {{ token: {}lookahead }})",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}}");
+
+        // otherwise, we expect to see only the goal terminal
+        rust!(
+            self.out,
+            "(None, {}Nonterminal::{}((_, {}nt, _))) => {{",
+            self.prefix,
+            Escape(&self.start_symbol),
+            self.prefix
+        );
+        rust!(self.out, "Ok({}nt)", self.prefix);
+        rust!(self.out, "}}");
+
+        // nothing else should be possible
+        rust!(self.out, "_ => unreachable!(),");
+        rust!(self.out, "}}");
+
+        self.end_parser_fn()
+    }
+
+    /// Writes the function that corresponds to a given state. This
+    /// function takes arguments corresponding to the stack slots of
+    /// the LR(1) machine. It consumes tokens and handles reduces
+    /// etc. It will return once it has popped at least one symbol off
+    /// of the LR stack.
+    ///
+    /// Note that for states which have a custom kind, this function
+    /// emits nothing at all other than a possible comment explaining
+    /// the state.
+    fn write_state_fn(&mut self, this_index: StateIndex) -> io::Result<()> {
+        let this_state = &self.states[this_index.0];
+        let inputs = self.custom.state_inputs[this_index.0];
+
+        rust!(self.out, "");
+
+        // Leave a comment explaining what this state is.
+        if Tls::session().emit_comments {
+            rust!(self.out, "// State {}", this_index.0);
+            rust!(self.out, "//     AllInputs = {:?}", inputs.all);
+            rust!(self.out, "//     OptionalInputs = {:?}", inputs.optional());
+            rust!(self.out, "//     FixedInputs = {:?}", inputs.fixed());
+            rust!(
+                self.out,
+                "//     WillPushLen = {:?}",
+                this_state.will_push().len()
+            );
+            rust!(self.out, "//     WillPush = {:?}", this_state.will_push());
+            rust!(
+                self.out,
+                "//     WillProduce = {:?}",
+                this_state.will_produce()
+            );
+            rust!(self.out, "//");
+            for item in this_state.items.vec.iter() {
+                rust!(self.out, "//     {:?}", item);
+            }
+            rust!(self.out, "//");
+            for (terminal, action) in &this_state.shifts {
+                rust!(self.out, "//   {:?} -> {:?}", terminal, action);
+            }
+            for &(ref tokens, action) in &this_state.reductions {
+                rust!(self.out, "//   {:?} -> {:?}", tokens, action);
+            }
+            rust!(self.out, "//");
+            for (nt, state) in &this_state.gotos {
+                rust!(self.out, "//     {:?} -> {:?}", nt, state);
+            }
+        }
+
+        try!(self.emit_state_fn_header("state", this_index.0, inputs));
+
+        // possibly move some fixed inputs into optional stack slots
+        let stack_suffix = try!(self.adjust_inputs(this_index, inputs));
+
+        // set to true if goto actions are worth generating
+        let mut fallthrough = false;
+
+        rust!(self.out, "match {}lookahead {{", self.prefix);
+
+        // first emit shifts:
+        for (terminal, &next_index) in &this_state.shifts {
+            let sym_name = format!("{}sym{}", self.prefix, inputs.len());
+            try!(self.consume_terminal(terminal, sym_name));
+
+            // transition to the new state
+            if try!(self.transition("result", stack_suffix, next_index, &["tokens"])) {
+                fallthrough = true;
+            }
+
+            rust!(self.out, "}}");
+        }
+
+        // now emit reduces. It frequently happens that many tokens
+        // trigger the same reduction, so group these by the
+        // production that we are going to be reducing.
+        let reductions: Multimap<_, Vec<_>> = this_state
+            .reductions
+            .iter()
+            .flat_map(|&(ref tokens, production)| tokens.iter().map(move |t| (production, t)))
+            .collect();
+        for (production, tokens) in reductions {
+            for (index, token) in tokens.iter().enumerate() {
+                let pattern = match *token {
+                    Token::Terminal(ref s) => format!("Some({})", self.match_terminal_pattern(s)),
+                    Token::Error => {
+                        panic!("Error recovery is not implemented for recursive ascent parsers")
+                    }
+                    Token::EOF => format!("None"),
+                };
+                if index < tokens.len() - 1 {
+                    rust!(self.out, "{} |", pattern);
+                } else {
+                    rust!(self.out, "{} => {{", pattern);
+                }
+            }
+
+            try!(self.emit_reduce_action("result", stack_suffix, production));
+
+            if production.symbols.len() > 0 {
+                // if we popped anything off of the stack, then this frame is done
+                rust!(self.out, "return Ok({}result);", self.prefix);
+            } else {
+                fallthrough = true;
+            }
+
+            rust!(self.out, "}}");
+        }
+
+        // if we hit this, the next token is not recognized, so generate an error
+        rust!(self.out, "_ => {{");
+        // The terminals which would have resulted in a successful parse in this state
+        let successful_terminals = self.grammar.terminals.all.iter().filter(|&terminal| {
+            this_state.shifts.contains_key(terminal)
+                || this_state
+                    .reductions
+                    .iter()
+                    .any(|&(ref t, _)| t.contains(&Token::Terminal(terminal.clone())))
+        });
+        rust!(
+            self.out,
+            "return Err({}lalrpop_util::ParseError::UnrecognizedToken {{",
+            self.prefix
+        );
+        rust!(self.out, "token: {}lookahead,", self.prefix);
+        rust!(self.out, "expected: vec![");
+        for terminal in successful_terminals {
+            rust!(self.out, "r###\"{}\"###.to_string(),", terminal);
+        }
+        rust!(self.out, "]");
+        rust!(self.out, "}});");
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}}"); // match
+
+        // finally, emit gotos (if relevant)
+        if fallthrough && !this_state.gotos.is_empty() {
+            rust!(self.out, "loop {{");
+
+            // In most states, we know precisely when the top stack
+            // slot will be consumed (basically, when we reduce or
+            // when we transition to another state). But in some states,
+            // we may not know. Consider:
+            //
+            //     X = A (*) "0" ["."]
+            //     X = A (*) B ["."]
+            //     B = (*) "0" "1" ["."]
+            //
+            // Now if we see a `"0"` this *could* be the start of a `B
+            // = "0" "1"` or it could be the continuation of `X = A
+            // "0"`. We won't know until we see the *next* character
+            // (which will either be `"0"` or `"."`). If it turns out to be
+            // `X = A "0"`, then the state handling the `"0"` will reduce
+            // and consume the `A` and the `"0"`. But otherwise it will shift
+            // the `"1"` and leave the `A` unprocessed.
+            //
+            // In cases like this, the `adjust_inputs` routine will
+            // have taken the top of the stack ("A") and put it into
+            // an `Option`. After the state processing the `"0"`
+            // returns then, we can check this option to see whether
+            // it has popped the `"A"` (in which case we ought to
+            // return) or not (in which case we ought to shift the `B`
+            // value that it returned to us).
+            let top_slot_optional =
+                { stack_suffix.is_not_empty() && stack_suffix.fixed().is_empty() };
+            if top_slot_optional {
+                rust!(
+                    self.out,
+                    "if {}sym{}.is_none() {{",
+                    self.prefix,
+                    stack_suffix.len() - 1
+                );
+                rust!(self.out, "return Ok({}result);", self.prefix);
+                rust!(self.out, "}}");
+            }
+
+            rust!(
+                self.out,
+                "let ({}lookahead, {}nt) = {}result;",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+
+            rust!(self.out, "match {}nt {{", self.prefix);
+            for (ref nt, &next_index) in &this_state.gotos {
+                // The nonterminal we are shifting becomes symN, where
+                // N is the number of inputs to this state (which are
+                // numbered sym0..sym(N-1)). It is never optional
+                // because we always transition to a state with at
+                // least *one* fixed input.
+                rust!(
+                    self.out,
+                    "{}Nonterminal::{}({}sym{}) => {{",
+                    self.prefix,
+                    Escape(nt),
+                    self.prefix,
+                    stack_suffix.len()
+                );
+                try!(self.transition("result", stack_suffix, next_index, &["tokens", "lookahead"]));
+                rust!(self.out, "}}");
+            }
+
+            // Errors are not possible in the goto phase; a missing entry
+            // indicates parse successfully completed, so just bail out.
+            if this_state.gotos.len() != self.grammar.nonterminals.keys().len() {
+                rust!(self.out, "_ => {{");
+                rust!(
+                    self.out,
+                    "return Ok(({}lookahead, {}nt));",
+                    self.prefix,
+                    self.prefix
+                );
+                rust!(self.out, "}}");
+            }
+
+            rust!(self.out, "}}"); // match
+
+            rust!(self.out, "}}"); // while/loop
+        } else if fallthrough {
+            rust!(self.out, "return Ok({}result);", self.prefix);
+        }
+
+        rust!(self.out, "}}"); // fn
+
+        Ok(())
+    }
+
+    fn emit_state_fn_header(
+        &mut self,
+        fn_kind: &str,   // e.g. "state", "custom"
+        fn_index: usize, // state index, custom kind index, etc
+        suffix: StackSuffix<'grammar>,
+    ) -> io::Result<()> {
+        let optional_prefix = suffix.optional();
+        let fixed_prefix = suffix.fixed();
+
+        let triple_type = self.triple_type();
+        let parse_error_type = self.types.parse_error_type();
+        let error_type = self.types.error_type();
+
+        // If we are generated the tokenizer, it generates ParseError
+        // errors, otherwise they are user errors.
+        let iter_error_type = if self.grammar.intern_token.is_some() {
+            parse_error_type
+        } else {
+            &error_type
+        };
+
+        let (fn_args, starts_with_terminal) = self.fn_args(optional_prefix, fixed_prefix);
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{}{}{}", self.prefix, fn_kind, fn_index),
+            vec![
+                format!(
+                    "{}TOKENS: Iterator<Item=Result<{},{}>>",
+                    self.prefix, triple_type, iter_error_type
+                ),
+            ],
+            None,
+            fn_args,
+            format!(
+                "Result<(Option<{}>, {}Nonterminal<{}>), {}>",
+                triple_type,
+                self.prefix,
+                Sep(", ", &self.custom.nonterminal_type_params),
+                parse_error_type
+            ),
+            vec![]
+        ));
+
+        rust!(self.out, "{{");
+
+        rust!(
+            self.out,
+            "let mut {}result: (Option<{}>, {}Nonterminal<{}>);",
+            self.prefix,
+            triple_type,
+            self.prefix,
+            Sep(", ", &self.custom.nonterminal_type_params)
+        );
+
+        // shift lookahead is necessary; see `starts_with_terminal` above
+        if starts_with_terminal {
+            try!(self.next_token("lookahead", "tokens"));
+        }
+
+        Ok(())
+    }
+
+    // Compute the set of arguments that the function for a state or
+    // custom-kind expects.  The argument `symbols` represents the top
+    // portion of the stack which this function expects to be given.
+    // Each of them will be given an argument like `sym3: &mut
+    // Option<Sym3>` where `Sym3` is the type of the symbol.
+    //
+    // Returns a list of argument names and a flag if this fn resulted
+    // from pushing a terminal (in which case the lookahead must be
+    // computed interally).
+    fn fn_args(
+        &mut self,
+        optional_prefix: &[Symbol],
+        fixed_prefix: &[Symbol],
+    ) -> (Vec<String>, bool) {
+        assert!(
+            // start state:
+            (optional_prefix.is_empty() && fixed_prefix.is_empty()) ||
+            /* any other state: */ !fixed_prefix.is_empty()
+        );
+        let triple_type = self.triple_type();
+
+        // to reduce the size of the generated code, if the state
+        // results from shifting a terminal, then we do not pass the
+        // lookahead in as an argument, but rather we load it as the
+        // first thing in this function; this saves some space because
+        // there are more edges than there are states in the graph.
+        let starts_with_terminal = fixed_prefix
+            .last()
+            .map(|l| l.is_terminal())
+            .unwrap_or(false);
+
+        let mut base_args = vec![format!("{}tokens: &mut {}TOKENS", self.prefix, self.prefix)];
+        if !starts_with_terminal {
+            base_args.push(format!("{}lookahead: Option<{}>", self.prefix, triple_type));
+        }
+
+        // "Optional symbols" may or may not be consumed, so take an
+        // `&mut Option`
+        let optional_args = (0..optional_prefix.len()).map(|i| {
+            format!(
+                "{}sym{}: &mut Option<{}>",
+                self.prefix,
+                i,
+                self.types
+                    .spanned_type(optional_prefix[i].ty(&self.types).clone())
+            )
+        });
+
+        // "Fixed symbols" will be consumed before we return, so take the value itself
+        let fixed_args = (0..fixed_prefix.len()).map(|i| {
+            format!(
+                "{}sym{}: {}",
+                self.prefix,
+                optional_prefix.len() + i,
+                self.types
+                    .spanned_type(fixed_prefix[i].ty(&self.types).clone())
+            )
+        });
+
+        let all_args = base_args
+            .into_iter()
+            .chain(optional_args)
+            .chain(fixed_args)
+            .chain(Some(format!("_: {}", self.phantom_data_type())))
+            .collect();
+
+        (all_args, starts_with_terminal)
+    }
+
+    /// Examine the states that we may transition to. Unless this is
+    /// the start state, we will always take at least 1 fixed input:
+    /// the most recently pushed symbol (let's call it `symX`), and we
+    /// may have others as well. But if this state can transition to
+    /// another state can takes some of those inputs as optional
+    /// parameters, we need to convert them them options. This
+    /// function thus emits code to move each sum `symX` into an
+    /// option, and returns an adjusted stack-suffix that reflects the
+    /// changes made.
+    fn adjust_inputs(
+        &mut self,
+        state_index: StateIndex,
+        inputs: StackSuffix<'grammar>,
+    ) -> io::Result<StackSuffix<'grammar>> {
+        let mut result = inputs;
+
+        let top_opt = self.custom
+            .graph
+            .successors(state_index)
+            .iter()
+            .any(|succ_state| {
+                let succ_inputs = &self.custom.state_inputs[succ_state.0];
+
+                // Check for a successor state with a suffix like:
+                //
+                //     ... OPT_1 ... OPT_N FIXED_1
+                //
+                // (Remember that *every* successor state will have
+                // at least one fixed input.)
+                //
+                // So basically we are looking for states
+                // that, when they return, may *optionally* have consumed
+                // the top of our stack.
+                assert!(succ_inputs.fixed().len() >= 1);
+                succ_inputs.fixed().len() == 1 && succ_inputs.optional().len() > 0
+            });
+
+        // If we find a successor that may optionally consume the top
+        // of our stack, convert our fixed inputs into optional ones.
+        //
+        // (Here we convert *all* fixed inputs. Honestly, I can't
+        // remember if this is necessary, or just for simplicity. I
+        // suspect the latter. --nmatsakis)
+        if top_opt {
+            let start_num = inputs.optional().len();
+            for sym_num in (start_num..start_num + inputs.fixed().len()) {
+                rust!(
+                    self.out,
+                    "let {}sym{} = &mut Some({}sym{});",
+                    self.prefix,
+                    sym_num,
+                    self.prefix,
+                    sym_num
+                );
+            }
+            result.len_optional = result.len();
+        }
+
+        Ok(result)
+    }
+
+    /// Given that we have, locally, `optional` number of optional stack slots
+    /// followed by `fixed` number of fixed stack slots, prepare the inputs
+    /// to be supplied to `inputs`. Returns a string of names for this inputs.
+    fn pop_syms(
+        &mut self,
+        optional: usize,
+        fixed: usize,
+        inputs: StackSuffix<'grammar>,
+    ) -> io::Result<Vec<String>> {
+        let total_have = optional + fixed;
+        let total_need = inputs.len();
+        (total_have - total_need .. total_have) // number relative to us
+            .zip(0 .. total_need) // number relative to them
+            .map(|(h, n)| {
+                let name = format!("{}sym{}", self.prefix, h);
+                let have_optional = h < optional;
+                let need_optional = n < inputs.len_optional;
+
+                // if we have something stored in an `Option`, but the next state
+                // consumes it unconditionally, then "pop" it
+                if have_optional && !need_optional {
+                    rust!(self.out, "let {} = {}.take().unwrap();", name, name);
+                } else {
+                    // we should never have something stored
+                    // unconditionally that the next state only
+                    // "maybe" consumes -- we should have fixed this
+                    // in the `adjust_inputs` phase
+                    assert_eq!(have_optional, need_optional);
+                }
+                Ok(name)
+            })
+            .collect()
+    }
+
+    /// Emit code to shift/goto into the state `next_index`. Returns
+    /// `true` if the current state may be valid after the target
+    /// state returns, or `false` if `transition` will just return
+    /// afterwards.
+    ///
+    /// # Arguments
+    ///
+    /// - `into_result`: name of variable to store result from target state into
+    /// - `stack_suffix`: the suffix of the LR stack that current state is aware of,
+    ///   and how it is distributed into optional/fixed slots
+    /// - `next_index`: target state
+    /// - `other_args`: other arguments we are threading along
+    fn transition(
+        &mut self,
+        into_result: &str,
+        stack_suffix: StackSuffix<'grammar>,
+        next_index: StateIndex,
+        other_args: &[&str],
+    ) -> io::Result<bool> {
+        // the depth of the suffix of the stack that we are aware of
+        // in the current state, including the newly shifted token
+        let (optional, mut fixed) = stack_suffix.optional_fixed_lens();
+        fixed += 1; // we just shifted another symbol
+        let total = optional + fixed;
+        assert!(total == stack_suffix.len() + 1);
+
+        // symbols that the next state expects; will always be include
+        // at least one fixed input
+        let next_inputs = self.custom.state_inputs[next_index.0];
+        assert!(next_inputs.fixed().len() >= 1);
+        assert!(next_inputs.len() <= total);
+
+        let transfer_syms = try!(self.pop_syms(optional, fixed, next_inputs));
+
+        let other_args = other_args
+            .iter()
+            .map(|s| format!("{}{}", self.prefix, s))
+            .collect();
+
+        let fn_name = format!("{}state{}", self.prefix, next_index.0);
+
+        // invoke next state, transferring the top `m` tokens
+        let phantom_data_expr = self.phantom_data_expr();
+        rust!(
+            self.out,
+            "{}{} = try!({}({}{}, {}, {}));",
+            self.prefix,
+            into_result,
+            fn_name,
+            self.grammar.user_parameter_refs(),
+            Sep(", ", &other_args),
+            Sep(", ", &transfer_syms),
+            phantom_data_expr
+        );
+
+        // if the target state takes at least **two** fixed tokens,
+        // then it will have consumed the top of **our** stack frame,
+        // so we should just return
+        if next_inputs.fixed().len() >= 2 {
+            rust!(self.out, "return Ok({}{});", self.prefix, into_result);
+            Ok(false)
+        } else {
+            Ok(true)
+        }
+    }
+
+    /// Executes a reduction of `production`, storing the result into
+    /// the variable `into_var`, which should have type
+    /// `(Option<(L,T,L)>, Nonterminal)`.
+    fn emit_reduce_action(
+        &mut self,
+        into_var: &str,
+        stack_suffix: StackSuffix<'grammar>,
+        production: &'grammar Production,
+    ) -> io::Result<()> {
+        let loc_type = self.types.terminal_loc_type();
+
+        let (optional, fixed) = stack_suffix.optional_fixed_lens();
+        let production_inputs = StackSuffix {
+            all: &production.symbols,
+            len_optional: 0,
+        };
+        let transfer_syms = try!(self.pop_syms(optional, fixed, production_inputs));
+
+        // identify the "start" location for this production; this
+        // is typically the start of the first symbol we are
+        // reducing; but in the case of an empty production, it
+        // will be the last symbol pushed, or at worst `default`.
+        if let Some(first_sym) = transfer_syms.first() {
+            rust!(
+                self.out,
+                "let {}start = {}.0.clone();",
+                self.prefix,
+                first_sym
+            );
+        } else if stack_suffix.len() > 0 {
+            // we pop no symbols, so grab from the top of the stack
+            // (unless we are in the start state)
+            let top = stack_suffix.len() - 1;
+            if !stack_suffix.fixed().is_empty() {
+                rust!(
+                    self.out,
+                    "let {}start = {}sym{}.2.clone();",
+                    self.prefix,
+                    self.prefix,
+                    top
+                );
+            } else {
+                // top of stack is optional; should not have been popped yet tho
+                rust!(
+                    self.out,
+                    "let {}start = {}sym{}.as_ref().unwrap().2.clone();",
+                    self.prefix,
+                    self.prefix,
+                    top
+                );
+            }
+        } else {
+            // this only occurs in the start state
+            rust!(
+                self.out,
+                "let {}start: {} = ::std::default::Default::default();",
+                self.prefix,
+                loc_type
+            );
+        }
+
+        // identify the "end" location for this production;
+        // this is typically the end of the last symbol we are reducing,
+        // but in the case of an empty production it will come from the
+        // lookahead
+        if let Some(last_sym) = transfer_syms.last() {
+            rust!(self.out, "let {}end = {}.2.clone();", self.prefix, last_sym);
+        } else {
+            rust!(
+                self.out,
+                "let {}end = {}lookahead.as_ref().map(|o| o.0.clone()).unwrap_or_else(|| \
+                 {}start.clone());",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        let transfered_syms = transfer_syms.len();
+
+        let mut args = transfer_syms;
+        if transfered_syms == 0 {
+            args.push(format!("&{}start", self.prefix));
+            args.push(format!("&{}end", self.prefix));
+        }
+
+        // invoke the action code
+        let is_fallible = self.grammar.action_is_fallible(production.action);
+        if is_fallible {
+            rust!(
+                self.out,
+                "let {}nt = try!({}::{}action{}::<{}>({}{}));",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            )
+        } else {
+            rust!(
+                self.out,
+                "let {}nt = {}::{}action{}::<{}>({}{});",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            )
+        }
+
+        // wrap up the produced value into `Nonterminal` along with
+        rust!(
+            self.out,
+            "let {}nt = {}Nonterminal::{}((",
+            self.prefix,
+            self.prefix,
+            Escape(&production.nonterminal)
+        );
+        rust!(self.out, "{}start,", self.prefix);
+        rust!(self.out, "{}nt,", self.prefix);
+        rust!(self.out, "{}end,", self.prefix);
+        rust!(self.out, "));");
+
+        // wrap up the result along with the (unused) lookahead
+        rust!(
+            self.out,
+            "{}{} = ({}lookahead, {}nt);",
+            self.prefix,
+            into_var,
+            self.prefix,
+            self.prefix
+        );
+
+        Ok(())
+    }
+
+    /// Emit a pattern that matches `id` but doesn't extract any data.
+    fn match_terminal_pattern(&mut self, id: &TerminalString) -> String {
+        let pattern = self.grammar.pattern(id).map(&mut |_| "_");
+        let pattern = format!("{}", pattern);
+        format!("(_, {}, _)", pattern)
+    }
+
+    /// Emit a pattern that matches `id` and extracts its value, storing
+    /// that value as `let_name`.
+    fn consume_terminal(&mut self, id: &TerminalString, let_name: String) -> io::Result<()> {
+        let mut pattern_names = vec![];
+        let pattern = self.grammar.pattern(id).map(&mut |_| {
+            let index = pattern_names.len();
+            pattern_names.push(format!("{}tok{}", self.prefix, index));
+            pattern_names.last().cloned().unwrap()
+        });
+
+        let mut pattern = format!("{}", pattern);
+        if pattern_names.is_empty() {
+            pattern_names.push(format!("{}tok", self.prefix));
+            pattern = format!("{}tok @ {}", self.prefix, pattern);
+        }
+
+        pattern = format!("({}loc1, {}, {}loc2)", self.prefix, pattern, self.prefix);
+
+        rust!(self.out, "Some({}) => {{", pattern);
+
+        rust!(
+            self.out,
+            "let {} = ({}loc1, ({}), {}loc2);",
+            let_name,
+            self.prefix,
+            pattern_names.join(", "),
+            self.prefix
+        );
+
+        Ok(())
+    }
+
+    fn triple_type(&self) -> TypeRepr {
+        self.types.triple_type()
+    }
+
+    fn next_token(&mut self, lookahead: &str, tokens: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}{} = match {}{}.next() {{",
+            self.prefix,
+            lookahead,
+            self.prefix,
+            tokens
+        );
+        rust!(self.out, "Some(Ok(v)) => Some(v),");
+        rust!(self.out, "None => None,");
+        if self.grammar.intern_token.is_some() {
+            // when we generate the tokenizer, the generated errors are `ParseError` values
+            rust!(self.out, "Some(Err(e)) => return Err(e),");
+        } else {
+            // otherwise, they are user errors
+            rust!(
+                self.out,
+                "Some(Err(e)) => return Err({}lalrpop_util::ParseError::User {{ error: e }}),",
+                self.prefix
+            );
+        }
+        rust!(self.out, "}};");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/codegen/base.rs
@@ -0,0 +1,279 @@
+//! Base helper routines for a code generator.
+
+use grammar::repr::*;
+use lr1::core::*;
+use rust::RustWrite;
+use std::io::{self, Write};
+use util::Sep;
+
+/// Base struct for various kinds of code generator. The flavor of
+/// code generator is customized by supplying distinct types for `C`
+/// (e.g., `self::ascent::RecursiveAscent`).
+pub struct CodeGenerator<'codegen, 'grammar: 'codegen, W: Write + 'codegen, C> {
+    /// the complete grammar
+    pub grammar: &'grammar Grammar,
+
+    /// some suitable prefix to separate our identifiers from the user's
+    pub prefix: &'grammar str,
+
+    /// types from the grammar
+    pub types: &'grammar Types,
+
+    /// the start symbol S the user specified
+    pub user_start_symbol: NonterminalString,
+
+    /// the synthetic start symbol S' that we specified
+    pub start_symbol: NonterminalString,
+
+    /// the vector of states
+    pub states: &'codegen [LR1State<'grammar>],
+
+    /// where we write output
+    pub out: &'codegen mut RustWrite<W>,
+
+    /// where to find the action routines (typically `super`)
+    pub action_module: String,
+
+    /// custom fields for the specific kind of codegenerator
+    /// (recursive ascent, table-driven, etc)
+    pub custom: C,
+
+    pub repeatable: bool,
+}
+
+impl<'codegen, 'grammar, W: Write, C> CodeGenerator<'codegen, 'grammar, W, C> {
+    pub fn new(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'codegen [LR1State<'grammar>],
+        out: &'codegen mut RustWrite<W>,
+        repeatable: bool,
+        action_module: &str,
+        custom: C,
+    ) -> Self {
+        CodeGenerator {
+            grammar: grammar,
+            prefix: &grammar.prefix,
+            types: &grammar.types,
+            states: states,
+            user_start_symbol: user_start_symbol,
+            start_symbol: start_symbol,
+            out: out,
+            custom: custom,
+            repeatable: repeatable,
+            action_module: action_module.to_string(),
+        }
+    }
+
+    pub fn write_parse_mod<F>(&mut self, body: F) -> io::Result<()>
+    where
+        F: FnOnce(&mut Self) -> io::Result<()>,
+    {
+        rust!(self.out, "");
+        rust!(self.out, "#[cfg_attr(rustfmt, rustfmt_skip)]");
+        rust!(self.out, "mod {}parse{} {{", self.prefix, self.start_symbol);
+
+        // these stylistic lints are annoying for the generated code,
+        // which doesn't follow conventions:
+        rust!(
+            self.out,
+            "#![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, \
+             unused_imports, unused_parens)]"
+        );
+        rust!(self.out, "");
+
+        try!(self.write_uses());
+
+        try!(body(self));
+
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    pub fn write_uses(&mut self) -> io::Result<()> {
+        try!(
+            self.out
+                .write_uses(&format!("{}::", self.action_module), &self.grammar)
+        );
+
+        if self.grammar.intern_token.is_some() {
+            rust!(
+                self.out,
+                "use {}::{}intern_token::Token;",
+                self.action_module,
+                self.prefix
+            );
+        } else {
+            rust!(
+                self.out,
+                "use {}::{}ToTriple;",
+                self.action_module,
+                self.prefix
+            );
+        }
+
+        Ok(())
+    }
+
+    pub fn start_parser_fn(&mut self) -> io::Result<()> {
+        let error_type = self.types.error_type();
+        let parse_error_type = self.types.parse_error_type();
+
+        let (type_parameters, parameters, mut where_clauses);
+
+        let intern_token = self.grammar.intern_token.is_some();
+        if intern_token {
+            // if we are generating the tokenizer, we just need the
+            // input, and that has already been added as one of the
+            // user parameters
+            type_parameters = vec![];
+            parameters = vec![];
+            where_clauses = vec![];
+        } else {
+            // otherwise, we need an iterator of type `TOKENS`
+            let mut user_type_parameters = String::new();
+            for type_parameter in &self.grammar.type_parameters {
+                user_type_parameters.push_str(&format!("{}, ", type_parameter));
+            }
+            type_parameters = vec![
+                format!(
+                    "{}TOKEN: {}ToTriple<{}Error={}>",
+                    self.prefix, self.prefix, user_type_parameters, error_type
+                ),
+                format!(
+                    "{}TOKENS: IntoIterator<Item={}TOKEN>",
+                    self.prefix, self.prefix
+                ),
+            ];
+            parameters = vec![format!("{}tokens0: {}TOKENS", self.prefix, self.prefix)];
+            where_clauses = vec![];
+
+            if self.repeatable {
+                where_clauses.push(format!("{}TOKENS: Clone", self.prefix));
+            }
+        }
+
+        rust!(
+            self.out,
+            "{}struct {}Parser {{",
+            self.grammar.nonterminals[&self.start_symbol].visibility,
+            self.user_start_symbol
+        );
+        if intern_token {
+            rust!(
+                self.out,
+                "builder: {1}::{0}intern_token::{0}MatcherBuilder,",
+                self.prefix,
+                self.action_module
+            );
+        }
+        rust!(self.out, "_priv: (),");
+        rust!(self.out, "}}");
+        rust!(self.out, "");
+
+        rust!(self.out, "impl {}Parser {{", self.user_start_symbol);
+        rust!(
+            self.out,
+            "{}fn new() -> {}Parser {{",
+            self.grammar.nonterminals[&self.start_symbol].visibility,
+            self.user_start_symbol
+        );
+        if intern_token {
+            rust!(
+                self.out,
+                "let {0}builder = {1}::{0}intern_token::{0}MatcherBuilder::new();",
+                self.prefix,
+                self.action_module
+            );
+        }
+        rust!(self.out, "{}Parser {{", self.user_start_symbol);
+        if intern_token {
+            rust!(self.out, "builder: {}builder,", self.prefix);
+        }
+        rust!(self.out, "_priv: (),");
+        rust!(self.out, "}}"); // Parser
+        rust!(self.out, "}}"); // new()
+        rust!(self.out, "");
+
+        rust!(self.out, "#[allow(dead_code)]");
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &self.grammar.nonterminals[&self.start_symbol].visibility,
+            "parse".to_owned(),
+            type_parameters,
+            Some("&self".to_owned()),
+            parameters,
+            format!(
+                "Result<{}, {}>",
+                self.types.nonterminal_type(&self.start_symbol),
+                parse_error_type
+            ),
+            where_clauses
+        ));
+        rust!(self.out, "{{");
+
+        Ok(())
+    }
+
+    pub fn define_tokens(&mut self) -> io::Result<()> {
+        if self.grammar.intern_token.is_some() {
+            // if we are generating the tokenizer, create a matcher as our input iterator
+            rust!(
+                self.out,
+                "let mut {}tokens = self.builder.matcher(input);",
+                self.prefix
+            );
+        } else {
+            // otherwise, convert one from the `IntoIterator`
+            // supplied, using the `ToTriple` trait which inserts
+            // errors/locations etc if none are given
+            let clone_call = if self.repeatable { ".clone()" } else { "" };
+            rust!(
+                self.out,
+                "let {}tokens = {}tokens0{}.into_iter();",
+                self.prefix,
+                self.prefix,
+                clone_call
+            );
+
+            rust!(
+                self.out,
+                "let mut {}tokens = {}tokens.map(|t| {}ToTriple::to_triple(t));",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        Ok(())
+    }
+
+    pub fn end_parser_fn(&mut self) -> io::Result<()> {
+        rust!(self.out, "}}"); // fn
+        rust!(self.out, "}}"); // impl
+        Ok(())
+    }
+
+    /// Returns phantom data type that captures the user-declared type
+    /// parameters in a phantom-data. This helps with ensuring that
+    /// all type parameters are constrained, even if they are not
+    /// used.
+    pub fn phantom_data_type(&self) -> String {
+        format!(
+            "::std::marker::PhantomData<({})>",
+            Sep(", ", &self.grammar.non_lifetime_type_parameters())
+        )
+    }
+
+    /// Returns expression that captures the user-declared type
+    /// parameters in a phantom-data. This helps with ensuring that
+    /// all type parameters are constrained, even if they are not
+    /// used.
+    pub fn phantom_data_expr(&self) -> String {
+        format!(
+            "::std::marker::PhantomData::<({})>",
+            Sep(", ", &self.grammar.non_lifetime_type_parameters())
+        )
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/codegen/mod.rs
@@ -0,0 +1,4 @@
+pub mod ascent;
+mod base;
+pub mod parse_table;
+pub mod test_all;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/codegen/parse_table.rs
@@ -0,0 +1,2168 @@
+//! A compiler from an LR(1) table to a traditional table driven parser.
+
+use collections::{Entry, Map, Set};
+use grammar::parse_tree::WhereClause;
+use grammar::repr::*;
+use string_cache::DefaultAtom as Atom;
+use lr1::core::*;
+use lr1::lookahead::Token;
+use rust::RustWrite;
+use std::fmt;
+use std::io::{self, Write};
+use tls::Tls;
+use util::Sep;
+
+use super::base::CodeGenerator;
+
+const DEBUG_PRINT: bool = false;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    action_module: &str,
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let mut table_driven = CodeGenerator::new_table_driven(
+        grammar,
+        user_start_symbol,
+        start_symbol,
+        states,
+        action_module,
+        out,
+    );
+    table_driven.write()
+}
+
+// We create three parse tables:
+//
+// - `ACTION[state * num_states + terminal]: i32`: given a state and next token,
+//   yields an integer indicating whether to shift/reduce (see below)
+// - `EOF_ACTION[state]: i32`: as above, but for the EOF token
+// - `GOTO[state * num_states + nonterminal]: i32`: index + 1 of state to jump to when given
+//   nonterminal is pushed (no error is possible)
+//
+// For the `ACTION` and `EOF_ACTION` tables, the value is an `i32` and
+// its interpretation varies depending on whether it is positive or
+// negative:
+//
+// - if zero, parse error.
+// - if a positive integer (not zero), it is the next state to shift to.
+// - if a negative integer (not zero), it is the index of a reduction
+//   action to execute (actually index + 1).
+//
+// We maintain two stacks: one is a stack of state indexes (each an
+// u32). The other is a stack of values and spans: `(L, T, L)`. `L` is
+// the location type and represents the start/end span. `T` is the
+// value of the symbol. The type `T` is an `enum` that we synthesize
+// which contains a variant for all the possibilities:
+//
+// ```
+// enum Value<> {
+//     // One variant for each terminal:
+//     Term1(Ty1),
+//     ...
+//     TermN(TyN),
+//
+//     // One variant for each nonterminal:
+//     Nt1(Ty1),
+//     ...
+//     NtN(TyN),
+// }
+// ```
+//
+// The action parser function looks like this (pseudo-code):
+//
+// ```
+// fn parse_fn<TOKENS>(tokens: TOKENS) -> Result<T, Error>
+//    where TOKENS: Iterator<Item=Result<(Location, Token, Location), Error>>
+// {
+//    let mut states = vec![0]; // initial state is zero
+//    let mut symbols = vec![];
+//    'shift: loop {
+//        // Code to shift the next symbol and determine which terminal
+//        // it is; emitted by `shift_symbol()`.
+//        let lookahead = match tokens.next() {
+//            Some(Ok(l)) => l,
+//            None => break 'shift,
+//            Some(Err(e)) => return Err(e),
+//        };
+//        let integer = match lookahead {
+//            (_, PatternForTerminal0(...), _) => 0,
+//            ...
+//        };
+//
+//        // Code to process next symbol.
+//        'inner: loop {
+//            let symbol = match lookahead {
+//               (l, PatternForTerminal0(...), r) => {
+//                   (l, Value::VariantForTerminal0(...), r),
+//               }
+//               ...
+//            };
+//            let state = *states.last().unwrap() as usize;
+//            let action = ACTION[state * NUM_STATES + integer];
+//            if action > 0 { // shift
+//                states.push(action - 1);
+//                symbols.push(symbol);
+//                continue 'shift;
+//            } else if action < 0 { // reduce
+//                if let Some(r) = reduce(action, Some(&lookahead.0), &mut states, &mut symbols) {
+//                    // Give errors from within grammar a higher priority
+//                    if r.is_err() {
+//                        return r;
+//                    }
+//                    return Err(lalrpop_util::ParseError::ExtraToken { token: lookahead });
+//                }
+//            } else {
+//                // Error recovery code: emitted by `try_error_recovery`
+//                let mut err_lookahead = Some(lookahead);
+//                let mut err_integer = Some(integer);
+//                match error_recovery(&mut tokens, &mut states, &mut symbols, last_location,
+//                                     &mut err_lookahead, &mut err_integer) {
+//                  Err(e) => return e,
+//                  Ok(Some(v)) => return Ok(v),
+//                  Ok(None) => { }
+//                }
+//                match (err_lookahead, err_integer) {
+//                  (Some(l), Some(i)) => {
+//                    lookahead = l;
+//                    integer = i;
+//                    continue 'inner;
+//                  }
+//                  _ => break 'shift;
+//                }
+//            }
+//        }
+//    }
+//
+//    // Process EOF
+//    while let Some(state) = self.states.pop() {
+//        let action = EOF_ACTION[state * NUM_STATES];
+//        if action < 0 { // reduce
+//            try!(reduce(action, None, &mut states, &mut symbols));
+//        } else {
+//            let mut err_lookahead = None;
+//            let mut err_integer = None;
+//            match error_recovery(&mut tokens, &mut states, &mut symbols, last_location,
+//                                 &mut err_lookahead, &mut err_integer) {
+//              Err(e) => return e,
+//              Ok(Some(v)) => return Ok(v),
+//              Ok(None) => { }
+//            }
+//        }
+//    }
+// }
+//
+// // generated by `emit_reduce_actions()`
+// fn reduce(action: i32, lookahead_start: Option<&L>,
+//           states: &mut Vec<i32>, symbols: &mut Vec<(L, Symbol, L))
+//           -> Option<Result<..>> {
+//     let nonterminal = match -action {
+//        0 => {
+//            // Execute reduce action 0 to produce nonterminal N, popping from stacks etc
+//            // (generated by `emit_reduce_action()`). If this is a fallible action,
+//            // it may return `Some(Err)`, and if this is a reduce of the start NT,
+//            // it may return `Some(Ok)`.
+//            states.pop(); // however many times
+//            symbols.pop(); // however many times
+//            let data = action_fn0(...);
+//            symbols.push((l, Value::VariantForNonterminalN(data), r));
+//            N
+//        }
+//        ...
+//     };
+//     let state = *states.last().unwrap();
+//     let next_state = GOTO[state * NUM_STATES + nonterminal] - 1;
+//     state_stack.push(next_state);
+//     None
+// }
+//
+// generated by `write_error_recovery_fn`
+// fn error_recovery(...) {
+//     let mut dropped_tokens = vec![];
+//
+//     // First, reduce as long as we can with the `!` token as lookahead
+//     loop {
+//         let state = *states.last().unwrap() as usize;
+//         let action = ACTION[(state + 1) * ACTIONS_PER_STATE - 1];
+//         if action >= 0 {
+//             break;
+//         }
+//         if let Some(r) = reduce(action, None, &mut states, &mut symbols) {
+//             return r;
+//         }
+//     }
+//
+//     let top0;
+//     'find_state: loop {
+//         // See if there is a state that can shift `!` token. If so,
+//         // break.
+//         for top in (0..states.len()).rev() {
+//             let state = states[top];
+//             let action = ACTION[state * ACTIONS_PER_STATE + 1];
+//             if action <= 0 { continue; }
+//             let error_state = action - 1;
+//             if accepts(error_state, &states[..top+1], *opt-integer) {
+//                 top0 = top;
+//                 break 'find_state;
+//             }
+//         }
+//
+//         // Else, drop a token from the input and try again.
+//         'eof: loop {
+//             match opt_lookahead.take() {
+//                 None => {
+//                     // No more tokens to drop
+//                     return Err(...);
+//                 }
+//                 Some(mut lookahead) => {
+//                     dropped_tokens.push(lookahead);
+//                     next_token()
+//                     opt_lookahead = Some(match tokens.next() {
+//                         Some(Ok(l)) => l,
+//                         None => break 'eof,
+//                         Some(Err(e)) => return Err(e),
+//                     });
+//                     opt_integer = Some(match lookahead {
+//                         (_, PatternForTerminal0(...), _) => 0,
+//                         ...
+//                     });
+//                     continue 'find_state;
+//                 }
+//             }
+//         }
+//         opt_lookahead = None;
+//         opt_integer = None;
+//     }
+//
+//     let top = top0;
+//     let start = /* figure out "start" of error */;
+//     let end = /* figure out "end" of error */;
+//     states.truncate(top + 1);
+//     symbols.truncate(top);
+//     let recover_state = states[top];
+//     let error_state = ACTION[recover_state * ACTIONS_PER_STATE + 1] - 1;
+//     states.push(error_state);
+//     let recovery = ErrorRecovery { dropped_tokens, ... };
+//     symbols.push((start, Symbol::Termerror(recovery), end));
+//     Ok(None)
+// }
+// ```
+
+enum Comment<'a, T> {
+    Goto(T, usize),
+    Error(T),
+    Reduce(T, &'a Production),
+}
+
+impl<'a, T: fmt::Display> fmt::Display for Comment<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            Comment::Goto(ref token, new_state) => {
+                write!(f, " // on {}, goto {}", token, new_state)
+            }
+            Comment::Error(ref token) => write!(f, " // on {}, error", token),
+            Comment::Reduce(ref token, production) => {
+                write!(f, " // on {}, reduce `{:?}`", token, production)
+            }
+        }
+    }
+}
+
+struct TableDriven<'grammar> {
+    /// type parameters for the `Nonterminal` type
+    symbol_type_params: Vec<TypeParameter>,
+
+    symbol_where_clauses: Vec<WhereClause<TypeRepr>>,
+
+    /// a list of each nonterminal in some specific order
+    all_nonterminals: Vec<NonterminalString>,
+
+    reduce_indices: Map<&'grammar Production, usize>,
+
+    state_type: &'static str,
+
+    variant_names: Map<Symbol, String>,
+    variants: Map<TypeRepr, String>,
+}
+
+impl<'ascent, 'grammar, W: Write> CodeGenerator<'ascent, 'grammar, W, TableDriven<'grammar>> {
+    fn new_table_driven(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'ascent [LR1State<'grammar>],
+        action_module: &str,
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        // The nonterminal type needs to be parameterized by all the
+        // type parameters that actually appear in the types of
+        // nonterminals.  We can't just use *all* type parameters
+        // because that would leave unused lifetime/type parameters in
+        // some cases.
+        let referenced_ty_params: Set<TypeParameter> = grammar
+            .types
+            .nonterminal_types()
+            .into_iter()
+            .chain(grammar.types.terminal_types())
+            .flat_map(|t| t.referenced())
+            .collect();
+
+        let symbol_type_params: Vec<_> = grammar
+            .type_parameters
+            .iter()
+            .filter(|t| referenced_ty_params.contains(t))
+            .cloned()
+            .collect();
+
+        let mut referenced_where_clauses = Set::new();
+        for wc in &grammar.where_clauses {
+            wc.map(|ty| {
+                if ty.referenced()
+                    .iter()
+                    .any(|p| symbol_type_params.contains(p))
+                {
+                    referenced_where_clauses.insert(wc.clone());
+                }
+            });
+        }
+
+        let symbol_where_clauses: Vec<_> = grammar
+            .where_clauses
+            .iter()
+            .filter(|wc| referenced_where_clauses.contains(wc))
+            .cloned()
+            .collect();
+
+        // Assign each production a unique index to use as the values for reduce
+        // actions in the ACTION and EOF_ACTION tables.
+        let reduce_indices: Map<&'grammar Production, usize> = grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(0..)
+            .collect();
+
+        let state_type = {
+            // `reduce_indices` are allowed to be +1 since the negative maximum of any integer type
+            // is one larger than the positive maximum
+            let max_value = ::std::cmp::max(states.len(), reduce_indices.len() - 1);
+            if max_value <= ::std::i8::MAX as usize {
+                "i8"
+            } else if max_value <= ::std::i16::MAX as usize {
+                "i16"
+            } else {
+                "i32"
+            }
+        };
+
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            false,
+            action_module,
+            TableDriven {
+                symbol_type_params: symbol_type_params,
+                symbol_where_clauses: symbol_where_clauses,
+                all_nonterminals: grammar.nonterminals.keys().cloned().collect(),
+                reduce_indices: reduce_indices,
+                state_type: state_type,
+                variant_names: Map::new(),
+                variants: Map::new(),
+            },
+        )
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_value_type_defn());
+            try!(this.write_parse_table());
+            try!(this.write_parser_fn());
+            try!(this.write_error_recovery_fn());
+            try!(this.write_accepts_fn());
+            try!(this.emit_reduce_actions());
+            try!(this.emit_downcast_fns());
+            Ok(())
+        })
+    }
+
+    fn write_value_type_defn(&mut self) -> io::Result<()> {
+        // sometimes some of the variants are not used, particularly
+        // if we are generating multiple parsers from the same file:
+        rust!(self.out, "#[allow(dead_code)]");
+        rust!(
+            self.out,
+            "pub enum {}Symbol<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.symbol_type_params)
+        );
+
+        if !self.custom.symbol_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.symbol_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        // make one variant per terminal
+        for term in &self.grammar.terminals.all {
+            let ty = self.types.terminal_type(term).clone();
+            let len = self.custom.variants.len();
+            let name = match self.custom.variants.entry(ty.clone()) {
+                Entry::Occupied(entry) => entry.into_mut(),
+                Entry::Vacant(entry) => {
+                    let name = format!("Variant{}", len);
+
+                    rust!(self.out, "{}({}),", name, ty);
+                    entry.insert(name)
+                }
+            };
+
+            self.custom
+                .variant_names
+                .insert(Symbol::Terminal(term.clone()), name.clone());
+        }
+
+        // make one variant per nonterminal
+        for nt in self.grammar.nonterminals.keys() {
+            let ty = self.types.nonterminal_type(nt).clone();
+            let len = self.custom.variants.len();
+            let name = match self.custom.variants.entry(ty.clone()) {
+                Entry::Occupied(entry) => entry.into_mut(),
+                Entry::Vacant(entry) => {
+                    let name = format!("Variant{}", len);
+
+                    rust!(self.out, "{}({}),", name, ty);
+                    entry.insert(name)
+                }
+            };
+
+            self.custom
+                .variant_names
+                .insert(Symbol::Nonterminal(nt.clone()), name.clone());
+        }
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    fn write_parse_table(&mut self) -> io::Result<()> {
+        // The table is a two-dimensional matrix indexed first by state
+        // and then by the terminal index. The value is described above.
+        rust!(
+            self.out,
+            "const {}ACTION: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+
+            if Tls::session().emit_comments {
+                for item in state.items.vec.iter() {
+                    rust!(self.out, "//     {:?}", item);
+                }
+            }
+
+            // Write an action for each terminal (either shift, reduce, or error).
+            let custom = &self.custom;
+            let iterator = self.grammar.terminals.all.iter().map(|terminal| {
+                if let Some(new_state) = state.shifts.get(&terminal) {
+                    (
+                        new_state.0 as i32 + 1,
+                        Comment::Goto(Token::Terminal(terminal.clone()), new_state.0),
+                    )
+                } else {
+                    Self::write_reduction(custom, state, &Token::Terminal(terminal.clone()))
+                }
+            });
+            try!(self.out.write_table_row(iterator))
+        }
+
+        rust!(self.out, "];");
+
+        // Actions on EOF. Indexed just by state.
+        rust!(
+            self.out,
+            "const {}EOF_ACTION: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+            let reduction = Self::write_reduction(&self.custom, state, &Token::EOF);
+            try!(self.out.write_table_row(Some(reduction)));
+        }
+        rust!(self.out, "];");
+
+        // The goto table is indexed by state and *nonterminal*.
+        rust!(
+            self.out,
+            "const {}GOTO: &'static [{}] = &[",
+            self.prefix,
+            self.custom.state_type
+        );
+        for (index, state) in self.states.iter().enumerate() {
+            rust!(self.out, "// State {}", index);
+            let iterator = self.grammar.nonterminals.keys().map(|nonterminal| {
+                if let Some(&new_state) = state.gotos.get(&nonterminal) {
+                    (
+                        new_state.0 as i32 + 1,
+                        Comment::Goto(nonterminal, new_state.0),
+                    )
+                } else {
+                    (0, Comment::Error(nonterminal))
+                }
+            });
+            try!(self.out.write_table_row(iterator));
+        }
+        rust!(self.out, "];");
+
+        try!(self.emit_expected_tokens_fn());
+
+        Ok(())
+    }
+
+    fn write_reduction<'s>(
+        custom: &TableDriven<'grammar>,
+        state: &'s LR1State,
+        token: &Token,
+    ) -> (i32, Comment<'s, Token>) {
+        let reduction = state
+            .reductions
+            .iter()
+            .filter(|&&(ref t, _)| t.contains(token))
+            .map(|&(_, p)| p)
+            .next();
+        if let Some(production) = reduction {
+            let action = custom.reduce_indices[production];
+            (
+                -(action as i32 + 1),
+                Comment::Reduce(token.clone(), production),
+            )
+        } else {
+            // Otherwise, this is an error. Store 0.
+            (0, Comment::Error(token.clone()))
+        }
+    }
+
+    fn write_parser_fn(&mut self) -> io::Result<()> {
+        let phantom_data_expr = self.phantom_data_expr();
+
+        try!(self.start_parser_fn());
+
+        try!(self.define_tokens());
+
+        // State and data stack.
+        rust!(
+            self.out,
+            "let mut {}states = vec![0_{}];",
+            self.prefix,
+            self.custom.state_type
+        );
+        rust!(self.out, "let mut {}symbols = vec![];", self.prefix);
+
+        rust!(self.out, "let mut {}integer;", self.prefix);
+        rust!(self.out, "let mut {}lookahead;", self.prefix);
+        // The location of the last token is necessary for for error recovery at EOF (or they would not have
+        // a location)
+        rust!(
+            self.out,
+            "let {}last_location = &mut Default::default();",
+            self.prefix
+        );
+
+        // Outer loop: each time we continue around this loop, we
+        // shift a new token from the input. We break from the loop
+        // when the end of the input is reached (we return early if an
+        // error occurs).
+        rust!(self.out, "'{}shift: loop {{", self.prefix);
+
+        // Read next token from input.
+        try!(self.next_token("lookahead", "tokens", "last_location", "shift"));
+        try!(self.token_to_integer("integer", "lookahead"));
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"pulled next token from input: {{:?}}\", \
+                 {p}lookahead);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - integer: {{}}\", \
+                 {p}integer);",
+                p = self.prefix
+            );
+        }
+
+        // Loop.
+        rust!(self.out, "'{}inner: loop {{", self.prefix);
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+
+        // Load the next action to take.
+        rust!(
+            self.out,
+            "let {}action = {}ACTION[{}state * {} + {}integer];",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.grammar.terminals.all.len(),
+            self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"state: {{}} lookahead: {{:?}}/{{}} action: {{}} stack-depth: {{}}\", \
+                 {p}state, {p}lookahead, {p}integer, {p}action, {p}symbols.len());",
+                p = self.prefix
+            );
+        }
+
+        // Shift.
+        rust!(self.out, "if {}action > 0 {{", self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"--> shift `{{:?}}`\", {p}lookahead);",
+                p = self.prefix
+            );
+        }
+        try!(self.token_to_symbol());
+        rust!(
+            self.out,
+            "{}states.push({}action - 1);",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "{}symbols.push(({}lookahead.0, {}symbol, {}lookahead.2));",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "continue '{}shift;", self.prefix);
+
+        // Reduce.
+        rust!(self.out, "}} else if {}action < 0 {{", self.prefix);
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"--> reduce\");");
+        }
+        rust!(
+            self.out,
+            "if let Some(r) = {}reduce({}{}action, Some(&{}lookahead.0), &mut {}states, &mut \
+             {}symbols, {}) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            phantom_data_expr
+        );
+        rust!(self.out, "if r.is_err() {{");
+        rust!(self.out, "return r;");
+        rust!(self.out, "}}");
+        rust!(
+            self.out,
+            "return Err({}lalrpop_util::ParseError::ExtraToken {{ token: {}lookahead }});",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}}");
+
+        // Error.
+        rust!(self.out, "}} else {{");
+
+        self.try_error_recovery(
+            "tokens",
+            "states",
+            "symbols",
+            "last_location",
+            Some(("lookahead", "integer", "inner", "shift")),
+        )?;
+
+        rust!(self.out, "}}"); // if-else-if-else
+
+        rust!(self.out, "}}"); // reduce loop
+
+        rust!(self.out, "}}"); // shift loop
+
+        // EOF loop
+        rust!(self.out, "loop {{");
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"EOF loop state: {{}}\", {}state);",
+                self.prefix
+            );
+        }
+        rust!(
+            self.out,
+            "let {}action = {}EOF_ACTION[{}state];",
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"EOF in state {{}} takes action {{}}\", {}state, {}action);",
+                self.prefix,
+                self.prefix
+            );
+        }
+        rust!(self.out, "if {}action < 0 {{", self.prefix);
+        rust!(
+            self.out,
+            "if let Some(r) = {}reduce({}{}action, None, &mut {}states, &mut {}symbols, {}) {{",
+            self.prefix,
+            self.grammar.user_parameter_refs(),
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            phantom_data_expr
+        );
+        rust!(self.out, "return r;");
+        rust!(self.out, "}}");
+        rust!(self.out, "}} else {{");
+
+        self.try_error_recovery("tokens", "states", "symbols", "last_location", None)?;
+
+        rust!(self.out, "}}"); // else
+
+        rust!(self.out, "}}"); // while let
+
+        self.end_parser_fn()
+    }
+
+    fn next_token(
+        &mut self,
+        lookahead: &str,
+        tokens: &str,
+        last_location: &str,
+        break_on_eof: &str,
+    ) -> io::Result<()> {
+        rust!(
+            self.out,
+            "{p}{lookahead} = match {p}{tokens}.next() {{",
+            lookahead = lookahead,
+            tokens = tokens,
+            p = self.prefix
+        );
+        rust!(self.out, "Some(Ok(v)) => v,");
+        rust!(self.out, "None => break '{}{},", self.prefix, break_on_eof); // EOF: break out
+        if self.grammar.intern_token.is_some() {
+            // when we generate the tokenizer, the generated errors are `ParseError` values
+            rust!(self.out, "Some(Err(e)) => return Err(e),");
+        } else {
+            // otherwise, they are user errors
+            rust!(
+                self.out,
+                "Some(Err(e)) => return Err({p}lalrpop_util::ParseError::User {{ error: e }}),",
+                p = self.prefix
+            );
+        }
+        rust!(self.out, "}};");
+        rust!(
+            self.out,
+            "*{p}{last_location} = {p}{lookahead}.2.clone();",
+            last_location = last_location,
+            lookahead = lookahead,
+            p = self.prefix
+        );
+        Ok(())
+    }
+
+    fn token_to_integer(&mut self, integer: &str, lookahead: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "{p}{integer} = match {p}{lookahead}.1 {{",
+            integer = integer,
+            lookahead = lookahead,
+            p = self.prefix
+        );
+        for (terminal, index) in self.grammar.terminals.all.iter().zip(0..) {
+            if *terminal == TerminalString::Error {
+                continue;
+            }
+            let pattern = self.grammar.pattern(terminal).map(&mut |_| "_");
+            rust!(
+                self.out,
+                "{pattern} if true => {index},",
+                pattern = pattern,
+                index = index
+            );
+        }
+
+        rust!(self.out, "_ => {{");
+        let prefix = self.prefix;
+        try!(self.let_unrecognized_token_error(
+            "error",
+            &format!("Some({p}{lookahead})", lookahead = lookahead, p = prefix)
+        ));
+        rust!(self.out, "return Err({p}error);", p = self.prefix);
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn token_to_symbol(&mut self) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}symbol = match {}integer {{",
+            self.prefix,
+            self.prefix
+        );
+        for (terminal, index) in self.grammar.terminals.all.iter().zip(0..) {
+            if *terminal == TerminalString::Error {
+                continue;
+            }
+            rust!(self.out, "{} => match {}lookahead.1 {{", index, self.prefix);
+
+            let mut pattern_names = vec![];
+            let pattern = self.grammar.pattern(terminal).map(&mut |_| {
+                let index = pattern_names.len();
+                pattern_names.push(format!("{}tok{}", self.prefix, index));
+                pattern_names.last().cloned().unwrap()
+            });
+
+            let mut pattern = format!("{}", pattern);
+            if pattern_names.is_empty() {
+                pattern_names.push(format!("{}tok", self.prefix));
+                pattern = format!("{}tok @ {}", self.prefix, pattern);
+            }
+
+            let variant_name = self.variant_name_for_symbol(&Symbol::Terminal(terminal.clone()));
+            rust!(
+                self.out,
+                "{} => {}Symbol::{}(({})),",
+                pattern,
+                self.prefix,
+                variant_name,
+                pattern_names.join(", ")
+            );
+            rust!(self.out, "_ => unreachable!(),");
+            rust!(self.out, "}},");
+        }
+
+        rust!(self.out, "_ => unreachable!(),");
+
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn emit_reduce_actions(&mut self) -> io::Result<()> {
+        let success_type = self.types.nonterminal_type(&self.start_symbol);
+        let parse_error_type = self.types.parse_error_type();
+        let loc_type = self.types.terminal_loc_type();
+        let spanned_symbol_type = self.spanned_symbol_type();
+
+        let parameters = vec![
+            format!("{}action: {}", self.prefix, self.custom.state_type),
+            format!("{}lookahead_start: Option<&{}>", self.prefix, loc_type),
+            format!(
+                "{}states: &mut ::std::vec::Vec<{}>",
+                self.prefix, self.custom.state_type
+            ),
+            format!(
+                "{}symbols: &mut ::std::vec::Vec<{}>",
+                self.prefix, spanned_symbol_type
+            ),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Pub(Some(Path::from_id(Atom::from("crate")))),
+            format!("{}reduce", self.prefix),
+            vec![],
+            None,
+            parameters,
+            format!("Option<Result<{},{}>>", success_type, parse_error_type),
+            vec![]
+        ));
+        rust!(self.out, "{{");
+
+        rust!(
+            self.out,
+            "let ({p}pop_states, {p}symbol, {p}nonterminal) = match -{}action {{",
+            p = self.prefix
+        );
+        for (production, index) in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(1..)
+        {
+            rust!(self.out, "{} => {{", index);
+            // In debug builds LLVM is not very good at reusing stack space which makes this
+            // reduce function take up O(number of states) space. By wrapping each reduce action in
+            // an immediately called closure each reduction takes place in their own function
+            // context which ends up reducing the stack space used.
+
+            // Fallible actions and the start symbol may do early returns so we avoid wrapping
+            // those
+            let is_fallible = self.grammar.action_is_fallible(production.action);
+            let reduce_stack_space = !is_fallible && production.nonterminal != self.start_symbol;
+
+            if reduce_stack_space {
+                rust!(self.out, "(|| {{");
+            }
+
+            try!(self.emit_reduce_action(production));
+
+            if reduce_stack_space {
+                rust!(self.out, "}})()");
+            }
+
+            rust!(self.out, "}}");
+        }
+        rust!(
+            self.out,
+            "_ => panic!(\"invalid action code {{}}\", {}action)",
+            self.prefix
+        );
+        rust!(self.out, "}};");
+
+        // pop the consumed states from the stack
+        rust!(
+            self.out,
+            "let {p}states_len = {p}states.len();",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "{p}states.truncate({p}states_len - {p}pop_states);",
+            p = self.prefix
+        );
+
+        rust!(self.out, "{p}symbols.push({p}symbol);", p = self.prefix);
+
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "let {}next_state = {}GOTO[{}state * {} + {}nonterminal] - 1;",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.grammar.nonterminals.len(),
+            self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"goto state {{}} from {{}} due to nonterminal {{}}\", {}next_state, \
+                 {}state, {}nonterminal);",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+        rust!(
+            self.out,
+            "{}states.push({}next_state);",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "None");
+        rust!(self.out, "}}");
+        Ok(())
+    }
+
+    fn emit_reduce_action(&mut self, production: &Production) -> io::Result<()> {
+        rust!(self.out, "// {:?}", production);
+
+        // Pop each of the symbols and their associated states.
+        for (index, symbol) in production.symbols.iter().enumerate().rev() {
+            let name = self.variant_name_for_symbol(symbol);
+            rust!(
+                self.out,
+                "let {}sym{} = {}pop_{}({}symbols);",
+                self.prefix,
+                index,
+                self.prefix,
+                name,
+                self.prefix
+            );
+        }
+        let transfer_syms: Vec<_> = (0..production.symbols.len())
+            .map(|i| format!("{}sym{}", self.prefix, i))
+            .collect();
+
+        // Execute the action fn
+        // identify the "start" location for this production; this
+        // is typically the start of the first symbol we are
+        // reducing; but in the case of an empty production, it
+        // will be the last symbol pushed, or at worst `default`.
+        if let Some(first_sym) = transfer_syms.first() {
+            rust!(
+                self.out,
+                "let {}start = {}.0.clone();",
+                self.prefix,
+                first_sym
+            );
+        } else {
+            // we pop no symbols, so grab from the top of the stack
+            // (unless we are in the start state, in which case the
+            // stack will be empty)
+            rust!(
+                self.out,
+                "let {}start = {}symbols.last().map(|s| s.2.clone()).unwrap_or_default();",
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        // identify the "end" location for this production;
+        // this is typically the end of the last symbol we are reducing,
+        // but in the case of an empty production it will come from the
+        // lookahead
+        if let Some(last_sym) = transfer_syms.last() {
+            rust!(self.out, "let {}end = {}.2.clone();", self.prefix, last_sym);
+        } else {
+            rust!(
+                self.out,
+                "let {}end = {}lookahead_start.cloned().unwrap_or_else(|| \
+                 {}start.clone());",
+                self.prefix,
+                self.prefix,
+                self.prefix
+            );
+        }
+
+        let transfered_syms = transfer_syms.len();
+
+        let mut args = transfer_syms;
+        if transfered_syms == 0 {
+            args.push(format!("&{}start", self.prefix));
+            args.push(format!("&{}end", self.prefix));
+        }
+
+        // invoke the action code
+        let is_fallible = self.grammar.action_is_fallible(production.action);
+        if is_fallible {
+            rust!(
+                self.out,
+                "let {}nt = match {}::{}action{}::<{}>({}{}) {{",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            );
+            rust!(self.out, "Ok(v) => v,");
+            rust!(self.out, "Err(e) => return Some(Err(e)),");
+            rust!(self.out, "}};");
+        } else {
+            rust!(
+                self.out,
+                "let {}nt = {}::{}action{}::<{}>({}{});",
+                self.prefix,
+                self.action_module,
+                self.prefix,
+                production.action.index(),
+                Sep(", ", &self.grammar.non_lifetime_type_parameters()),
+                self.grammar.user_parameter_refs(),
+                Sep(", ", &args)
+            );
+        }
+
+        // if this is the final state, return it
+        if production.nonterminal == self.start_symbol {
+            rust!(self.out, "return Some(Ok({}nt));", self.prefix);
+            return Ok(());
+        }
+
+        // push the produced value on the stack
+        let name =
+            self.variant_name_for_symbol(&Symbol::Nonterminal(production.nonterminal.clone()));
+        rust!(
+            self.out,
+            "let {}symbol = ({}start, {}Symbol::{}({}nt), {}end);",
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            name,
+            self.prefix,
+            self.prefix
+        );
+
+        // produce the index that we will use to extract the next state
+        // from GOTO array
+        let index = self.custom
+            .all_nonterminals
+            .iter()
+            .position(|x| *x == production.nonterminal)
+            .unwrap();
+        rust!(
+            self.out,
+            "({len}, {p}symbol, {index})",
+            p = self.prefix,
+            index = index,
+            len = production.symbols.len()
+        );
+
+        Ok(())
+    }
+
+    fn variant_name_for_symbol(&mut self, s: &Symbol) -> String {
+        self.custom.variant_names[s].clone()
+    }
+
+    fn emit_downcast_fns(&mut self) -> io::Result<()> {
+        for (ty, name) in self.custom.variants.clone() {
+            try!(self.emit_downcast_fn(&name, ty));
+        }
+
+        Ok(())
+    }
+
+    fn emit_downcast_fn(&mut self, variant_name: &str, variant_ty: TypeRepr) -> io::Result<()> {
+        let spanned_symbol_type = self.spanned_symbol_type();
+
+        rust!(self.out, "fn {}pop_{}<", self.prefix, variant_name);
+        for type_parameter in &self.custom.symbol_type_params {
+            rust!(self.out, "  {},", type_parameter);
+        }
+        rust!(self.out, ">(");
+        rust!(
+            self.out,
+            "{}symbols: &mut ::std::vec::Vec<{}>",
+            self.prefix,
+            spanned_symbol_type
+        );
+        rust!(self.out, ") -> {}", self.types.spanned_type(variant_ty));
+
+        if !self.custom.symbol_where_clauses.is_empty() {
+            rust!(
+                self.out,
+                " where {}",
+                Sep(", ", &self.custom.symbol_where_clauses)
+            );
+        }
+
+        rust!(self.out, " {{");
+
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"pop_{}\");", variant_name);
+        }
+        rust!(self.out, "match {}symbols.pop().unwrap() {{", self.prefix);
+        rust!(
+            self.out,
+            "({}l, {}Symbol::{}({}v), {}r) => ({}l, {}v, {}r),",
+            self.prefix,
+            self.prefix,
+            variant_name,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "_ => panic!(\"symbol type mismatch\")");
+        rust!(self.out, "}}");
+
+        rust!(self.out, "}}");
+
+        Ok(())
+    }
+
+    /// Tries to invoke the error recovery function. Takes a bunch of
+    /// arguments from the surrounding state:
+    ///
+    /// - `tokens` -- name of a mut variable of type `I` where `I` is an iterator over tokens
+    /// - `symbols` -- name of symbols vector
+    /// - `last_location` -- name of `last_location` variable
+    /// - `opt_lookahead` -- see below
+    ///
+    /// The `opt_lookahead` tuple contains the lookahead -- if any --
+    /// or None for EOF. It is a 4-tuple: (lookahead, integer,
+    /// tok_target, and eof_target). The idea is like this: on entry,
+    /// lookahead/integer have values. On exit, if the next token is
+    /// EOF, because we have dropped all remaining tokens, we will
+    /// `break` to `eof_target`.  Otherwise, we will `continue` to
+    /// `tok_target` after storing next token into the variable
+    /// `lookahead` and its integer index into `integer`.
+    fn try_error_recovery(
+        &mut self,
+        tokens: &str,
+        states: &str,
+        symbols: &str,
+        last_location: &str,
+        opt_lookahead: Option<(&str, &str, &str, &str)>,
+    ) -> io::Result<()> {
+        if let Some((out_lookahead, out_integer, _, _)) = opt_lookahead {
+            rust!(
+                self.out,
+                "let mut {p}err_lookahead = Some({p}{});",
+                out_lookahead,
+                p = self.prefix,
+            );
+
+            rust!(
+                self.out,
+                "let mut {p}err_integer: Option<usize> = Some({p}{});",
+                out_integer,
+                p = self.prefix,
+            );
+        } else {
+            rust!(
+                self.out,
+                "let mut {p}err_lookahead = None;",
+                p = self.prefix,
+            );
+
+            rust!(
+                self.out,
+                "let mut {p}err_integer: Option<usize> = None;",
+                p = self.prefix,
+            );
+        }
+
+        // Easy case: error recovery is disabled. Just error out.
+        if !self.grammar.uses_error_recovery {
+            let prefix = self.prefix;
+            self.let_unrecognized_token_error("error", &format!("{p}err_lookahead", p = prefix))?;
+            rust!(self.out, "return Err({p}error)", p = prefix);
+            return Ok(());
+        }
+
+        let phantom_data_expr = self.phantom_data_expr();
+
+        rust!(
+            self.out,
+            "match {p}error_recovery(\
+             {upr} \
+             &mut {p}{tokens}, \
+             &mut {p}{states}, \
+             &mut {p}{symbols}, \
+             {p}{last_location}, \
+             &mut {p}err_lookahead, \
+             &mut {p}err_integer, \
+             {phantom_data_expr}) {{",
+            upr = self.grammar.user_parameter_refs(),
+            tokens = tokens,
+            states = states,
+            symbols = symbols,
+            last_location = last_location,
+            phantom_data_expr = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "Err({p}e) => return Err({p}e),", p = self.prefix);
+        rust!(
+            self.out,
+            "Ok(Some({p}v)) => return Ok({p}v),",
+            p = self.prefix
+        );
+        rust!(self.out, "Ok(None) => (),");
+        rust!(self.out, "}}");
+
+        if let Some((out_lookahead, out_integer, tok_target, eof_target)) = opt_lookahead {
+            rust!(
+                self.out,
+                "match ({p}err_lookahead, {p}err_integer) {{",
+                p = self.prefix
+            );
+            rust!(self.out, "(Some({p}l), Some({p}i)) => {{", p = self.prefix);
+            rust!(self.out, "{p}{} = {p}l;", out_lookahead, p = self.prefix);
+            rust!(self.out, "{p}{} = {p}i;", out_integer, p = self.prefix);
+            rust!(self.out, "continue '{p}{};", tok_target, p = self.prefix);
+            rust!(self.out, "}}"); // end arm
+            rust!(self.out, "_ => break '{p}{},", eof_target, p = self.prefix);
+            rust!(self.out, "}}"); // end match
+        }
+
+        Ok(())
+    }
+
+    fn write_error_recovery_fn(&mut self) -> io::Result<()> {
+        // Easy case: error recovery is disabled. Just error out.
+        if !self.grammar.uses_error_recovery {
+            return Ok(());
+        }
+
+        let parse_error_type = self.types.parse_error_type();
+        let error_type = self.types.error_type();
+        let spanned_symbol_type = self.spanned_symbol_type();
+        let triple_type = self.types.triple_type();
+        let loc_type = self.types.terminal_loc_type();
+        let prefix = self.prefix;
+        let actions_per_state = self.grammar.terminals.all.len();
+        let start_type = self.types.nonterminal_type(&self.start_symbol);
+
+        // The tokenizr, when we supply it, returns parse
+        // errors. Otherwise, it returns custom user errors.
+        let tok_error_type = if self.grammar.intern_token.is_some() {
+            parse_error_type
+        } else {
+            &error_type
+        };
+
+        let parameters = vec![
+            format!("{p}tokens: &mut {p}I", p = self.prefix),
+            format!(
+                "{p}states: &mut ::std::vec::Vec<{typ}>",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!(
+                "{p}symbols: &mut ::std::vec::Vec<{spanned_symbol_type}>",
+                spanned_symbol_type = spanned_symbol_type,
+                p = self.prefix
+            ),
+            format!(
+                "{p}last_location: &mut {loc_type}",
+                loc_type = loc_type,
+                p = self.prefix
+            ),
+            format!(
+                "{p}opt_lookahead: &mut Option<{triple_type}>",
+                triple_type = triple_type,
+                p = self.prefix
+            ),
+            format!("{p}opt_integer: &mut Option<usize>", p = self.prefix),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{p}error_recovery", p = self.prefix),
+            vec![format!("{p}I", p = self.prefix)],
+            None,
+            parameters,
+            format!(
+                "Result<Option<{start_type}>, {parse_error_type}>",
+                start_type = start_type,
+                parse_error_type = parse_error_type
+            ),
+            vec![
+                format!(
+                    "{p}I: Iterator<Item = \
+                     Result<{triple_type}, {tok_error_type}>\
+                     >",
+                    triple_type = triple_type,
+                    tok_error_type = tok_error_type,
+                    p = self.prefix
+                ),
+            ]
+        ));
+
+        rust!(self.out, "{{");
+
+        self.let_unrecognized_token_error(
+            "error",
+            &format!("{p}opt_lookahead.clone()", p = prefix),
+        )?;
+
+        rust!(self.out, "let mut {}dropped_tokens = vec![];", prefix);
+
+        let phantom_data_expr = self.phantom_data_expr();
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Initiating error recovery in state: {{}}\", \
+                 {p}states.last().unwrap());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - state stack size: {{}}\", \
+                 {p}states.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - symbol stack size: {{}}\", \
+                 {p}symbols.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - opt lookahead: {{:?}}\", \
+                 {p}opt_lookahead);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - opt integer: {{:?}}\", \
+                 {p}opt_integer);",
+                p = self.prefix
+            );
+        }
+
+        // We are going to insert ERROR into the lookahead. So, first,
+        // perform all reductions from current state triggered by having
+        // ERROR in the lookahead.
+        rust!(self.out, "loop {{");
+        rust!(
+            self.out,
+            "let {p}state = *{p}states.last().unwrap() as usize;",
+            p = self.prefix
+        );
+
+        // Access the action with `error` as the lookahead; it is always final
+        // column in the row for this state
+        rust!(
+            self.out,
+            "let {p}action = {p}ACTION[{p}state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        rust!(self.out, "if {p}action >= 0 {{", p = self.prefix);
+        rust!(self.out, "break;");
+        rust!(self.out, "}}");
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery reduces on action: {{}}", {}action);"#,
+                self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}lookahead_start = {p}opt_lookahead.as_ref().map(|l| &l.0);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "if let Some(r) = {p}reduce( \
+             {upr} \
+             {p}action, \
+             {p}lookahead_start, \
+             {p}states, \
+             {p}symbols, \
+             {phantoms} \
+             ) {{",
+            upr = self.grammar.user_parameter_refs(),
+            phantoms = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "return Ok(Some(r?));");
+        rust!(self.out, "}}");
+        rust!(self.out, "}}"); // end reduce loop
+
+        // Now try to find the recovery state.
+
+        rust!(
+            self.out,
+            "let {p}states_len = {p}states.len();",
+            p = self.prefix
+        );
+
+        // I'd rather generate `let top = loop {{...}}` but I do not
+        // to retain compatibility with Rust 1.16.0.
+        rust!(self.out, "let {p}top0;", p = self.prefix);
+
+        rust!(self.out, "'{p}find_state: loop {{", p = self.prefix);
+
+        // Go backwards through the states...
+        rust!(
+            self.out,
+            "for {p}top in (0..{p}states_len).rev() {{",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}state = {p}states[{p}top] as usize;",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Probing recovery from state {{}} (top = {{}}).\", {p}state, {p}top);",
+                p = self.prefix,
+            );
+        }
+        // ...fetch action for error token...
+        rust!(
+            self.out,
+            "let {p}action = {p}ACTION[{p}state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        // ...if action is error or reduce, go to next state...
+        rust!(
+            self.out,
+            "if {p}action <= 0 {{ continue; }}",
+            p = self.prefix
+        );
+        // ...otherwise, action *must* be shift. That would take us into `error_state`.
+        rust!(
+            self.out,
+            "let {p}error_state = {p}action - 1;",
+            p = self.prefix
+        );
+        // If `error_state` can accept this lookahead, we are done.
+        rust!(
+            self.out,
+            "if {p}accepts(\
+             {upr} \
+             {p}error_state, \
+             &{p}states[..{p}top + 1], \
+             *{p}opt_integer, \
+             {phantoms},\
+             ) {{",
+            upr = self.grammar.user_parameter_refs(),
+            phantoms = phantom_data_expr,
+            p = self.prefix
+        );
+        rust!(self.out, "{p}top0 = {p}top;", p = self.prefix);
+        rust!(self.out, "break '{p}find_state;", p = self.prefix);
+        rust!(self.out, "}}"); // end if
+        rust!(self.out, "}}"); // end for
+
+        // Otherwise, if we did not find any enclosing state that can
+        // error and then accept this lookahead, we need to drop the current token.
+
+        // Introduce an artificial loop here so we can break to
+        // it. This is a hack to re-use the `next_token` function.
+        rust!(self.out, "'{p}eof: loop {{", p = self.prefix);
+        rust!(
+            self.out,
+            "match {p}opt_lookahead.take() {{",
+            p = self.prefix
+        );
+
+        // If the lookahead is EOF, and there is no suitable state to
+        // recover to, we just have to abort EOF recovery. Find the
+        // first token that we dropped (if any) and use that as the
+        // point of error.
+        rust!(self.out, "None => {{");
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery: cannot drop EOF; aborting");"#
+            );
+        }
+        rust!(self.out, "return Err({}error)", prefix);
+        rust!(self.out, "}}"); // end None arm
+
+        // Else, drop the current token and shift to the next. If there is a next
+        // token, we will `continue` to the start of the `'find_state` loop.
+        rust!(self.out, "Some(mut {p}lookahead) => {{", p = self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                r#"println!("Error recovery: dropping token `{{:?}}`", {p}lookahead);"#,
+                p = self.prefix,
+            );
+        }
+        rust!(
+            self.out,
+            "{p}dropped_tokens.push({p}lookahead);",
+            p = self.prefix
+        );
+        self.next_token("lookahead", "tokens", "last_location", "eof")?;
+        rust!(self.out, "let {p}integer;", p = self.prefix);
+        try!(self.token_to_integer("integer", "lookahead"));
+        rust!(
+            self.out,
+            "*{p}opt_lookahead = Some({p}lookahead);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "*{p}opt_integer = Some({p}integer);",
+            p = self.prefix
+        );
+        rust!(self.out, "continue '{p}find_state;", p = self.prefix);
+        rust!(self.out, "}}"); // end Some(_) arm
+        rust!(self.out, "}}"); // end match
+        rust!(self.out, "}}"); // end 'eof loop
+
+        // The `next_token` function will break here (out of the
+        // `'eof` loop) when we encounter EOF (i.e., there is no
+        // `next_token`). Just set `opt_lookahead` to `None` in that
+        // case.
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Encountered EOF during error recovery\");"
+            );
+        }
+        rust!(self.out, "*{p}opt_lookahead = None;", p = self.prefix);
+        rust!(self.out, "*{p}opt_integer = None;", p = self.prefix);
+        rust!(self.out, "}};"); // end 'find_state loop
+
+        // If we get here, we are ready to push the error recovery state.
+
+        // We have to compute the span for the error recovery
+        // token. We do this first, before we pop any symbols off the
+        // stack. There are several possibilities, in order of
+        // preference.
+        //
+        // For the **start** of the message, we prefer to use the start of any
+        // popped states. This represents parts of the input we had consumed but
+        // had to roll back and ignore.
+        //
+        // Example:
+        //
+        //       a + (b + /)
+        //              ^ start point is here, since this `+` will be popped off
+        //
+        // If there are no popped states, but there *are* dropped tokens, we can use
+        // the start of those.
+        //
+        // Example:
+        //
+        //       a + (b + c e)
+        //                  ^ start point would be here
+        //
+        // Finally, if there are no popped states *nor* dropped tokens, we can use
+        // the end of the top-most state.
+
+        rust!(self.out, "let {p}top = {p}top0;", p = self.prefix);
+        rust!(
+            self.out,
+            "let {p}start = if let Some({p}popped_sym) = {p}symbols.get({p}top) {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from popped symbol {{:?}}\", \
+                 (&{p}popped_sym.0 .. &{p}popped_sym.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}popped_sym.0.clone()", p = self.prefix);
+        rust!(
+            self.out,
+            "}} else if let Some({p}dropped_token) = {p}dropped_tokens.first() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from dropped token {{:?}}\", \
+                 (&{p}dropped_token.0 .. &{p}dropped_token.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}dropped_token.0.clone()", p = self.prefix);
+        rust!(self.out, "}} else if {p}top > 0 {{", p = self.prefix);
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span starts from end of last retained symbol\");"
+            );
+        }
+        rust!(
+            self.out,
+            "{p}symbols[{p}top - 1].2.clone()",
+            p = self.prefix
+        );
+        rust!(self.out, "}} else {{");
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span starts from default\");");
+        }
+        rust!(self.out, "Default::default()");
+        rust!(self.out, "}};"); // end if
+
+        // For the end span, here are the possibilities:
+        //
+        // We prefer to use the end of the last dropped token.
+        //
+        // Examples:
+        //
+        //       a + (b + /)
+        //              ---
+        //       a + (b c)
+        //              -
+        //
+        // But, if there are no dropped tokens, we will use the end of the popped states,
+        // if any:
+        //
+        //       a + /
+        //         -
+        //
+        // If there are neither dropped tokens *or* popped states,
+        // then the user is simulating insertion of an operator. In
+        // this case, we prefer the start of the lookahead, but
+        // fallback to the start if we are at EOF.
+        //
+        // Examples:
+        //
+        //       a + (b c)
+        //             -
+        rust!(
+            self.out,
+            "let {p}end = if let Some({p}dropped_token) = {p}dropped_tokens.last() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span ends at end of last dropped token {{:?}}\", \
+                 (&{p}dropped_token.0 .. &{p}dropped_token.2));",
+                p = self.prefix,
+            );
+        }
+        rust!(self.out, "{p}dropped_token.2.clone()", p = self.prefix);
+        rust!(
+            self.out,
+            "}} else if {p}states_len - 1 > {p}top {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Span ends at end of last popped symbol {{:?}}\", \
+                 {p}symbols.last().unwrap().2);",
+                p = self.prefix,
+            );
+        }
+        rust!(
+            self.out,
+            "{p}symbols.last().unwrap().2.clone()",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "}} else if let Some({p}lookahead) = {p}opt_lookahead.as_ref() {{",
+            p = self.prefix
+        );
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span ends at start of lookahead\");");
+        }
+        rust!(self.out, "{p}lookahead.0.clone()", p = self.prefix);
+        rust!(self.out, "}} else {{");
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Span ends at start\");");
+        }
+        rust!(self.out, "{p}start.clone()", p = self.prefix);
+        rust!(self.out, "}};"); // end if
+
+        // First we have to pop off the states we are skipping. Note
+        // that the bottom-most state doesn't have a symbol, so the
+        // symbols vector is always 1 shorter, hence we truncate its
+        // length to `{p}top` not `{p}top + 1`.
+        rust!(self.out, "{p}states.truncate({p}top + 1);", p = self.prefix);
+        rust!(self.out, "{p}symbols.truncate({p}top);", p = self.prefix);
+
+        // Now load the new top state.
+        rust!(
+            self.out,
+            "let {p}recover_state = {p}states[{p}top] as usize;",
+            p = self.prefix
+        );
+
+        // Load the error action, which must be a shift.
+        rust!(
+            self.out,
+            "let {p}error_action = {p}ACTION[{p}recover_state * {} + {}];",
+            actions_per_state,
+            actions_per_state - 1,
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}error_state = {p}error_action - 1;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(self.out, "println!(\"Recovering from error:\");");
+            rust!(
+                self.out,
+                "println!(\"  - recovery base state: {{}}\", {p}top);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new top state {{}}\", {p}recover_state);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - error state {{}}\", {p}error_state);",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new stack length: {{}}\", {p}states.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - new symbol length: {{}}\", {p}symbols.len());",
+                p = self.prefix
+            );
+            rust!(
+                self.out,
+                "println!(\"  - span {{:?}}..{{:?}}\", {p}start, {p}end);",
+                p = self.prefix
+            );
+        }
+
+        // Push the error state onto the stack.
+        rust!(self.out, "{p}states.push({p}error_state);", p = self.prefix);
+        rust!(
+            self.out,
+            "let {p}recovery = {}lalrpop_util::ErrorRecovery {{",
+            p = self.prefix
+        );
+        rust!(self.out, "error: {p}error,", p = self.prefix);
+        rust!(
+            self.out,
+            "dropped_tokens: {p}dropped_tokens,",
+            p = self.prefix
+        );
+        rust!(self.out, "}};");
+
+        let error_variant = self.variant_name_for_symbol(&Symbol::Terminal(TerminalString::Error));
+        rust!(
+            self.out,
+            "{p}symbols.push(({p}start, {p}Symbol::{e}({p}recovery), {p}end));",
+            p = self.prefix,
+            e = error_variant
+        );
+
+        rust!(self.out, "Ok(None)");
+        rust!(self.out, "}}"); // end fn
+        Ok(())
+    }
+
+    /// The `accepts` function
+    ///
+    /// ```ignore
+    /// fn __accepts() {
+    ///     error_state: i32,
+    ///     states: &Vec<i32>,
+    ///     opt_integer: Option<usize>,
+    /// ) -> bool {
+    ///     ...
+    /// }
+    /// ```
+    ///
+    /// has the job of figuring out whether the given error state would
+    /// "accept" the given lookahead. We basically trace through the LR
+    /// automaton looking for one of two outcomes:
+    ///
+    /// - the lookahead is eventually shifted
+    /// - we reduce to the end state successfully (in the case of EOF).
+    ///
+    /// If we used the pure LR(1) algorithm, we wouldn't need this
+    /// function, because we would be guaranteed to error immediately
+    /// (and not after some number of reductions). But with an LALR
+    /// (or Lane Table) generated automaton, it is possible to reduce
+    /// some number of times before encountering an error. Failing to
+    /// take this into account can lead error recovery into an
+    /// infinite loop (see the `error_recovery_lalr_loop` test) or
+    /// produce crappy results (see `error_recovery_lock_in`).
+    fn write_accepts_fn(&mut self) -> io::Result<()> {
+        if !self.grammar.uses_error_recovery {
+            return Ok(());
+        }
+
+        let actions_per_state = self.grammar.terminals.all.len();
+        let parameters = vec![
+            format!(
+                "{p}error_state: {typ}",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!(
+                "{p}states: & [{typ}]",
+                p = self.prefix,
+                typ = self.custom.state_type
+            ),
+            format!("{p}opt_integer: Option<usize>", p = self.prefix),
+            format!("_: {}", self.phantom_data_type()),
+        ];
+
+        try!(self.out.write_fn_header(
+            self.grammar,
+            &Visibility::Priv,
+            format!("{}accepts", self.prefix),
+            vec![],
+            None,
+            parameters,
+            format!("bool"),
+            vec![]
+        ));
+        rust!(self.out, "{{");
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"Testing whether state {{}} accepts token {{:?}}\", \
+                 {p}error_state, {p}opt_integer);",
+                p = self.prefix
+            );
+        }
+
+        // Create our own copy of the state stack to play with.
+        rust!(
+            self.out,
+            "let mut {p}states = {p}states.to_vec();",
+            p = self.prefix
+        );
+        rust!(self.out, "{p}states.push({p}error_state);", p = self.prefix);
+
+        rust!(self.out, "loop {{",);
+
+        rust!(
+            self.out,
+            "let mut {}states_len = {}states.len();",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(
+            self.out,
+            "let {p}top = {p}states[{p}states_len - 1] as usize;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"accepts: top-state={{}} num-states={{}}\", {p}top, {p}states_len);",
+                p = self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}action = match {p}opt_integer {{",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "None => {p}EOF_ACTION[{p}top as usize],",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "Some({p}integer) => {p}ACTION[{p}top * {actions_per_state} + {p}integer],",
+            p = self.prefix,
+            actions_per_state = actions_per_state,
+        );
+        rust!(self.out, "}};"); // end `match`
+
+        // If we encounter an error action, we do **not** accept.
+        rust!(
+            self.out,
+            "if {p}action == 0 {{ return false; }}",
+            p = self.prefix
+        );
+
+        // If we encounter a shift action, we DO accept.
+        rust!(
+            self.out,
+            "if {p}action > 0 {{ return true; }}",
+            p = self.prefix
+        );
+
+        // If we encounter a reduce action, we need to simulate its
+        // effect on the state stack.
+        rust!(
+            self.out,
+            "let ({p}to_pop, {p}nt) = match -{p}action {{",
+            p = self.prefix
+        );
+        for (production, index) in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|nt| &nt.productions)
+            .zip(1..)
+        {
+            if Tls::session().emit_comments {
+                rust!(self.out, "// simulate {:?}", production);
+            }
+
+            // if we just reduced the start symbol, that is also an accept criteria
+            if production.nonterminal == self.start_symbol {
+                rust!(self.out, "{} => return true,", index);
+            } else {
+                let num_symbols = production.symbols.len();
+                let nt = self.custom
+                    .all_nonterminals
+                    .iter()
+                    .position(|x| *x == production.nonterminal)
+                    .unwrap();
+                rust!(self.out, "{} => {{", index);
+                if DEBUG_PRINT {
+                    rust!(
+                        self.out,
+                        "println!(r##\"accepts: simulating {:?}\"##);",
+                        production
+                    );
+                }
+                rust!(
+                    self.out,
+                    "({num_symbols}, {nt})",
+                    num_symbols = num_symbols,
+                    nt = nt
+                );
+                rust!(self.out, "}}");
+            }
+        }
+        rust!(
+            self.out,
+            "_ => panic!(\"invalid action code {{}}\", {}action)",
+            self.prefix
+        );
+        rust!(self.out, "}};"); // end match
+
+        rust!(self.out, "{p}states_len -= {p}to_pop;", p = self.prefix);
+        rust!(
+            self.out,
+            "{p}states.truncate({p}states_len);",
+            p = self.prefix
+        );
+        rust!(
+            self.out,
+            "let {p}top = {p}states[{p}states_len - 1] as usize;",
+            p = self.prefix
+        );
+
+        if DEBUG_PRINT {
+            rust!(
+                self.out,
+                "println!(\"accepts: popped {{}} symbols, new top is {{}}, nt is {{}}\", \
+                 {p}to_pop, \
+                 {p}top, \
+                 {p}nt, \
+                 );",
+                p = self.prefix
+            );
+        }
+
+        rust!(
+            self.out,
+            "let {p}next_state = {p}GOTO[{p}top * {num_non_terminals} + {p}nt] - 1;",
+            p = self.prefix,
+            num_non_terminals = self.grammar.nonterminals.len(),
+        );
+
+        rust!(self.out, "{p}states.push({p}next_state);", p = self.prefix);
+
+        rust!(self.out, "}}"); // end loop
+        rust!(self.out, "}}"); // end fn
+
+        Ok(())
+    }
+
+    fn symbol_type(&self) -> String {
+        format!(
+            "{}Symbol<{}>",
+            self.prefix,
+            Sep(", ", &self.custom.symbol_type_params)
+        )
+    }
+
+    fn spanned_symbol_type(&self) -> String {
+        let loc_type = self.types.terminal_loc_type();
+        format!("({},{},{})", loc_type, self.symbol_type(), loc_type)
+    }
+
+    fn let_unrecognized_token_error(&mut self, error_var: &str, token: &str) -> io::Result<()> {
+        rust!(
+            self.out,
+            "let {}state = *{}states.last().unwrap() as usize;",
+            self.prefix,
+            self.prefix
+        );
+        rust!(
+            self.out,
+            "let {}{} = {}lalrpop_util::ParseError::UnrecognizedToken {{",
+            self.prefix,
+            error_var,
+            self.prefix
+        );
+        rust!(self.out, "token: {},", token);
+        rust!(
+            self.out,
+            "expected: {}expected_tokens({}state),",
+            self.prefix,
+            self.prefix
+        );
+        rust!(self.out, "}};");
+        Ok(())
+    }
+
+    fn emit_expected_tokens_fn(&mut self) -> io::Result<()> {
+        rust!(
+            self.out,
+            "fn {}expected_tokens({}state: usize) -> Vec<::std::string::String> {{",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(
+            self.out,
+            "const {}TERMINAL: &'static [&'static str] = &[",
+            self.prefix
+        );
+        let all_terminals = if self.grammar.uses_error_recovery {
+            // Subtract one to exlude the error terminal
+            &self.grammar.terminals.all[..self.grammar.terminals.all.len() - 1]
+        } else {
+            &self.grammar.terminals.all
+        };
+        for terminal in all_terminals {
+            // Three # should hopefully be enough to prevent any
+            // reasonable terminal from escaping the literal
+            rust!(self.out, "r###\"{}\"###,", terminal);
+        }
+        rust!(self.out, "];");
+
+        // Grab any terminals in the current state which would have resulted in a successful parse
+        rust!(
+            self.out,
+            "{}ACTION[({}state * {})..].iter().zip({}TERMINAL).filter_map(|(&state, terminal)| {{",
+            self.prefix,
+            self.prefix,
+            self.grammar.terminals.all.len(),
+            self.prefix
+        );
+        rust!(self.out, "if state == 0 {{");
+        rust!(self.out, "None");
+        rust!(self.out, "}} else {{");
+        rust!(self.out, "Some(terminal.to_string())");
+        rust!(self.out, "}}");
+        rust!(self.out, "}}).collect()");
+        rust!(self.out, "}}");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/codegen/test_all.rs
@@ -0,0 +1,147 @@
+//! A compiler from an LR(1) table to a [recursive ascent] parser.
+//!
+//! [recursive ascent]: https://en.wikipedia.org/wiki/Recursive_ascent_parser
+
+use grammar::repr::{Grammar, NonterminalString, TypeParameter};
+use lr1::core::*;
+use rust::RustWrite;
+use std::io::{self, Write};
+use util::Sep;
+
+use super::base::CodeGenerator;
+
+pub fn compile<'grammar, W: Write>(
+    grammar: &'grammar Grammar,
+    user_start_symbol: NonterminalString,
+    start_symbol: NonterminalString,
+    states: &[LR1State<'grammar>],
+    out: &mut RustWrite<W>,
+) -> io::Result<()> {
+    let mut ascent =
+        CodeGenerator::new_test_all(grammar, user_start_symbol, start_symbol, states, out);
+    ascent.write()
+}
+
+struct TestAll;
+
+impl<'ascent, 'grammar, W: Write> CodeGenerator<'ascent, 'grammar, W, TestAll> {
+    fn new_test_all(
+        grammar: &'grammar Grammar,
+        user_start_symbol: NonterminalString,
+        start_symbol: NonterminalString,
+        states: &'ascent [LR1State<'grammar>],
+        out: &'ascent mut RustWrite<W>,
+    ) -> Self {
+        CodeGenerator::new(
+            grammar,
+            user_start_symbol,
+            start_symbol,
+            states,
+            out,
+            true,
+            "super",
+            TestAll,
+        )
+    }
+
+    fn write(&mut self) -> io::Result<()> {
+        self.write_parse_mod(|this| {
+            try!(this.write_parser_fn());
+
+            rust!(this.out, "#[cfg_attr(rustfmt, rustfmt_skip)]");
+            rust!(this.out, "mod {}ascent {{", this.prefix);
+            try!(super::ascent::compile(
+                this.grammar,
+                this.user_start_symbol.clone(),
+                this.start_symbol.clone(),
+                this.states,
+                "super::super::super",
+                this.out
+            ));
+            let pub_use = format!(
+                "{}use self::{}parse{}::{}Parser;",
+                this.grammar.nonterminals[&this.user_start_symbol].visibility,
+                this.prefix,
+                this.start_symbol,
+                this.user_start_symbol
+            );
+            rust!(this.out, "{}", pub_use);
+            rust!(this.out, "}}");
+
+            rust!(this.out, "#[cfg_attr(rustfmt, rustfmt_skip)]");
+            rust!(this.out, "mod {}parse_table {{", this.prefix);
+            try!(super::parse_table::compile(
+                this.grammar,
+                this.user_start_symbol.clone(),
+                this.start_symbol.clone(),
+                this.states,
+                "super::super::super",
+                this.out
+            ));
+            rust!(this.out, "{}", pub_use);
+            rust!(this.out, "}}");
+
+            Ok(())
+        })
+    }
+
+    fn write_parser_fn(&mut self) -> io::Result<()> {
+        try!(self.start_parser_fn());
+
+        if self.grammar.intern_token.is_some() {
+            rust!(self.out, "let _ = self.builder;");
+        }
+        // parse input using both methods:
+        try!(self.call_delegate("ascent"));
+        try!(self.call_delegate("parse_table"));
+
+        // check that result is the same either way:
+        rust!(
+            self.out,
+            "assert_eq!({}ascent, {}parse_table);",
+            self.prefix,
+            self.prefix
+        );
+
+        rust!(self.out, "return {}ascent;", self.prefix);
+
+        try!(self.end_parser_fn());
+
+        Ok(())
+    }
+
+    fn call_delegate(&mut self, delegate: &str) -> io::Result<()> {
+        let non_lifetimes: Vec<_> = self.grammar
+            .type_parameters
+            .iter()
+            .filter(|&tp| match *tp {
+                TypeParameter::Lifetime(_) => false,
+                TypeParameter::Id(_) => true,
+            })
+            .cloned()
+            .collect();
+        let parameters = if non_lifetimes.is_empty() {
+            String::new()
+        } else {
+            format!("::<{}>", Sep(", ", &non_lifetimes))
+        };
+        rust!(
+            self.out,
+            "let {}{} = {}{}::{}Parser::new().parse{}(",
+            self.prefix,
+            delegate,
+            self.prefix,
+            delegate,
+            self.user_start_symbol,
+            parameters
+        );
+        for parameter in &self.grammar.parameters {
+            rust!(self.out, "{},", parameter.name);
+        }
+        if self.grammar.intern_token.is_none() {
+            rust!(self.out, "{}tokens0.clone(),", self.prefix);
+        }
+        rust!(self.out, ");");
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/core/mod.rs
@@ -0,0 +1,333 @@
+//! Core LR(1) types.
+
+use collections::Map;
+use grammar::repr::*;
+use itertools::Itertools;
+use std::fmt::{Debug, Display, Error, Formatter};
+use std::rc::Rc;
+use util::Prefix;
+
+use super::lookahead::*;
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Item<'grammar, L: Lookahead> {
+    pub production: &'grammar Production,
+    /// the dot comes before `index`, so `index` would be 1 for X = A (*) B C
+    pub index: usize,
+    pub lookahead: L,
+}
+
+pub type LR0Item<'grammar> = Item<'grammar, Nil>;
+
+pub type LR1Item<'grammar> = Item<'grammar, TokenSet>;
+
+impl<'grammar> Item<'grammar, Nil> {
+    pub fn lr0(production: &'grammar Production, index: usize) -> Self {
+        Item {
+            production: production,
+            index: index,
+            lookahead: Nil,
+        }
+    }
+}
+
+impl<'grammar, L: Lookahead> Item<'grammar, L> {
+    pub fn with_lookahead<L1: Lookahead>(&self, l: L1) -> Item<'grammar, L1> {
+        Item {
+            production: self.production,
+            index: self.index,
+            lookahead: l,
+        }
+    }
+
+    pub fn prefix(&self) -> &'grammar [Symbol] {
+        &self.production.symbols[..self.index]
+    }
+
+    pub fn symbol_sets(&self) -> SymbolSets<'grammar> {
+        let symbols = &self.production.symbols;
+        if self.can_shift() {
+            SymbolSets {
+                prefix: &symbols[..self.index],
+                cursor: Some(&symbols[self.index]),
+                suffix: &symbols[self.index + 1..],
+            }
+        } else {
+            SymbolSets {
+                prefix: &symbols[..self.index],
+                cursor: None,
+                suffix: &[],
+            }
+        }
+    }
+
+    pub fn to_lr0(&self) -> LR0Item<'grammar> {
+        Item {
+            production: self.production,
+            index: self.index,
+            lookahead: Nil,
+        }
+    }
+
+    pub fn can_shift(&self) -> bool {
+        self.index < self.production.symbols.len()
+    }
+
+    pub fn can_shift_nonterminal(&self, nt: &NonterminalString) -> bool {
+        match self.shift_symbol() {
+            Some((Symbol::Nonterminal(shifted), _)) => shifted == *nt,
+            _ => false,
+        }
+    }
+
+    pub fn can_shift_terminal(&self, term: &TerminalString) -> bool {
+        match self.shift_symbol() {
+            Some((Symbol::Terminal(shifted), _)) => shifted == *term,
+            _ => false,
+        }
+    }
+
+    pub fn can_reduce(&self) -> bool {
+        self.index == self.production.symbols.len()
+    }
+
+    pub fn shifted_item(&self) -> Option<(Symbol, Item<'grammar, L>)> {
+        if self.can_shift() {
+            Some((
+                self.production.symbols[self.index].clone(),
+                Item {
+                    production: self.production,
+                    index: self.index + 1,
+                    lookahead: self.lookahead.clone(),
+                },
+            ))
+        } else {
+            None
+        }
+    }
+
+    pub fn shift_symbol(&self) -> Option<(Symbol, &[Symbol])> {
+        if self.can_shift() {
+            Some((
+                self.production.symbols[self.index].clone(),
+                &self.production.symbols[self.index + 1..],
+            ))
+        } else {
+            None
+        }
+    }
+}
+
+#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct StateIndex(pub usize);
+
+#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Items<'grammar, L: Lookahead> {
+    pub vec: Rc<Vec<Item<'grammar, L>>>,
+}
+
+#[allow(dead_code)]
+pub type LR0Items<'grammar> = Items<'grammar, Nil>;
+#[allow(dead_code)]
+pub type LR1Items<'grammar> = Items<'grammar, TokenSet>;
+
+#[derive(Clone, Debug)]
+pub struct State<'grammar, L: Lookahead> {
+    pub index: StateIndex,
+    pub items: Items<'grammar, L>,
+    pub shifts: Map<TerminalString, StateIndex>,
+    pub reductions: Vec<(L, &'grammar Production)>,
+    pub gotos: Map<NonterminalString, StateIndex>,
+}
+
+pub type LR0State<'grammar> = State<'grammar, Nil>;
+pub type LR1State<'grammar> = State<'grammar, TokenSet>;
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Action<'grammar> {
+    Shift(TerminalString, StateIndex),
+    Reduce(&'grammar Production),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Conflict<'grammar, L> {
+    // when in this state...
+    pub state: StateIndex,
+
+    // with the following lookahead...
+    pub lookahead: L,
+
+    // we can reduce...
+    pub production: &'grammar Production,
+
+    // but we can also...
+    pub action: Action<'grammar>,
+}
+
+#[allow(dead_code)]
+pub type LR0Conflict<'grammar> = Conflict<'grammar, Nil>;
+pub type LR1Conflict<'grammar> = Conflict<'grammar, TokenSet>;
+
+#[derive(Debug)]
+pub struct TableConstructionError<'grammar, L: Lookahead> {
+    // LR(1) state set, possibly incomplete if construction is
+    // configured to terminate early.
+    pub states: Vec<State<'grammar, L>>,
+
+    // Conflicts (non-empty) found in those states.
+    pub conflicts: Vec<Conflict<'grammar, L>>,
+}
+
+pub type LR0TableConstructionError<'grammar> = TableConstructionError<'grammar, Nil>;
+pub type LR1TableConstructionError<'grammar> = TableConstructionError<'grammar, TokenSet>;
+pub type LRResult<'grammar, L> =
+    Result<Vec<State<'grammar, L>>, TableConstructionError<'grammar, L>>;
+pub type LR1Result<'grammar> = LRResult<'grammar, TokenSet>;
+
+impl<'grammar, L: Lookahead> Debug for Item<'grammar, L> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        try!(write!(
+            fmt,
+            "{} ={} (*){}",
+            self.production.nonterminal,
+            Prefix(" ", &self.production.symbols[..self.index]),
+            Prefix(" ", &self.production.symbols[self.index..])
+        ));
+
+        self.lookahead.fmt_as_item_suffix(fmt)
+    }
+}
+
+impl Display for Token {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            Token::EOF => write!(fmt, "EOF"),
+            Token::Error => write!(fmt, "Error"),
+            Token::Terminal(ref s) => write!(fmt, "{}", s),
+        }
+    }
+}
+
+impl Debug for Token {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self)
+    }
+}
+
+impl Debug for StateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "S{}", self.0)
+    }
+}
+
+impl Display for StateIndex {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+impl<'grammar, L: Lookahead> State<'grammar, L> {
+    /// Returns the set of symbols which must appear on the stack to
+    /// be in this state. This is the *maximum* prefix of any item,
+    /// basically.
+    pub fn max_prefix(&self) -> &'grammar [Symbol] {
+        // Each state fn takes as argument the longest prefix of any
+        // item. Note that all items must have compatible prefixes.
+        let prefix = self.items
+            .vec
+            .iter()
+            .map(|item| item.prefix())
+            .max_by_key(|symbols| symbols.len())
+            .unwrap();
+
+        debug_assert!(
+            self.items
+                .vec
+                .iter()
+                .all(|item| prefix.ends_with(&item.production.symbols[..item.index]))
+        );
+
+        prefix
+    }
+
+    /// Returns the set of symbols from the stack that must be popped
+    /// for this state to return. If we have a state like:
+    ///
+    /// ```
+    /// X = A B C (*) C
+    /// Y = B C (*) C
+    /// C = (*) ...
+    /// ```
+    ///
+    /// This would return `[B, C]`. For every state other than the
+    /// start state, this will return a list of length at least 1.
+    /// For the start state, returns `[]`.
+    pub fn will_pop(&self) -> &'grammar [Symbol] {
+        let prefix = self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| item.prefix())
+            .min_by_key(|symbols| symbols.len())
+            .unwrap_or(&[]);
+
+        debug_assert!(
+            self.items
+                .vec
+                .iter()
+                .filter(|item| item.index > 0)
+                .all(|item| item.prefix().ends_with(prefix))
+        );
+
+        prefix
+    }
+
+    pub fn will_push(&self) -> &[Symbol] {
+        self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| &item.production.symbols[item.index..])
+            .min_by_key(|symbols| symbols.len())
+            .unwrap_or(&[])
+    }
+
+    /// Returns the type of nonterminal that this state will produce;
+    /// if `None` is returned, then this state may produce more than
+    /// one kind of nonterminal.
+    ///
+    /// FIXME -- currently, the start state returns `None` instead of
+    /// the goal symbol.
+    pub fn will_produce(&self) -> Option<NonterminalString> {
+        let mut returnable_nonterminals: Vec<_> = self.items
+            .vec
+            .iter()
+            .filter(|item| item.index > 0)
+            .map(|item| item.production.nonterminal.clone())
+            .dedup()
+            .collect();
+        if returnable_nonterminals.len() == 1 {
+            returnable_nonterminals.pop()
+        } else {
+            None
+        }
+    }
+}
+
+/// `A = B C (*) D E F` or `A = B C (*)`
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub struct SymbolSets<'grammar> {
+    pub prefix: &'grammar [Symbol],       // both cases, [B, C]
+    pub cursor: Option<&'grammar Symbol>, // first [D], second []
+    pub suffix: &'grammar [Symbol],       // first [E, F], second []
+}
+
+impl<'grammar> SymbolSets<'grammar> {
+    pub fn new() -> Self {
+        SymbolSets {
+            prefix: &[],
+            cursor: None,
+            suffix: &[],
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/error/mod.rs
@@ -0,0 +1,839 @@
+//! Error reporting. For now very stupid and simplistic.
+
+use collections::{set, Set};
+use lr1::trace::Tracer;
+use lr1::core::*;
+use lr1::example::{Example, ExampleStyles, ExampleSymbol};
+use lr1::first::FirstSets;
+use lr1::lookahead::{Token, TokenSet};
+use itertools::Itertools;
+use grammar::repr::*;
+use message::Message;
+use message::builder::{BodyCharacter, Builder, Character, MessageBuilder};
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+pub fn report_error(grammar: &Grammar, error: &LR1TableConstructionError) -> Vec<Message> {
+    let mut cx = ErrorReportingCx::new(grammar, &error.states, &error.conflicts);
+    cx.report_errors()
+}
+
+struct ErrorReportingCx<'cx, 'grammar: 'cx> {
+    grammar: &'grammar Grammar,
+    first_sets: FirstSets,
+    states: &'cx [LR1State<'grammar>],
+    conflicts: &'cx [LR1Conflict<'grammar>],
+}
+
+#[derive(Debug)]
+enum ConflictClassification {
+    /// The grammar is ambiguous. This means we have two examples of
+    /// precisely the same set of symbols which can be reduced in two
+    /// distinct ways.
+    Ambiguity { action: Example, reduce: Example },
+
+    /// The grammar is ambiguous, and moreover it looks like a
+    /// precedence error. This means that the reduction is to a
+    /// nonterminal `T` and the shift is some symbol sandwiched
+    /// between two instances of `T`.
+    Precedence {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    },
+
+    /// Suggest inlining `nonterminal`. Makes sense if there are two
+    /// levels in the reduction tree in both examples, and the suffix
+    /// after the inner reduction is the same in all cases.
+    SuggestInline {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    },
+
+    /// Like the previous, but suggest replacing `nonterminal` with
+    /// `symbol?`. Makes sense if the thing to be inlined consists of
+    /// two alternatives, `X = symbol | ()`.
+    SuggestQuestion {
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+        symbol: Symbol,
+    },
+
+    /// Can't say much beyond that a conflict occurred.
+    InsufficientLookahead { action: Example, reduce: Example },
+
+    /// Really can't say *ANYTHING*.
+    Naive,
+}
+
+type TokenConflict<'grammar> = Conflict<'grammar, Token>;
+
+impl<'cx, 'grammar> ErrorReportingCx<'cx, 'grammar> {
+    fn new(
+        grammar: &'grammar Grammar,
+        states: &'cx [LR1State<'grammar>],
+        conflicts: &'cx [LR1Conflict<'grammar>],
+    ) -> Self {
+        ErrorReportingCx {
+            grammar: grammar,
+            first_sets: FirstSets::new(grammar),
+            states: states,
+            conflicts: conflicts,
+        }
+    }
+
+    fn report_errors(&mut self) -> Vec<Message> {
+        token_conflicts(self.conflicts)
+            .iter()
+            .map(|conflict| self.report_error(conflict))
+            .collect()
+    }
+
+    fn report_error(&mut self, conflict: &TokenConflict<'grammar>) -> Message {
+        match self.classify(conflict) {
+            ConflictClassification::Ambiguity { action, reduce } => {
+                self.report_error_ambiguity(conflict, action, reduce)
+            }
+            ConflictClassification::Precedence {
+                shift,
+                reduce,
+                nonterminal,
+            } => self.report_error_precedence(conflict, shift, reduce, nonterminal),
+            ConflictClassification::SuggestInline {
+                shift,
+                reduce,
+                nonterminal,
+            } => self.report_error_suggest_inline(conflict, shift, reduce, nonterminal),
+            ConflictClassification::SuggestQuestion {
+                shift,
+                reduce,
+                nonterminal,
+                symbol,
+            } => self.report_error_suggest_question(conflict, shift, reduce, nonterminal, symbol),
+            ConflictClassification::InsufficientLookahead { action, reduce } => {
+                self.report_error_insufficient_lookahead(conflict, action, reduce)
+            }
+            ConflictClassification::Naive => self.report_error_naive(conflict),
+        }
+    }
+
+    fn report_error_ambiguity_core(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+    ) -> Builder<BodyCharacter> {
+        let styles = ExampleStyles::ambig();
+        MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Ambiguous grammar detected")
+            .end()
+            .body()
+            .begin_lines()
+            .wrap_text("The following symbols can be reduced in two ways:")
+            .push(reduce.to_symbol_list(reduce.symbols.len(), styles))
+            .end()
+            .begin_lines()
+            .wrap_text("They could be reduced like so:")
+            .push(reduce.into_picture(styles))
+            .end()
+            .begin_lines()
+            .wrap_text("Alternatively, they could be reduced like so:")
+            .push(shift.into_picture(styles))
+            .end()
+    }
+
+    fn report_error_ambiguity(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+    ) -> Message {
+        self.report_error_ambiguity_core(conflict, shift, reduce)
+            .wrap_text(
+                "LALRPOP does not yet support ambiguous grammars. \
+                 See the LALRPOP manual for advice on \
+                 making your grammar unambiguous.",
+            )
+            .end()
+            .end()
+    }
+
+    fn report_error_precedence(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    ) -> Message {
+        self.report_error_ambiguity_core(conflict, shift, reduce)
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("This looks like a precedence error related to")
+            .push(nonterminal)
+            .verbatimed()
+            .punctuated(".")
+            .text("See the LALRPOP manual for advice on encoding precedence.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_not_lr1_core(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action: Example,
+        reduce: Example,
+    ) -> Builder<BodyCharacter> {
+        let styles = ExampleStyles::new();
+        let builder = MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Local ambiguity detected")
+            .end()
+            .body();
+
+        let builder = builder
+            .begin_lines()
+            .begin_wrap()
+            .text("The problem arises after having observed the following symbols")
+            .text("in the input:")
+            .end()
+            .push(if action.cursor >= reduce.cursor {
+                action.to_symbol_list(action.cursor, styles)
+            } else {
+                reduce.to_symbol_list(reduce.cursor, styles)
+            })
+            .begin_wrap();
+
+        let builder = match conflict.lookahead {
+            Token::Terminal(ref term) => builder
+                .text("At that point, if the next token is a")
+                .push(term.clone())
+                .verbatimed()
+                .styled(Tls::session().cursor_symbol)
+                .punctuated(","),
+            Token::Error => builder.text("If an error has been found,"),
+            Token::EOF => builder.text("If the end of the input is reached,"),
+        };
+
+        let builder = builder
+            .text("then the parser can proceed in two different ways.")
+            .end()
+            .end();
+
+        let builder = self.describe_reduce(builder, styles, conflict.production, reduce, "First");
+
+        match conflict.action {
+            Action::Shift(ref lookahead, _) => {
+                self.describe_shift(builder, styles, lookahead.clone(), action, "Alternatively")
+            }
+            Action::Reduce(production) => {
+                self.describe_reduce(builder, styles, production, action, "Alternatively")
+            }
+        }
+    }
+
+    fn describe_shift<C: Character>(
+        &self,
+        builder: Builder<C>,
+        styles: ExampleStyles,
+        lookahead: TerminalString,
+        example: Example,
+        intro_word: &str,
+    ) -> Builder<C> {
+        // A shift example looks like:
+        //
+        // ...p1 ...p2 (*) L ...s2 ...s1
+        // |     |               |     |
+        // |     +-NT1-----------+     |
+        // |                           |
+        // |           ...             |
+        // |                           |
+        // +-NT2-----------------------+
+
+        let nt1 = example.reductions[0].nonterminal.clone();
+
+        builder
+            .begin_lines()
+            .begin_wrap()
+            .text(intro_word)
+            .punctuated(",")
+            .text("the parser could shift the")
+            .push(lookahead)
+            .verbatimed()
+            .text("token and later use it to construct a")
+            .push(nt1)
+            .verbatimed()
+            .punctuated(".")
+            .text("This might then yield a parse tree like")
+            .end()
+            .push(example.into_picture(styles))
+            .end()
+    }
+
+    fn describe_reduce<C: Character>(
+        &self,
+        builder: Builder<C>,
+        styles: ExampleStyles,
+        production: &Production,
+        example: Example,
+        intro_word: &str,
+    ) -> Builder<C> {
+        builder
+            .begin_lines()
+            .begin_wrap()
+            .text(intro_word)
+            .punctuated(",")
+            .text("the parser could execute the production at")
+            .push(production.span)
+            .punctuated(",")
+            .text("which would consume the top")
+            .text(production.symbols.len())
+            .text("token(s) from the stack")
+            .text("and produce a")
+            .push(production.nonterminal.clone())
+            .verbatimed()
+            .punctuated(".")
+            .text("This might then yield a parse tree like")
+            .end()
+            .push(example.into_picture(styles))
+            .end()
+    }
+
+    fn report_error_suggest_inline(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+    ) -> Message {
+        let builder = self.report_error_not_lr1_core(conflict, shift, reduce);
+
+        builder
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("It appears you could resolve this problem by adding")
+            .text("the annotation `#[inline]` to the definition of")
+            .push(nonterminal)
+            .verbatimed()
+            .punctuated(".")
+            .text("For more information, see the section on inlining")
+            .text("in the LALRPOP manual.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_suggest_question(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        shift: Example,
+        reduce: Example,
+        nonterminal: NonterminalString,
+        symbol: Symbol,
+    ) -> Message {
+        let builder = self.report_error_not_lr1_core(conflict, shift, reduce);
+
+        builder
+            .begin_wrap()
+            .text("Hint:")
+            .styled(Tls::session().hint_text)
+            .text("It appears you could resolve this problem by replacing")
+            .text("uses of")
+            .push(nonterminal.clone())
+            .verbatimed()
+            .text("with")
+            .text(symbol) // intentionally disable coloring here, looks better
+            .adjacent_text("`", "?`")
+            .text("(or, alternatively, by adding the annotation `#[inline]` \
+                   to the definition of")
+            .push(nonterminal)
+            .punctuated(").")
+            .text("For more information, see the section on inlining")
+            .text("in the LALROP manual.")
+            .end()
+            .end()
+            .end()
+    }
+
+    fn report_error_insufficient_lookahead(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action: Example,
+        reduce: Example,
+    ) -> Message {
+        // The reduce example will look something like:
+        //
+        //
+        // ...p1 ...p2 (*) L ...s2 ...s1
+        // |     |               |     |
+        // |     +-NT1-----------+     |
+        // |     |               |     |
+        // |     +-...-----------+     |
+        // |     |               |     |
+        // |     +-NTn-----------+     |
+        // |                           |
+        // +-NTn+1---------------------+
+        //
+        // To solve the conflict, essentially, the user needs to
+        // modify the grammar so that `NTn` does not appear with `L`
+        // in its follow-set. How to guide them in this?
+
+        let builder = self.report_error_not_lr1_core(conflict, action, reduce);
+
+        builder
+            .wrap_text(
+                "See the LALRPOP manual for advice on \
+                 making your grammar LR(1).",
+            )
+            .end()
+            .end()
+    }
+
+    /// Naive error reporting. This is a fallback path which (I think)
+    /// never actually executes.
+    fn report_error_naive(&self, conflict: &TokenConflict<'grammar>) -> Message {
+        let mut builder = MessageBuilder::new(conflict.production.span)
+            .heading()
+            .text("Conflict detected")
+            .end()
+            .body()
+            .begin_lines()
+            .wrap_text("when in this state:")
+            .indented();
+        for item in self.states[conflict.state.0].items.vec.iter() {
+            builder = builder.text(format!("{:?}", item));
+        }
+        let mut builder = builder
+            .end()
+            .begin_wrap()
+            .text(format!("and looking at a token `{:?}`", conflict.lookahead))
+            .text("we can reduce to a")
+            .push(conflict.production.nonterminal.clone())
+            .verbatimed();
+        builder = match conflict.action {
+            Action::Shift(..) => builder.text("but we can also shift"),
+            Action::Reduce(prod) => builder
+                .text("but we can also reduce to a")
+                .text(prod.nonterminal.clone())
+                .verbatimed(),
+        };
+        builder.end().end().end()
+    }
+
+    fn classify(&mut self, conflict: &TokenConflict<'grammar>) -> ConflictClassification {
+        // Find examples from the conflicting action (either a shift
+        // or a reduce).
+        let mut action_examples = match conflict.action {
+            Action::Shift(..) => self.shift_examples(conflict),
+            Action::Reduce(production) => {
+                self.reduce_examples(conflict.state, production, conflict.lookahead.clone())
+            }
+        };
+
+        // Find examples from the conflicting reduce.
+        let mut reduce_examples = self.reduce_examples(
+            conflict.state,
+            conflict.production,
+            conflict.lookahead.clone(),
+        );
+
+        // Prefer shorter examples to longer ones.
+        action_examples.sort_by(|e, f| e.symbols.len().cmp(&f.symbols.len()));
+        reduce_examples.sort_by(|e, f| e.symbols.len().cmp(&f.symbols.len()));
+
+        // This really shouldn't happen, but if we've failed to come
+        // up with examples, then report a "naive" error.
+        if action_examples.is_empty() || reduce_examples.is_empty() {
+            return ConflictClassification::Naive;
+        }
+
+        if let Some(classification) =
+            self.try_classify_ambiguity(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        if let Some(classification) =
+            self.try_classify_question(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        if let Some(classification) =
+            self.try_classify_inline(conflict, &action_examples, &reduce_examples)
+        {
+            return classification;
+        }
+
+        // Give up. Just grab an example from each and pair them up.
+        // If there aren't even two examples, something's pretty
+        // bogus, but we'll just call it naive.
+        action_examples
+            .into_iter()
+            .zip(reduce_examples)
+            .next()
+            .map(
+                |(action, reduce)| ConflictClassification::InsufficientLookahead {
+                    action: action,
+                    reduce: reduce,
+                },
+            )
+            .unwrap_or(ConflictClassification::Naive)
+    }
+
+    fn try_classify_ambiguity(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        action_examples
+            .iter()
+            .cartesian_product(reduce_examples)
+            .filter(|&(action, reduce)| action.symbols == reduce.symbols)
+            .filter(|&(action, reduce)| action.cursor == reduce.cursor)
+            .map(|(action, reduce)| {
+                // Consider whether to call this a precedence
+                // error. We do this if we are stuck between reducing
+                // `T = T S T` and shifting `S`.
+                if let Action::Shift(ref term, _) = conflict.action {
+                    let nt = &conflict.production.nonterminal;
+                    if conflict.production.symbols.len() == 3
+                        && conflict.production.symbols[0] == Symbol::Nonterminal(nt.clone())
+                        && conflict.production.symbols[1] == Symbol::Terminal(term.clone())
+                        && conflict.production.symbols[2] == Symbol::Nonterminal(nt.clone())
+                    {
+                        return ConflictClassification::Precedence {
+                            shift: action.clone(),
+                            reduce: reduce.clone(),
+                            nonterminal: nt.clone(),
+                        };
+                    }
+                }
+                ConflictClassification::Ambiguity {
+                    action: action.clone(),
+                    reduce: reduce.clone(),
+                }
+            })
+            .next()
+    }
+
+    fn try_classify_question(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        // If we get a shift/reduce conflict and the reduce
+        // is of a nonterminal like:
+        //
+        //     T = { () | U }
+        //
+        // then suggest replacing T with U?. I'm being a bit lenient
+        // here since I do not KNOW that it will help, but it often
+        // does, and it's better style anyhow.
+
+        if let Action::Reduce(_) = conflict.action {
+            return None;
+        }
+
+        debug!(
+            "try_classify_question: action_examples={:?}",
+            action_examples
+        );
+        debug!(
+            "try_classify_question: reduce_examples={:?}",
+            reduce_examples
+        );
+
+        let nt = &conflict.production.nonterminal;
+        let nt_productions = self.grammar.productions_for(nt);
+        if nt_productions.len() == 2 {
+            for &(i, j) in &[(0, 1), (1, 0)] {
+                if nt_productions[i].symbols.is_empty() && nt_productions[j].symbols.len() == 1 {
+                    return Some(ConflictClassification::SuggestQuestion {
+                        shift: action_examples[0].clone(),
+                        reduce: reduce_examples[0].clone(),
+                        nonterminal: nt.clone(),
+                        symbol: nt_productions[j].symbols[0].clone(),
+                    });
+                }
+            }
+        }
+
+        None
+    }
+
+    fn try_classify_inline(
+        &self,
+        conflict: &TokenConflict<'grammar>,
+        action_examples: &[Example],
+        reduce_examples: &[Example],
+    ) -> Option<ConflictClassification> {
+        // Inlining can help resolve a shift/reduce conflict because
+        // it defers the need to reduce. In particular, if we inlined
+        // all the reductions up until the last one, then we would be
+        // able to *shift* the lookahead instead of having to reduce.
+        // This can be helpful if we can see that shifting would let
+        // us delay reducing until the lookahead diverges.
+
+        // Only applicable to shift/reduce:
+        if let Action::Reduce(_) = conflict.action {
+            return None;
+        }
+
+        // FIXME: The logic here finds the first example where inline
+        // would help; but maybe we want to restrict it to cases
+        // where inlining would help *all* the examples...?
+
+        action_examples
+            .iter()
+            .cartesian_product(reduce_examples)
+            .filter_map(|(shift, reduce)| {
+                if self.try_classify_inline_example(shift, reduce) {
+                    let nt = &reduce.reductions[0].nonterminal;
+                    Some(ConflictClassification::SuggestInline {
+                        shift: shift.clone(),
+                        reduce: reduce.clone(),
+                        nonterminal: nt.clone(),
+                    })
+                } else {
+                    None
+                }
+            })
+            .next()
+    }
+
+    fn try_classify_inline_example<'ex>(&self, shift: &Example, reduce: &Example) -> bool {
+        debug!("try_classify_inline_example({:?}, {:?})", shift, reduce);
+
+        // In the case of shift, the example will look like
+        //
+        // ```
+        // ... ... (*) L ...s1 ...
+        // |   |             |   |
+        // |   +-R0----------+   |
+        // |  ...                |
+        // +-Rn------------------+
+        // ```
+        //
+        // We want to extract the symbols ...s1: these are the
+        // things we are able to shift before being forced to
+        // make our next hard decision (to reduce R0 or not).
+        let shift_upcoming = &shift.symbols[shift.cursor + 1..shift.reductions[0].end];
+        debug!(
+            "try_classify_inline_example: shift_upcoming={:?}",
+            shift_upcoming
+        );
+
+        // For the reduce, the example might look like
+        //
+        // ```
+        // ...  ...   (*) ...s ...
+        // | | |    |        |
+        // | | +-R0-+        |
+        // | | ...  |        |
+        // | +--Ri--+        |
+        // |  ...            |
+        // +-R(i+1)----------+
+        // ```
+        //
+        // where Ri is the last reduction that requires
+        // shifting no additional symbols. In this case, if we
+        // inlined R0...Ri, then we know we can shift L.
+        let r0_end = reduce.reductions[0].end;
+        let i = reduce.reductions.iter().position(|r| r.end != r0_end);
+        let i = match i {
+            Some(v) => v,
+            None => return false,
+        };
+        let ri = &reduce.reductions[i];
+        let reduce_upcoming = &reduce.symbols[r0_end..ri.end];
+        debug!(
+            "try_classify_inline_example: reduce_upcoming={:?} i={:?}",
+            reduce_upcoming, i
+        );
+
+        // For now, we only suggest inlining a single nonterminal,
+        // mostly because I am too lazy to weak the suggestion struct
+        // and error messages (but the rest of the code below doesn't
+        // make this assumption for the most part).
+        if i != 1 {
+            return false;
+        }
+
+        // Make sure that all the things we are suggesting inlining
+        // are distinct so that we are not introducing a cycle.
+        let mut duplicates = set();
+        if reduce.reductions[0..i + 1]
+            .iter()
+            .any(|r| !duplicates.insert(r.nonterminal.clone()))
+        {
+            return false;
+        }
+
+        // Compare the two suffixes to see whether they
+        // diverge at some point.
+        shift_upcoming
+            .iter()
+            .zip(reduce_upcoming)
+            .filter_map(|(shift_sym, reduce_sym)| match (shift_sym, reduce_sym) {
+                (&ExampleSymbol::Symbol(ref shift_sym), &ExampleSymbol::Symbol(ref reduce_sym)) => {
+                    if shift_sym == reduce_sym {
+                        // same symbol on both; we'll be able to shift them
+                        None
+                    } else {
+                        // different symbols: for this to work, must
+                        // have disjoint first sets. Note that we
+                        // consider a suffix matching epsilon to be
+                        // potentially overlapping, though we could
+                        // supply the actual lookahead for more precision.
+                        let shift_first = self.first_sets.first0(&[shift_sym.clone()]);
+                        let reduce_first = self.first_sets.first0(&[reduce_sym.clone()]);
+                        if shift_first.is_disjoint(&reduce_first) {
+                            Some(true)
+                        } else {
+                            Some(false)
+                        }
+                    }
+                }
+                _ => {
+                    // we don't expect to encounter any
+                    // epsilons, I don't think, because those
+                    // only occur with an empty reduce at the
+                    // top level
+                    Some(false)
+                }
+            })
+            .next()
+            .unwrap_or(false)
+    }
+
+    fn shift_examples(&self, conflict: &TokenConflict<'grammar>) -> Vec<Example> {
+        log!(Tls::session(), Verbose, "Gathering shift examples");
+        let state = &self.states[conflict.state.0];
+        let conflicting_items = self.conflicting_shift_items(state, conflict);
+        conflicting_items
+            .into_iter()
+            .flat_map(|item| {
+                let tracer = Tracer::new(&self.first_sets, self.states);
+                let shift_trace = tracer.backtrace_shift(conflict.state, item);
+                let local_examples: Vec<Example> = shift_trace.lr0_examples(item).collect();
+                local_examples
+            })
+            .collect()
+    }
+
+    fn reduce_examples(
+        &self,
+        state: StateIndex,
+        production: &'grammar Production,
+        lookahead: Token,
+    ) -> Vec<Example> {
+        log!(Tls::session(), Verbose, "Gathering reduce examples");
+        let item = Item {
+            production: production,
+            index: production.symbols.len(),
+            lookahead: TokenSet::from(lookahead),
+        };
+        let tracer = Tracer::new(&self.first_sets, self.states);
+        let reduce_trace = tracer.backtrace_reduce(state, item.to_lr0());
+        reduce_trace.lr1_examples(&self.first_sets, &item).collect()
+    }
+
+    fn conflicting_shift_items(
+        &self,
+        state: &LR1State<'grammar>,
+        conflict: &TokenConflict<'grammar>,
+    ) -> Set<LR0Item<'grammar>> {
+        // Lookahead must be a terminal, not EOF.
+        // Find an item J like `Bar = ... (*) L ...`.
+        let lookahead = Symbol::Terminal(conflict.lookahead.unwrap_terminal().clone());
+        state
+            .items
+            .vec
+            .iter()
+            .filter(|i| i.can_shift())
+            .filter(|i| i.production.symbols[i.index] == lookahead)
+            .map(|i| i.to_lr0())
+            .collect()
+    }
+}
+
+fn token_conflicts<'grammar>(
+    conflicts: &[Conflict<'grammar, TokenSet>],
+) -> Vec<TokenConflict<'grammar>> {
+    conflicts
+        .iter()
+        .flat_map(|conflict| {
+            conflict.lookahead.iter().map(move |token| Conflict {
+                state: conflict.state,
+                lookahead: token,
+                production: conflict.production,
+                action: conflict.action.clone(),
+            })
+        })
+        .collect()
+}
+
+//fn choose_example<'grammar>(states: &[State<'grammar>],
+//                            lookahead: Token,
+//                            conflict: &TokenConflict<'grammar>)
+//{
+//    // Whenever we have a conflict in state S, there is always:
+//    // - a given lookahead L that permits some reduction, due to
+//    //   an item I like `Foo = ... (*) [L]`
+//    // - another action that conflicts with R1.
+//    //
+//    // The backtrace code can give context to this item `I`, but the
+//    // problem is that it often results in many different contexts,
+//    // and we need to try and narrow those down to the one that will
+//    // help the user understand the problem.
+//    //
+//    // For that, we turn to the conflicting action, which can either be
+//    // a shift or reduce. Let's consider those two cases.
+//    //
+//    // ### Shift
+//    //
+//    // If the conflicting action is a shift, then there is at least
+//    // one item J in the state S like `Bar = ... (*) L ...`. We can
+//    // produce a backtrace from J and enumerate examples. We want to
+//    // find a pair of examples from I and J that share a common
+//    // prefix.
+//    //
+//    // ### Reduce
+//    //
+//    // If the conflicting action is a reduce, then there is at least
+//    // one item J in S like `Bar = ... (*) [L]`. We can produce a
+//    // backtrace for J and then search for an example that shares a
+//    // common prefix.
+//
+//}
+//
+//fn conflicting_item<'grammar>(state: &State<'grammar>,
+//                              lookahead: Token,
+//                              conflict: &TokenConflict<'grammar>)
+//                              -> Item<'grammar>
+//{
+//    match conflict.action {
+//        Action::Shift(_) => {
+//        }
+//        Action::Reduce(production) => {
+//            // Must be at least some other item J in S like `Bar = ... (*) [L]`.
+//            state.items.vec.iter()
+//                           .filter(|i| i.can_reduce())
+//                           .filter(|i| i.lookahead == lookahead)
+//                           .filter(|i| i.production == production)
+//                           .cloned()
+//                           .next()
+//                           .unwrap()
+//        }
+//    }
+//}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/error/test.rs
@@ -0,0 +1,187 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use tls::Tls;
+
+use super::{ConflictClassification, ErrorReportingCx};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+#[test]
+fn priority_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::Precedence {
+            shift,
+            reduce,
+            nonterminal,
+        } => {
+            println!(
+                "shift={:#?}, reduce={:#?}, nonterminal={:?}",
+                shift, reduce, nonterminal
+            );
+            assert_eq!(shift.symbols.len(), 5); // Ty -> Ty -> Ty
+            assert_eq!(shift.cursor, 3); // Ty -> Ty -> Ty
+            assert_eq!(shift.symbols, reduce.symbols);
+            assert_eq!(shift.cursor, reduce.cursor);
+            assert_eq!(nonterminal, nt("Ty"));
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn expr_braced_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Expr: () = {
+    "Id" => (),
+    "Id" "{" "}" => (),
+    "Expr" "+" "Id" => (),
+    "if" Expr "{" "}" => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Expr")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::InsufficientLookahead { .. } => {}
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn suggest_question_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+        grammar;
+
+        pub E: () = {
+            "L",
+            "&" OPT_L E
+        };
+
+        OPT_L: () = {
+            (),
+            "L"
+        };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("E")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::SuggestQuestion {
+            shift: _,
+            reduce: _,
+            nonterminal,
+            symbol,
+        } => {
+            assert_eq!(nonterminal, nt("OPT_L"));
+            assert_eq!(
+                symbol,
+                Symbol::Terminal(TerminalString::quoted(Atom::from("L")))
+            );
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+#[test]
+fn suggest_inline_conflict() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub ImportDecl: () = {
+    "import" <Path> ";" => (),
+    "import" <Path> "." "*" ";" => (),
+};
+
+Path: () = {
+    <head: Ident> <tail: ("." <Ident>)*> => ()
+};
+
+Ident = r#"[a-zA-Z][a-zA-Z0-9]*"#;
+"##,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("ImportDecl")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    let conflict = &conflicts[0];
+
+    println!("conflict={:?}", conflict);
+
+    match cx.classify(conflict) {
+        ConflictClassification::SuggestInline {
+            shift: _,
+            reduce: _,
+            nonterminal,
+        } => {
+            assert_eq!(nonterminal, nt("Path"));
+        }
+        r => panic!("wrong classification {:#?}", r),
+    }
+}
+
+/// This example used to cause an out-of-bounds error.
+#[test]
+fn issue_249() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r##"
+grammar;
+
+pub Func = StructDecl* VarDecl*;
+StructDecl = "<" StructParameter* ">";
+StructParameter = "may_dangle"?;
+VarDecl = "let";
+"##,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let err = build_states(&grammar, nt("Func")).unwrap_err();
+    let mut cx = ErrorReportingCx::new(&grammar, &err.states, &err.conflicts);
+    let conflicts = super::token_conflicts(&err.conflicts);
+    for conflict in &conflicts {
+        println!("conflict={:?}", conflict);
+        cx.classify(conflict);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/example/mod.rs
@@ -0,0 +1,409 @@
+//! Code to compute example inputs given a backtrace.
+
+use ascii_canvas::AsciiView;
+use message::Content;
+use message::builder::InlineBuilder;
+use grammar::repr::*;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use tls::Tls;
+
+#[cfg(test)]
+mod test;
+
+/// An "example" input and the way it was derived. This can be
+/// serialized into useful text. For example, it might represent
+/// something like this:
+///
+/// ```
+///          Looking at
+///              |
+///              v
+/// Ty "->" Ty "->" Ty
+/// |        |       |
+/// +-Ty-----+       |
+/// |                |
+/// +-Ty-------------+
+/// ```
+///
+/// The top-line is the `symbols` vector. The groupings below are
+/// stored in the `reductions` vector, in order from smallest to
+/// largest (they are always properly nested). The `cursor` field
+/// indicates the current lookahead token.
+///
+/// The `symbols` vector is actually `Option<Symbol>` to account
+/// for empty reductions:
+///
+/// ```
+/// A       B
+/// | |   | |
+/// | +-Y-+ |
+/// +-Z-----+
+/// ```
+///
+/// The "empty space" between A and B would be represented as `None`.
+#[derive(Clone, Debug)]
+pub struct Example {
+    pub symbols: Vec<ExampleSymbol>,
+    pub cursor: usize,
+    pub reductions: Vec<Reduction>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ExampleSymbol {
+    Symbol(Symbol),
+    Epsilon,
+}
+
+#[derive(Copy, Clone, Default)]
+pub struct ExampleStyles {
+    pub before_cursor: Style,
+    pub on_cursor: Style,
+    pub after_cursor: Style,
+}
+
+#[derive(Clone, Debug)]
+pub struct Reduction {
+    pub start: usize,
+    pub end: usize,
+    pub nonterminal: NonterminalString,
+}
+
+impl Example {
+    /// Length of each symbol. Each will need *at least* that amount
+    /// of space. :) Measure in characters, under the assumption of a
+    /// mono-spaced font. Also add a final `0` marker which will serve
+    /// as the end position.
+    fn lengths(&self) -> Vec<usize> {
+        self.symbols
+            .iter()
+            .map(|s| match *s {
+                ExampleSymbol::Symbol(ref s) => format!("{}", s).chars().count(),
+                ExampleSymbol::Epsilon => 1, // display as " "
+            })
+            .chain(Some(0))
+            .collect()
+    }
+
+    /// Extract a prefix of the list of symbols from this `Example`
+    /// and make a styled list of them, like:
+    ///
+    ///    Ty "->" Ty -> "Ty"
+    pub fn to_symbol_list(&self, length: usize, styles: ExampleStyles) -> Box<Content> {
+        let mut builder = InlineBuilder::new().begin_spaced();
+
+        for (index, symbol) in self.symbols[..length].iter().enumerate() {
+            let style = if index < self.cursor {
+                styles.before_cursor
+            } else if index > self.cursor {
+                styles.after_cursor
+            } else {
+                match *symbol {
+                    ExampleSymbol::Symbol(Symbol::Terminal(_)) => styles.on_cursor,
+                    ExampleSymbol::Symbol(Symbol::Nonterminal(_)) => styles.after_cursor,
+                    ExampleSymbol::Epsilon => styles.after_cursor,
+                }
+            };
+
+            if let &ExampleSymbol::Symbol(ref s) = symbol {
+                builder = builder.push(s.clone()).styled(style);
+            }
+        }
+
+        builder.end().indented().end()
+    }
+
+    /// Render the example into a styled diagram suitable for
+    /// embedding in an error message.
+    pub fn into_picture(self, styles: ExampleStyles) -> Box<Content> {
+        let lengths = self.lengths();
+        let positions = self.positions(&lengths);
+        InlineBuilder::new()
+            .push(Box::new(ExamplePicture {
+                example: self,
+                positions: positions,
+                styles: styles,
+            }))
+            .indented()
+            .end()
+    }
+
+    fn starting_positions(&self, lengths: &[usize]) -> Vec<usize> {
+        lengths
+            .iter()
+            .scan(0, |counter, &len| {
+                let start = *counter;
+
+                // Leave space for "NT " (if "NT" is the name
+                // of the nonterminal).
+                *counter = start + len + 1;
+
+                Some(start)
+            })
+            .collect()
+    }
+
+    /// Start index where each symbol in the example should appear,
+    /// measured in characters. These are spaced to leave enough room
+    /// for the reductions below.
+    fn positions(&self, lengths: &[usize]) -> Vec<usize> {
+        // Initially, position each symbol with one space in between,
+        // like:
+        //
+        //     X Y Z
+        let mut positions = self.starting_positions(lengths);
+
+        // Adjust spacing to account for the nonterminal labels
+        // we will have to add. It will display
+        // like this:
+        //
+        //    A1 B2 C3 D4 E5 F6
+        //    |         |
+        //    +-Label---+
+        //
+        // But if the label is long we may have to adjust the spacing
+        // of the covered items (here, we changed them to two spaces,
+        // except the first gap, which got 3 spaces):
+        //
+        //    A1   B2  C3  D4 E5 F6
+        //    |             |
+        //    +-LongLabel22-+
+        for &Reduction {
+            start,
+            end,
+            ref nonterminal,
+        } in &self.reductions
+        {
+            let nt_len = format!("{}", nonterminal).chars().count();
+
+            // Number of symbols we are reducing. This should always
+            // be non-zero because even in the case of a \epsilon
+            // rule, we ought to be have a `None` entry in the symbol array.
+            let num_syms = end - start;
+            assert!(num_syms > 0);
+
+            // Let's use the expansion from above as our running example.
+            // We start out with positions like this:
+            //
+            //    A1 B2 C3 D4 E5 F6
+            //    |             |
+            //    +-LongLabel22-+
+            //
+            // But we want LongLabel to end at D4. No good.
+
+            // Start of first symbol to be reduced. Here, 0.
+            //
+            // A1 B2 C3 D4
+            // ^ here
+            let start_position = positions[start];
+
+            // End of last symbol to be reduced. Here, 11.
+            //
+            // A1 B2 C3 D4 E5
+            //             ^ positions[end]
+            //            ^ here -- positions[end] - 1
+            let end_position = positions[end] - 1;
+
+            // We need space to draw `+-Label-+` between
+            // start_position and end_position.
+            let required_len = nt_len + 4; // here, 15
+            let actual_len = end_position - start_position; // here, 10
+            if required_len < actual_len {
+                continue; // Got enough space, all set.
+            }
+
+            // Have to add `difference` characters altogether.
+            let difference = required_len - actual_len; // here, 4
+
+            // Increment over everything that is not part of this nonterminal.
+            // In the example above, that is E5 and F6.
+            shift(&mut positions[end..], difference);
+
+            if num_syms > 1 {
+                // If there is just one symbol being reduced here,
+                // then we have shifted over the things that follow
+                // it, and we are done. This would be a case like:
+                //
+                //     X         Y Z
+                //     |       |
+                //     +-Label-+
+                //
+                // (which maybe ought to be rendered slightly
+                // differently).
+                //
+                // But if there are multiple symbols, we're not quite
+                // done, because there would be an unsightly gap:
+                //
+                //       (gaps)
+                //      |  |  |
+                //      v  v  v
+                //    A1 B2 C3 D4     E5 F6
+                //    |             |
+                //    +-LongLabel22-+
+                //
+                // we'd like to make things line up, so we have to
+                // distribute that extra space internally by
+                // increasing the "gaps" (marked above) as evenly as
+                // possible (basically, full justification).
+                //
+                // We do this by dividing up the spaces evenly and
+                // then taking the remainder `N` and distributing 1
+                // extra to the first N.
+                let num_gaps = num_syms - 1; // number of gaps we can adjust. Here, 3.
+                let amount = difference / num_gaps; // what to add to each gap. Here, 1.
+                let extra = difference % num_gaps; // the remainder. Here, 1.
+
+                // For the first `extra` symbols, give them amount + 1
+                // extra space. After that, just amount. (O(n^2). Sue me.)
+                for i in 0..extra {
+                    shift(&mut positions[start + 1 + i..end], amount + 1);
+                }
+                for i in extra..num_gaps {
+                    shift(&mut positions[start + 1 + i..end], amount);
+                }
+            }
+        }
+
+        positions
+    }
+
+    #[cfg(test)]
+    pub fn paint_unstyled(&self) -> Vec<::ascii_canvas::Row> {
+        use std::default::Default;
+        let this = self.clone();
+        let content = this.into_picture(ExampleStyles::default());
+        let min_width = content.min_width();
+        let canvas = content.emit_to_canvas(min_width);
+        canvas.to_strings()
+    }
+
+    fn paint_on(&self, styles: &ExampleStyles, positions: &[usize], view: &mut AsciiView) {
+        // Draw the brackets for each reduction:
+        for (index, reduction) in self.reductions.iter().enumerate() {
+            let start_column = positions[reduction.start];
+            let end_column = positions[reduction.end] - 1;
+            let row = 1 + index;
+            view.draw_vertical_line(0..row + 1, start_column);
+            view.draw_vertical_line(0..row + 1, end_column - 1);
+            view.draw_horizontal_line(row, start_column..end_column);
+        }
+
+        // Write the labels for each reduction. Do this after the
+        // brackets so that ascii canvas can convert `|` to `+`
+        // without interfering with the text (in case of weird overlap).
+        let session = Tls::session();
+        for (index, reduction) in self.reductions.iter().enumerate() {
+            let column = positions[reduction.start] + 2;
+            let row = 1 + index;
+            view.write_chars(
+                row,
+                column,
+                reduction.nonterminal.to_string().chars(),
+                session.nonterminal_symbol,
+            );
+        }
+
+        // Write the labels on top:
+        //    A1   B2  C3  D4 E5 F6
+        self.paint_symbols_on(&self.symbols, &positions, styles, view);
+    }
+
+    fn paint_symbols_on(
+        &self,
+        symbols: &[ExampleSymbol],
+        positions: &[usize],
+        styles: &ExampleStyles,
+        view: &mut AsciiView,
+    ) {
+        let session = Tls::session();
+        for (index, ex_symbol) in symbols.iter().enumerate() {
+            let style = if index < self.cursor {
+                styles.before_cursor
+            } else if index == self.cursor {
+                // Only display actual terminals in the "on-cursor"
+                // font, because it might be misleading to show a
+                // nonterminal that way. Really it'd be nice to expand
+                // so that the cursor is always a terminal.
+                match *ex_symbol {
+                    ExampleSymbol::Symbol(Symbol::Terminal(_)) => styles.on_cursor,
+                    _ => styles.after_cursor,
+                }
+            } else {
+                styles.after_cursor
+            };
+
+            let column = positions[index];
+            match *ex_symbol {
+                ExampleSymbol::Symbol(Symbol::Terminal(ref term)) => {
+                    view.write_chars(
+                        0,
+                        column,
+                        term.to_string().chars(),
+                        style.with(session.terminal_symbol),
+                    );
+                }
+                ExampleSymbol::Symbol(Symbol::Nonterminal(ref nt)) => {
+                    view.write_chars(
+                        0,
+                        column,
+                        nt.to_string().chars(),
+                        style.with(session.nonterminal_symbol),
+                    );
+                }
+                ExampleSymbol::Epsilon => {}
+            }
+        }
+    }
+}
+
+struct ExamplePicture {
+    example: Example,
+    positions: Vec<usize>,
+    styles: ExampleStyles,
+}
+
+impl Content for ExamplePicture {
+    fn min_width(&self) -> usize {
+        *self.positions.last().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        self.example.paint_on(&self.styles, &self.positions, view);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+impl Debug for ExamplePicture {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Debug::fmt(&self.example, fmt)
+    }
+}
+
+fn shift(positions: &mut [usize], amount: usize) {
+    for position in positions {
+        *position += amount;
+    }
+}
+
+impl ExampleStyles {
+    pub fn ambig() -> Self {
+        let session = Tls::session();
+        ExampleStyles {
+            before_cursor: session.ambig_symbols,
+            on_cursor: session.ambig_symbols,
+            after_cursor: session.ambig_symbols,
+        }
+    }
+
+    pub fn new() -> Self {
+        let session = Tls::session();
+        ExampleStyles {
+            before_cursor: session.observed_symbols,
+            on_cursor: session.cursor_symbol,
+            after_cursor: session.unobserved_symbols,
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/example/test.rs
@@ -0,0 +1,195 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use test_util::expect_debug;
+use tls::Tls;
+
+use super::{Example, ExampleSymbol, Reduction};
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+macro_rules! sym {
+    (ε) => { ExampleSymbol::Epsilon };
+    ($t:ident) => { ExampleSymbol::Symbol(Symbol::Nonterminal(nt(stringify!($t)))) }
+}
+
+macro_rules! syms {
+    ($($t:tt),*) => {
+        vec![$(sym!($t)),*]
+    }
+}
+
+//  01234567890123456789012
+//  A1   B2  C3  D4 E5 F6
+//  |             |     |
+//  +-LongLabel22-+     |
+//  |                   |
+//  +-Label-------------+
+fn long_label_1_example() -> Example {
+    Example {
+        symbols: syms!(A1, B2, C3, D4, E5, F6),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("LongLabel22"),
+            },
+            Reduction {
+                start: 0,
+                end: 6,
+                nonterminal: nt("Label"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn long_label_1_positions() {
+    let _tls = Tls::test();
+    let example = long_label_1_example();
+    let lengths = example.lengths();
+    let positions = example.positions(&lengths);
+    assert_eq!(positions, vec![0, 5, 9, 13, 16, 19, 22]);
+}
+
+#[test]
+fn long_label_1_strings() {
+    let _tls = Tls::test();
+    let strings = long_label_1_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  A1   B2  C3  D4 E5 F6",
+    "  ├─LongLabel22─┘     │",
+    "  └─Label─────────────┘"
+]
+"#.trim(),
+    );
+}
+
+// Example with some empty sequences and
+// other edge cases.
+//
+//  012345678901234567890123456789012345
+//         A1  B2  C3 D4 E5       F6
+//  |   |           |       |   | |   |
+//  +-X-+           |       |   | |   |
+//  |               |       |   | |   |
+//  +-MegaLongLabel-+       |   | |   |
+//                          |   | |   |
+//                          +-Y-+ |   |
+//                                |   |
+//                                +-Z-+
+fn empty_labels_example() -> Example {
+    Example {
+        //             0 1  2  3  4  5  6 7
+        symbols: syms!(ε, A1, B2, C3, D4, E5, ε, F6),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("X"),
+            },
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("MegaLongLabel"),
+            },
+            Reduction {
+                start: 6,
+                end: 7,
+                nonterminal: nt("Y"),
+            },
+            Reduction {
+                start: 7,
+                end: 8,
+                nonterminal: nt("Z"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn empty_labels_positions() {
+    let _tls = Tls::test();
+    let example = empty_labels_example();
+    let lengths = example.lengths();
+    let positions = example.positions(&lengths);
+    //                            A1 B2  C3  D4  E5      F6
+    assert_eq!(positions, vec![0, 7, 11, 15, 18, 21, 24, 30, 36]);
+}
+
+#[test]
+fn empty_labels_strings() {
+    let _tls = Tls::test();
+    let strings = empty_labels_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  ╷    ╷ A1  B2  C3 D4 E5 ╷   ╷ F6  ╷",
+    "  ├─X──┘          │       │   │ │   │",
+    "  └─MegaLongLabel─┘       │   │ │   │",
+    "                          └─Y─┘ │   │",
+    "                                └─Z─┘"
+]
+"#.trim(),
+    );
+}
+
+// _return_      _A_ Expression _B_
+// |            |                  |
+// +-ExprAtom---+                  |
+// |            |                  |
+// +-ExprSuffix-+                  |
+// |                               |
+// +-ExprSuffix--------------------+
+fn single_token_example() -> Example {
+    Example {
+        //             0 1  2  3  4  5  6 7
+        symbols: syms!(_return_, _A_, Expression, _B_),
+        cursor: 5,
+        reductions: vec![
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("ExprAtom"),
+            },
+            Reduction {
+                start: 0,
+                end: 1,
+                nonterminal: nt("ExprSuffix"),
+            },
+            Reduction {
+                start: 0,
+                end: 4,
+                nonterminal: nt("ExprSuffix"),
+            },
+        ],
+    }
+}
+
+#[test]
+fn single_token_strings() {
+    let _tls = Tls::test();
+    let strings = single_token_example().paint_unstyled();
+    expect_debug(
+        strings,
+        r#"
+[
+    "  _return_     ╷ _A_ Expression _B_",
+    "  ├─ExprAtom───┤                  │",
+    "  ├─ExprSuffix─┘                  │",
+    "  └─ExprSuffix────────────────────┘"
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/first/mod.rs
@@ -0,0 +1,97 @@
+//! First set construction and computation.
+
+use collections::{map, Map};
+use grammar::repr::*;
+use lr1::lookahead::{Token, TokenSet};
+
+#[cfg(test)]
+mod test;
+
+#[derive(Clone)]
+pub struct FirstSets {
+    map: Map<NonterminalString, TokenSet>,
+}
+
+impl FirstSets {
+    pub fn new(grammar: &Grammar) -> FirstSets {
+        let mut this = FirstSets { map: map() };
+        let mut changed = true;
+        while changed {
+            changed = false;
+            for production in grammar.nonterminals.values().flat_map(|p| &p.productions) {
+                let nt = &production.nonterminal;
+                let lookahead = this.first0(&production.symbols);
+                let first_set = this.map
+                    .entry(nt.clone())
+                    .or_insert_with(|| TokenSet::new());
+                changed |= first_set.union_with(&lookahead);
+            }
+        }
+        this
+    }
+
+    /// Returns `FIRST(...symbols)`. If `...symbols` may derive
+    /// epsilon, then this returned set will include EOF. (This is
+    /// kind of repurposing EOF to serve as a binary flag of sorts.)
+    pub fn first0<'s, I>(&self, symbols: I) -> TokenSet
+    where
+        I: IntoIterator<Item = &'s Symbol>,
+    {
+        let mut result = TokenSet::new();
+
+        for symbol in symbols {
+            match *symbol {
+                Symbol::Terminal(ref t) => {
+                    result.insert(Token::Terminal(t.clone()));
+                    return result;
+                }
+
+                Symbol::Nonterminal(ref nt) => {
+                    let mut empty_prod = false;
+                    match self.map.get(nt) {
+                        None => {
+                            // This should only happen during set
+                            // construction; it corresponds to an
+                            // entry that has not yet been
+                            // built. Otherwise, it would mean a
+                            // terminal with no productions. Either
+                            // way, the resulting first set should be
+                            // empty.
+                        }
+                        Some(set) => for lookahead in set.iter() {
+                            match lookahead {
+                                Token::EOF => {
+                                    empty_prod = true;
+                                }
+                                Token::Error | Token::Terminal(_) => {
+                                    result.insert(lookahead);
+                                }
+                            }
+                        },
+                    }
+                    if !empty_prod {
+                        return result;
+                    }
+                }
+            }
+        }
+
+        // control only reaches here if either symbols is empty, or it
+        // consists of nonterminals all of which may derive epsilon
+        result.insert(Token::EOF);
+        result
+    }
+
+    pub fn first1(&self, symbols: &[Symbol], lookahead: &TokenSet) -> TokenSet {
+        let mut set = self.first0(symbols);
+
+        // we use EOF as the signal that `symbols` derives epsilon:
+        let epsilon = set.take_eof();
+
+        if epsilon {
+            set.union_with(&lookahead);
+        }
+
+        set
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/first/test.rs
@@ -0,0 +1,93 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::lookahead::{Token, TokenSet};
+use lr1::lookahead::Token::EOF;
+use lr1::tls::Lr1Tls;
+use test_util::normalized_grammar;
+use super::FirstSets;
+
+pub fn nt(t: &str) -> Symbol {
+    Symbol::Nonterminal(NonterminalString(Atom::from(t)))
+}
+
+pub fn term(t: &str) -> Symbol {
+    Symbol::Terminal(TerminalString::quoted(Atom::from(t)))
+}
+
+fn la(t: &str) -> Token {
+    Token::Terminal(TerminalString::quoted(Atom::from(t)))
+}
+
+fn first0(first: &FirstSets, symbols: &[Symbol]) -> Vec<Token> {
+    let v = first.first0(symbols);
+    v.iter().collect()
+}
+
+fn first1(first: &FirstSets, symbols: &[Symbol], lookahead: Token) -> Vec<Token> {
+    let v = first.first1(symbols, &TokenSet::from(lookahead));
+    v.iter().collect()
+}
+
+#[test]
+fn basic_first1() {
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        => None
+    };
+    X = "E"; // intentionally unreachable
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+
+    assert_eq!(first1(&first_sets, &[nt("A")], EOF), vec![la("C"), la("D")]);
+
+    assert_eq!(first1(&first_sets, &[nt("B")], EOF), vec![la("D"), EOF]);
+
+    assert_eq!(
+        first1(&first_sets, &[nt("B"), term("E")], EOF),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(
+        first1(&first_sets, &[nt("B"), nt("X")], EOF),
+        vec![la("D"), la("E")]
+    );
+}
+
+#[test]
+fn basic_first0() {
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+    A = B "C";
+    B: Option<u32> = {
+        "D" => Some(1),
+        => None
+    };
+    X = "E"; // intentionally unreachable
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+
+    assert_eq!(first0(&first_sets, &[nt("A")]), vec![la("C"), la("D")]);
+
+    assert_eq!(first0(&first_sets, &[nt("B")]), vec![la("D"), EOF]);
+
+    assert_eq!(
+        first0(&first_sets, &[nt("B"), term("E")]),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(
+        first0(&first_sets, &[nt("B"), nt("X")]),
+        vec![la("D"), la("E")]
+    );
+
+    assert_eq!(first0(&first_sets, &[nt("X")]), vec![la("E")]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/interpret.rs
@@ -0,0 +1,206 @@
+//! LR(1) interpeter. Just builds up parse trees. Intended for testing.
+
+use lr1::core::*;
+use lr1::lookahead::*;
+use generate::ParseTree;
+use grammar::repr::*;
+use std::iter::IntoIterator;
+use std::fmt::{Debug, Display, Error, Formatter};
+use util::Sep;
+
+pub type InterpretError<'grammar, L> = (&'grammar State<'grammar, L>, Token);
+
+/// Feed in the given tokens and then EOF, returning the final parse tree that is reduced.
+pub fn interpret<'grammar, L>(
+    states: &'grammar [State<'grammar, L>],
+    tokens: Vec<TerminalString>,
+) -> Result<ParseTree, InterpretError<'grammar, L>>
+where
+    L: LookaheadInterpret,
+{
+    println!("interpret(tokens={:?})", tokens);
+    let mut m = Machine::new(states);
+    m.execute(tokens.into_iter())
+}
+
+/// Feed in the given tokens and returns the states on the stack.
+pub fn interpret_partial<'grammar, TOKENS, L>(
+    states: &'grammar [State<'grammar, L>],
+    tokens: TOKENS,
+) -> Result<Vec<StateIndex>, InterpretError<'grammar, L>>
+where
+    TOKENS: IntoIterator<Item = TerminalString>,
+    L: LookaheadInterpret,
+{
+    let mut m = Machine::new(states);
+    try!(m.execute_partial(tokens.into_iter()));
+    Ok(m.state_stack)
+}
+
+struct Machine<'grammar, L: LookaheadInterpret + 'grammar> {
+    states: &'grammar [State<'grammar, L>],
+    state_stack: Vec<StateIndex>,
+    data_stack: Vec<ParseTree>,
+}
+
+impl<'grammar, L> Machine<'grammar, L>
+where
+    L: LookaheadInterpret,
+{
+    fn new(states: &'grammar [State<'grammar, L>]) -> Machine<'grammar, L> {
+        Machine {
+            states: states,
+            state_stack: vec![],
+            data_stack: vec![],
+        }
+    }
+
+    fn top_state(&self) -> &'grammar State<'grammar, L> {
+        let index = self.state_stack.last().unwrap();
+        &self.states[index.0]
+    }
+
+    fn execute_partial<TOKENS>(
+        &mut self,
+        mut tokens: TOKENS,
+    ) -> Result<(), InterpretError<'grammar, L>>
+    where
+        TOKENS: Iterator<Item = TerminalString>,
+    {
+        assert!(self.state_stack.is_empty());
+        assert!(self.data_stack.is_empty());
+
+        self.state_stack.push(StateIndex(0));
+
+        let mut token = tokens.next();
+        while let Some(terminal) = token.clone() {
+            let state = self.top_state();
+
+            println!("state={:?}", state);
+            println!("terminal={:?}", terminal);
+
+            // check whether we can shift this token
+            if let Some(&next_index) = state.shifts.get(&terminal) {
+                self.data_stack.push(ParseTree::Terminal(terminal.clone()));
+                self.state_stack.push(next_index);
+                token = tokens.next();
+            } else if let Some(production) = L::reduction(state, &Token::Terminal(terminal.clone()))
+            {
+                let more = self.reduce(production);
+                assert!(more);
+            } else {
+                return Err((state, Token::Terminal(terminal.clone())));
+            }
+        }
+
+        Ok(())
+    }
+
+    fn execute<TOKENS>(&mut self, tokens: TOKENS) -> Result<ParseTree, InterpretError<'grammar, L>>
+    where
+        TOKENS: Iterator<Item = TerminalString>,
+    {
+        try!(self.execute_partial(tokens));
+
+        // drain now for EOF
+        loop {
+            let state = self.top_state();
+            match L::reduction(state, &Token::EOF) {
+                None => {
+                    return Err((state, Token::EOF));
+                }
+                Some(production) => {
+                    if !self.reduce(production) {
+                        assert_eq!(self.data_stack.len(), 1);
+                        return Ok(self.data_stack.pop().unwrap());
+                    }
+                }
+            }
+        }
+    }
+
+    fn reduce(&mut self, production: &Production) -> bool {
+        println!("reduce={:?}", production);
+
+        let args = production.symbols.len();
+
+        // remove the top N items from the data stack
+        let mut popped = vec![];
+        for _ in 0..args {
+            popped.push(self.data_stack.pop().unwrap());
+        }
+        popped.reverse();
+
+        // remove the top N states
+        for _ in 0..args {
+            self.state_stack.pop().unwrap();
+        }
+
+        // construct the new, reduced tree and push it on the stack
+        let tree = ParseTree::Nonterminal(production.nonterminal.clone(), popped);
+        self.data_stack.push(tree);
+
+        // recover the state and extract the "Goto" action
+        let receiving_state = self.top_state();
+        match receiving_state.gotos.get(&production.nonterminal) {
+            Some(&goto_state) => {
+                self.state_stack.push(goto_state);
+                true // keep going
+            }
+            None => {
+                false // all done
+            }
+        }
+    }
+}
+
+impl Debug for ParseTree {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        Display::fmt(self, fmt)
+    }
+}
+
+impl Display for ParseTree {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        match *self {
+            ParseTree::Nonterminal(ref id, ref trees) => {
+                write!(fmt, "[{}: {}]", id, Sep(", ", trees))
+            }
+            ParseTree::Terminal(ref id) => write!(fmt, "{}", id),
+        }
+    }
+}
+
+pub trait LookaheadInterpret: Lookahead {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        token: &Token,
+    ) -> Option<&'grammar Production>;
+}
+
+impl LookaheadInterpret for Nil {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        _token: &Token,
+    ) -> Option<&'grammar Production> {
+        state
+            .reductions
+            .iter()
+            .map(|&(_, production)| production)
+            .next()
+    }
+}
+
+impl LookaheadInterpret for TokenSet {
+    fn reduction<'grammar>(
+        state: &State<'grammar, Self>,
+        token: &Token,
+    ) -> Option<&'grammar Production> {
+        state
+            .reductions
+            .iter()
+            .filter(|&&(ref tokens, _)| tokens.contains(token))
+            .map(|&(_, production)| production)
+            .next()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/item.rs
@@ -0,0 +1,1 @@
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/README.md
@@ -0,0 +1,417 @@
+This module contains code for LR(1) construction based on a paper by
+Pager and Chen, "The Lane Table Method Of Constructing LR(1) Parsers",
+published in APPLC '12. Unfortunately, that paper is quite compact --
+only 8 pages! -- which doesn't leave much room for examples and
+explanation.  This README is my attempt to explain the idea, or at
+least how I chose to implement it in LALRPOP, which may or may not be
+faithful to the original algorithm. Naturally it also serves as a
+guide to the code.
+
+### First example grammar: G0
+
+We will be working through two example grammars. The first I call G0
+-- it is a reduced version of what the paper calls G1. It is
+interesting because it does not require splitting any states, and so
+we wind up with the same number of states as in LR0. Put another way,
+it is an LALR(1) grammar.
+
+#### Grammar G0
+
+```
+G0 = X "c"
+   | Y "d"
+X  = "e" X
+   | "e"
+Y  = "e" Y
+   | "e"
+```
+
+#### Step 1: Construct an LR(0) state machine
+
+We begin by constructing an LR(0) state machine. The LR(0) states for
+G0 are as follows:
+
+```
+S0 = G0 = (*) X "c"
+   | G0 = (*) Y "d"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S1 = X = "e" (*) X
+   | X = "e" (*)
+   | X = (*) "e"
+   | X = (*) "e" "X"
+   | Y = "e" (*) Y
+   | Y = "e" (*)
+   | Y = (*) "e"
+   | Y = (*) "e" Y
+
+S2 = X = "e" X (*)
+
+S3 = G0 = X (*) "c"
+
+S4 = Y = "e" Y (*)
+
+S5 = G0 = Y (*) "d"
+
+S6 = G0 = X "c" (*)
+
+S7 = G0 = Y "d" (*)
+```
+
+We can also consider *edges* between the states as follows,
+with the label being the symbol that is pushed onto the stack:
+
+```
+S0 -"e"-> S1
+S1 -"e"-> S1
+S1 --X--> S2
+S0 --X--> S3
+S1 --Y--> S4
+S0 --Y--> S5
+S3 -"c"-> S6
+S5 -"d"-> S7
+```
+
+Note that state S1 is "inconsistent", in that it has conflicting
+actions.
+
+#### Step 2: Convert LR(0) states into LR(0-1) states.
+
+The term LR(0-1), but basically the idea is that the lookahead in a
+LR(0-1) state can be either a set of terminals (as in LR(1)) or *none*
+(as in LR(0)). You can also think of it alternatively as adding a
+special "wildcard" symbol `_` to the grammar; in our actual code, we
+represent this with `TokenSet::all()`. We will thus denote the
+inconsistent state after transformation as follows, where each line
+has the "wildcard" lookahead:
+
+```
+S1 = X = "e" (*) X   [_]
+   | X = "e" (*)     [_]
+   | X = (*) "e"     [_]
+   | X = (*) "e" "X" [_]
+   | Y = "e" (*) Y   [_]
+   | Y = "e" (*)     [_]
+   | Y = (*) "e"     [_]
+   | Y = (*) "e" Y   [_]
+```
+
+Naturally, the state is still inconsistent.
+
+#### Step 3: Resolve inconsistencies.
+
+In the next step, we iterate over all of our LR(0-1) states. In this
+example, we will not need to create new states, but in future examples
+we will. The iteration thus consists of a queue and some code like
+this:
+
+```rust
+let mut queue = Queue::new();
+queue.extend(/* all states */);
+while let Some(s) = queue.pop_front() {
+    if /* s is an inconsistent state */ {
+        resolve_inconsistencies(s, &mut queue);
+    }
+}
+```
+
+##### Step 3a: Build the lane table.
+
+To resolve an inconsistent state, we first construct a **lane
+table**. This is done by the code in the `lane` module (the `table`
+module maintains the data structure). It works by structing at each
+conflict and tracing **backwards**. Let's start with the final table
+we will get for the state S1 and then we will work our way back to how
+it is constructed. First, let's identify the conflicting actions from
+S1 and give them indices:
+
+```
+S1 = X = (*) "e"     [_] // C0 -- shift "e"
+   | X = "e" (*)     [_] // C1 -- reduce `X = "e" (*)`
+   | X = (*) "e" "X" [_] // C0 -- shift "e"
+   | X = "e" (*) X   [_]
+   | Y = (*) "e"     [_] // C0 -- shift "e"
+   | Y = "e" (*)     [_] // C2 -- reduce `Y = "e" (*)`
+   | Y = (*) "e" Y   [_] // C0 -- shift "e"
+   | Y = "e" (*) Y   [_]
+```
+
+Several of the items can cause "Confliction Action 0" (C0), which is
+to shift an `"e"`. These are all mutually compatible. However, there
+are also two incompatible actions: C1 and C2, both reductions. In
+fact, we'll find that we look back at state S0, these 'conflicting'
+actions all occur with distinct lookahead. The purpose of the lane
+table is to summarize that information. The lane table we will up
+constructing for these conflicting actions is as follows:
+
+```
+| State | C0    | C1    | C2    | Successors |
+| S0    |       | ["c"] | ["d"] | {S1}       |
+| S1    | ["e"] | []    | []    | {S1}       |
+```
+
+Here the idea is that the lane table summarizes the lookahead
+information contributed by each state. Note that for the *shift* the
+state S1 already has enough lookahead information: we only shift when
+we see the terminal we need next ("e"). But state C1 and C2, the lookahead
+actually came from S0, which is a predecessor state.
+
+As I said earlier, the algorithm for constructing the table works by
+looking at the conflicting item and walking backwards. So let's
+illustrate with conflict C1. We have the conflicting item `X = "e"
+(*)`, and we are basically looking to find its lookahead. We know
+that somewhere in the distant past of our state machine there must be
+an item like
+
+    Foo = ...a (*) X ...b
+    
+that led us here. We want to find that item, so we can derive the
+lookahead from `...b` (whatever symbols come after `X`).
+
+To do this, we will walk the graph. Our state at any point in time
+will be the pair of a state and an item in that state. To start out,
+then, we have `(S1, X = "e" (*))`, which is the conflict C1. Because
+the `(*)` is not at the "front" of this item, we have to figure out
+where this `"e"` came from on our stack, so we look for predecessors
+of the state S1 which have an item like `X = (*) e`. This leads us to
+S0 and also S1. So we can push two states in our search: `(S0, X = (*)
+"e")` and `(S1, X = (*) "e")`. Let's consider each in turn.
+
+The next state is then `(S0, X = (*) "e")`. Here the `(*)` lies at the
+front of the item, so we search **the same state** S0 for items that
+would have led to this state via an *epsilon move*.  This basically
+means an item like `Foo = ... (*) X ...` -- i.e., where the `(*)`
+appears directly before the nonterminal `X`. In our case, we will find
+`G0 = (*) X "c"`. This is great, because it tells us some lookahead
+("c", in particular), and hence we can stop our search. We add to the
+table the entry that the state S0 contributes lookahead "c" to the
+conflict C1.  In some cases, we might find something like `Foo =
+... (*) X` instead, where the `X` we are looking for appears at the
+end. In that case, we have to restart our search, but looking for the
+lookahead for `Foo`.
+
+The next state in our case is `(S1, X = (*) e)`. Again the `(*)` lies
+at the beginning and hence we search for things in the state S1 where
+`X` is the next symbol. We find `X = "e" (*) X`. This is not as good
+as last time, because there are no symbols appearing after X in this
+item, so it does not contribute any lookahead. We therefore can't stop
+our search yet, but we push the state `(S1, X = "e" (*) X)` -- this
+corresponds to the `Foo` state I mentioned at the end of the last
+paragraph, except that in this case `Foo` is the same nonterminal `X`
+we started with.
+
+Looking at `(S1, X = "e" (*) X)`, we again have the `(*)` in the
+middle of the item, so we move it left, searching for predecessors
+with the item `X = (*) e X`. We will (again) find S0 and S1 have such
+items. In the case of S0, we will (again) find the context "c", which
+we dutifully add to the table (this has no effect, since it is already
+present). In the case of S1, we will (again) wind up at the state
+`(S1, X = "e" (*) X)`.  Since we've already visited this state, we
+stop our search, it will not lead to new context.
+
+At this point, our table column for C1 is complete. We can repeat the
+process for C2, which plays out in an analogous way.
+
+##### Step 3b: Update the lookahead
+
+Looking at the lane table we built, we can union the context sets in
+any particular column. We see that the context sets for each
+conflicting action are pairwise disjoint. Therefore, we can simply
+update each reduce action in our state with those lookaheads in mind,
+and hence render it consistent:
+
+```
+S1 = X = (*) "e"     [_]
+   | X = "e" (*)     ["c"] // lookahead from C1
+   | X = (*) "e" "X" [_]
+   | X = "e" (*) X   [_]
+   | Y = (*) "e"     [_]
+   | Y = "e" (*)     ["d"] // lookahead from C2
+   | Y = (*) "e" Y   [_]
+   | Y = "e" (*) Y   [_]
+```
+
+This is of course also what the LALR(1) state would look like (though
+it would include context for the other items, though that doesn't play
+into the final machine execution).
+
+At this point we've covered enough to handle the grammar G0.  Let's
+turn to a more complex grammar, grammar G1, and then we'll come back
+to cover the remaining steps.
+
+### Second example: the grammar G1
+
+G1 is a (typo corrected) version of the grammar from the paper. This
+grammar is not LALR(1) and hence it is more interesting, because it
+requires splitting states.
+
+#### Grammar G1
+
+```
+G1 = "a" X "d"
+   | "a" Y "c"
+   | "b" X "c"
+   | "b" Y "d"
+X  = "e" X
+   | "e"
+Y  = "e" Y
+   | "e"
+```
+
+The key point of this grammar is that when we see `... "e" "c"` and we
+wish to know whether to reduce to `X` or `Y`, we don't have enough
+information. We need to know what is in the `...`, because `"a" "e"
+"c"` means we reduce `"e"` to `Y` and `"b" "e" "c"` means we reduce to
+`X`. In terms of our *state machine*, this corresponds to *splitting*
+the states responsible for X and Y based on earlier context.
+
+Let's look at a subset of the LR(0) states for G1:
+
+```
+S0 = G0 = (*) "a" X "d"
+   | G0 = (*) "a" Y "c"
+   | G0 = (*) "b" X "c"
+   | G0 = (*) "b" X "d"
+   
+S1 = G0 = "a" (*) X "d"
+   | G0 = "a" (*) Y "c"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S2 = G0 = "b" (*) X "c"
+   | G0 = "b" (*) Y "d"
+   | X = (*) "e" X
+   | X = (*) "e"
+   | Y = (*) "e" Y
+   | Y = (*) "e"
+
+S3 = X = "e" (*) X
+   | X = "e" (*)      // C1 -- can reduce
+   | X = (*) "e"      // C0 -- can shift "e"
+   | X = (*) "e" "X"  // C0 -- can shift "e"
+   | Y = "e" (*) Y
+   | Y = "e" (*)      // C2 -- can reduce
+   | Y = (*) "e"      // C0 -- can shift "e"
+   | Y = (*) "e" Y    // C0 -- can shift "e"
+```
+
+Here we can see the problem. The state S3 is inconsistent. But it is
+reachable from both S1 and S2. If we come from S1, then we can have (e.g.)
+`X "d"`, but if we come from S2, we expect `X "c"`.
+
+Let's walk through our algorithm again. I'll start with step 3a.
+
+### Step 3a: Build the lane table.
+
+The lane table for state S3 will look like this:
+
+```
+| State | C0    | C1    | C2    | Successors |
+| S1    |       | ["d"] | ["c"] | {S3}       |
+| S2    |       | ["c"] | ["d"] | {S3}       |
+| S3    | ["e"] | []    | []    | {S3}       |
+```
+
+Now if we union each column, we see that both C1 and C2 wind up with
+lookahead `{"c", "d"}`. This is our problem. We have to isolate things
+better. Therefore, step 3b ("update lookahead") does not apply. Instead
+we attempt step 3c.
+
+### Step 3c: Isolate lanes
+
+This part of the algorithm is only loosely described in the paper, but
+I think it works as follows. We will employ a union-find data
+structure. With each set, we will record a "context set", which
+records for each conflict the set of lookahead tokens (e.g.,
+`{C1:{"d"}}`).
+
+A context set tells us how to map the lookahead to an action;
+therefire, to be self-consistent, the lookaheads for each conflict
+must be mutually disjoint. In other words, `{C1:{"d"}, C2:{"c"}}` is
+valid, and says to do C1 if we see a "d" and C2 if we see a "c". But
+`{C1:{"d"}, C2:{"d"}}` is not, because there are two actions.
+
+Initially, each state in the lane table is mapped to itself, and the
+conflict set is derived from its column in the lane table:
+
+```
+S1 = {C1:d, C2:c}
+S2 = {C1:c, C2:d}
+S3 = {C0:e}
+```
+
+We designate "beachhead" states as those states in the table that are
+not reachable from another state in the table (i.e., using the
+successors). In this case, those are the states S1 and S2. We will be
+doing a DFS through the table and we want to use those as the starting
+points.
+
+(Question: is there always at least one beachhead state? Seems like
+there must be.)
+
+So we begin by iterating over the beachhead states.
+
+```rust
+for beachhead in beachheads { ... }
+```
+
+When we visit a state X, we will examine each of its successors Y. We
+consider whether the context set for Y can be merged with the context
+set for X. So, in our case, X will be S1 to start and Y will be S3.
+In this case, the context set can be merged, and hence we union S1, S3
+and wind up with the following union-find state:
+
+```
+S1,S3 = {C0:e, C1:d, C2:c}
+S2    = {C1:c, C2:d}
+```
+
+(Note that this union is just for the purpose of tracking context; it
+doesn't imply that S1 and S3 are the 'same states' or anything like
+that.)
+
+Next we examine the edge S3 -> S3. Here the contexts are already
+merged and everything is happy, so we stop. (We already visited S3,
+after all.)
+
+This finishes our first beachhead, so we proceed to the next edge, S2
+-> S3. Here we find that we **cannot** union the context: it would
+produce an inconsistent state. So what we do is we **clone** S3 to
+make a new state, S3', with the initial setup corresponding to the row
+for S3 from the lane table:
+
+```
+S1,S3 = {C0:e, C1:d, C2:c}
+S2    = {C1:c, C2:d}
+S3'   = {C0:e}
+```
+
+This also involves updating our LR(0-1) state set to have a new state
+S3'. All edges from S2 that led to S3 now lead to S3'; the outgoing
+edges from S3' remain unchanged. (At least to start.)
+
+Therefore, the edge `S2 -> S3` is now `S2 -> S3'`. We can now merge
+the conflicts:
+
+```
+S1,S3  = {C0:e, C1:d, C2:c}
+S2,S3' = {C0:e, C1:c, C2:d}
+```
+
+Now we examine the outgoing edge S3' -> S3. We cannot merge these
+conflicts, so we search (greedily, I guess) for a clone of S3 where we
+can merge the conflicts. We find one in S3', and hence we redirect the
+S3 edge to S3' and we are done. (I think the actual search we want is
+to make first look for a clone of S3 that is using literally the same
+context as us (i.e., same root node), as in this case. If that is not
+found, *then* we search for one with a mergable context. If *that*
+fails, then we clone a new state.)
+
+The final state thus has two copies of S3, one for the path from S1,
+and one for the path from S2, which gives us enough context to
+proceed.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/construct/merge.rs
@@ -0,0 +1,218 @@
+use collections::{Map, Multimap, Set};
+use ena::unify::UnificationTable;
+use lr1::core::{Action, LR1State, StateIndex};
+use lr1::lane_table::construct::state_set::StateSet;
+use lr1::lane_table::table::LaneTable;
+use lr1::lane_table::table::context_set::ContextSet;
+
+/// The "merge" phase of the algorithm is described in "Step 3c" of
+/// [the README][r].  It consists of walking through the various
+/// states in the lane table and merging them into sets of states that
+/// have compatible context sets; if we encounter a state S that has a
+/// successor T but where the context set of S is not compatible with
+/// T, then we will clone T into a new T2 (and hopefully the context
+/// set of S will be compatible with the reduced context of T2).
+///
+/// [r]: ../README.md
+pub struct Merge<'m, 'grammar: 'm> {
+    table: &'m LaneTable<'grammar>,
+    states: &'m mut Vec<LR1State<'grammar>>,
+    visited: Set<StateIndex>,
+    original_indices: Map<StateIndex, StateIndex>,
+    clones: Multimap<StateIndex, Vec<StateIndex>>,
+    target_states: Vec<StateIndex>,
+    context_sets: ContextSets<'m>,
+}
+
+impl<'m, 'grammar> Merge<'m, 'grammar> {
+    pub fn new(
+        table: &'m LaneTable<'grammar>,
+        unify: &'m mut UnificationTable<StateSet>,
+        states: &'m mut Vec<LR1State<'grammar>>,
+        state_sets: &'m mut Map<StateIndex, StateSet>,
+        inconsistent_state: StateIndex,
+    ) -> Self {
+        Merge {
+            table: table,
+            states: states,
+            visited: Set::new(),
+            original_indices: Map::new(),
+            clones: Multimap::new(),
+            target_states: vec![inconsistent_state],
+            context_sets: ContextSets {
+                unify: unify,
+                state_sets: state_sets,
+            },
+        }
+    }
+
+    pub fn start(&mut self, beachhead_state: StateIndex) -> Result<(), (StateIndex, StateIndex)> {
+        debug!("Merge::start(beachhead_state={:?})", beachhead_state);
+
+        // Since we always start walks from beachhead states, and they
+        // are not reachable from anyone else, this state should not
+        // have been unioned with anything else yet.
+        self.walk(beachhead_state)
+    }
+
+    pub fn patch_target_starts(mut self, actions: &Set<Action<'grammar>>) {
+        debug!("Merge::patch_target_starts(actions={:?})", actions);
+
+        for &target_state in &self.target_states {
+            debug!(
+                "Merge::patch_target_starts: target_state={:?}",
+                target_state
+            );
+            let context_set = self.context_sets.context_set(target_state);
+            debug!("Merge::patch_target_starts: context_set={:?}", context_set);
+            context_set.apply(&mut self.states[target_state.0], actions);
+        }
+    }
+
+    /// If `state` is a cloned state, find its original index.  Useful
+    /// for indexing into the lane table and so forth.
+    fn original_index(&self, state: StateIndex) -> StateIndex {
+        *self.original_indices.get(&state).unwrap_or(&state)
+    }
+
+    fn successors(&self, state: StateIndex) -> Option<&'m Set<StateIndex>> {
+        self.table.successors(self.original_index(state))
+    }
+
+    fn walk(&mut self, state: StateIndex) -> Result<(), (StateIndex, StateIndex)> {
+        debug!("Merge::walk(state={:?})", state);
+
+        if !self.visited.insert(state) {
+            debug!("Merge::walk: visited already");
+            return Ok(());
+        }
+
+        for &successor in self.successors(state).iter().flat_map(|&s| s) {
+            debug!("Merge::walk: state={:?} successor={:?}", state, successor);
+
+            if self.context_sets.union(state, successor) {
+                debug!(
+                    "Merge::walk: successful union, context-set = {:?}",
+                    self.context_sets.context_set(state)
+                );
+                self.walk(successor)?;
+            } else {
+                // search for an existing clone with which we can merge
+                debug!("Merge::walk: union failed, seek existing clone");
+                let existing_clone = {
+                    let context_sets = &mut self.context_sets;
+                    self.clones.get(&successor)
+                               .into_iter()
+                               .flat_map(|clones| clones) // get() returns an Option<Set>
+                               .cloned()
+                               .filter(|&successor1| context_sets.union(state, successor1))
+                               .next()
+                };
+
+                if let Some(successor1) = existing_clone {
+                    debug!("Merge::walk: found existing clone {:?}", successor1);
+                    self.patch_links(state, successor, successor1);
+                    self.walk(successor1)?;
+                } else {
+                    // if we don't find one, we have to make a new clone
+                    debug!("Merge::walk: creating new clone of {:?}", successor);
+                    let successor1 = self.clone(successor);
+                    if self.context_sets.union(state, successor1) {
+                        self.patch_links(state, successor, successor1);
+                        self.walk(successor1)?;
+                    } else {
+                        debug!(
+                            "Merge::walk: failed to union {:?} with {:?}",
+                            state, successor1
+                        );
+                        debug!(
+                            "Merge::walk: state context = {:?}",
+                            self.context_sets.context_set(state)
+                        );
+                        debug!(
+                            "Merge::walk: successor context = {:?}",
+                            self.context_sets.context_set(successor1)
+                        );
+
+                        return Err((self.original_index(state), self.original_index(successor1)));
+                    }
+                }
+            }
+        }
+
+        Ok(())
+    }
+
+    fn clone(&mut self, state: StateIndex) -> StateIndex {
+        // create a new state with same contents as the old one
+        let new_index = StateIndex(self.states.len());
+        let new_state = self.states[state.0].clone();
+        self.states.push(new_state);
+
+        // track the original index and clones
+        let original_index = self.original_index(state);
+        self.original_indices.insert(new_index, original_index);
+        self.clones.push(original_index, new_index);
+
+        // create a new unify key for this new state
+        let context_set = self.table.context_set(original_index).unwrap();
+        self.context_sets.new_state(new_index, context_set);
+
+        // keep track of the clones of the target state
+        if original_index == self.target_states[0] {
+            self.target_states.push(new_index);
+        }
+
+        debug!("Merge::clone: cloned {:?} to {:?}", state, new_index);
+        new_index
+    }
+
+    fn patch_links(
+        &mut self,
+        predecessor: StateIndex,
+        original_successor: StateIndex,
+        cloned_successor: StateIndex,
+    ) {
+        let replace = |target_state: &mut StateIndex| {
+            if *target_state == original_successor {
+                *target_state = cloned_successor;
+            }
+        };
+
+        let state = &mut self.states[predecessor.0];
+        for (_, target_state) in &mut state.shifts {
+            replace(target_state);
+        }
+        for (_, target_state) in &mut state.gotos {
+            replace(target_state);
+        }
+    }
+}
+
+struct ContextSets<'m> {
+    state_sets: &'m mut Map<StateIndex, StateSet>,
+    unify: &'m mut UnificationTable<StateSet>,
+}
+
+impl<'m> ContextSets<'m> {
+    fn context_set(&mut self, state: StateIndex) -> ContextSet {
+        let state_set = self.state_sets[&state];
+        self.unify.probe_value(state_set)
+    }
+
+    fn union(&mut self, source: StateIndex, target: StateIndex) -> bool {
+        let set1 = self.state_sets[&source];
+        let set2 = self.state_sets[&target];
+        let result = self.unify.unify_var_var(set1, set2).is_ok();
+        debug!(
+            "ContextSets::union: source={:?} target={:?} result={:?}",
+            source, target, result
+        );
+        result
+    }
+
+    fn new_state(&mut self, new_index: StateIndex, context_set: ContextSet) {
+        let state_set = self.unify.new_key(context_set);
+        self.state_sets.insert(new_index, state_set);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/construct/mod.rs
@@ -0,0 +1,264 @@
+//!
+
+use collections::{Map, Set};
+use ena::unify::UnificationTable;
+use grammar::repr::*;
+use lr1::build;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::lookahead::{Lookahead, TokenSet};
+use lr1::lane_table::lane::LaneTracer;
+use lr1::lane_table::table::{ConflictIndex, LaneTable};
+use lr1::lane_table::table::context_set::OverlappingLookahead;
+use lr1::state_graph::StateGraph;
+use std::rc::Rc;
+
+mod merge;
+use self::merge::Merge;
+
+mod state_set;
+use self::state_set::StateSet;
+
+pub struct LaneTableConstruct<'grammar> {
+    grammar: &'grammar Grammar,
+    first_sets: FirstSets,
+    start_nt: NonterminalString,
+}
+
+impl<'grammar> LaneTableConstruct<'grammar> {
+    pub fn new(grammar: &'grammar Grammar, start_nt: NonterminalString) -> Self {
+        let first_sets = FirstSets::new(grammar);
+        LaneTableConstruct {
+            grammar: grammar,
+            start_nt: start_nt,
+            first_sets: first_sets,
+        }
+    }
+
+    pub fn construct(self) -> Result<Vec<LR1State<'grammar>>, LR1TableConstructionError<'grammar>> {
+        let states = {
+            match build::build_lr0_states(self.grammar, self.start_nt.clone()) {
+                Ok(states) => {
+                    // In this case, the grammar is actually
+                    // LR(0). This is very rare -- it means that the
+                    // grammar does not need lookahead to execute. In
+                    // principle, we could stop here, except that if
+                    // we do so, then the lookahead values that we get
+                    // are very broad.
+                    //
+                    // Broad lookahead values will cause "eager"
+                    // reduce at runtime -- i.e., if there is some
+                    // scenario where the lookahead tells you we are
+                    // in error, but we would have to reduce a few
+                    // states before we see it. This, in turn, can
+                    // cause infinite loops around error recovery
+                    // (#240).
+                    //
+                    // Since we want to behave as a LR(1) parser
+                    // would, we'll just go ahead and run the
+                    // algorithm.
+                    states
+                }
+                Err(TableConstructionError {
+                    states,
+                    conflicts: _,
+                }) => states,
+            }
+        };
+
+        // Convert the LR(0) states into LR(0-1) states.
+        let mut states = self.promote_lr0_states(states);
+
+        // For each inconsistent state, apply the lane-table algorithm to
+        // resolve it.
+        for i in 0.. {
+            if i >= states.len() {
+                break;
+            }
+
+            match self.resolve_inconsistencies(&mut states, StateIndex(i)) {
+                Ok(()) => {}
+                Err(_) => {
+                    // We failed because of irreconcilable conflicts
+                    // somewhere. Just compute the conflicts from the final set of
+                    // states.
+                    debug!(
+                        "construct: failed to resolve inconsistencies in state {:#?}",
+                        states[i]
+                    );
+                    let conflicts: Vec<Conflict<'grammar, TokenSet>> = states
+                        .iter()
+                        .flat_map(|s| Lookahead::conflicts(&s))
+                        .collect();
+                    return Err(TableConstructionError {
+                        states: states,
+                        conflicts: conflicts,
+                    });
+                }
+            }
+        }
+
+        Ok(states)
+    }
+
+    /// Given a set of LR0 states, returns LR1 states where the lookahead
+    /// is always `TokenSet::all()`. We refer to these states as LR(0-1)
+    /// states in the README.
+    fn promote_lr0_states(&self, lr0: Vec<LR0State<'grammar>>) -> Vec<LR1State<'grammar>> {
+        let all = TokenSet::all();
+        debug!("promote_lr0_states: all={:?}", all);
+        lr0.into_iter()
+            .map(|s| {
+                let items = s.items
+                    .vec
+                    .iter()
+                    .map(|item| Item {
+                        production: item.production,
+                        index: item.index,
+                        lookahead: all.clone(),
+                    })
+                    .collect();
+                let reductions = s.reductions
+                    .into_iter()
+                    .map(|(_, p)| (all.clone(), p))
+                    .collect();
+                State {
+                    index: s.index,
+                    items: Items {
+                        vec: Rc::new(items),
+                    },
+                    shifts: s.shifts,
+                    reductions: reductions,
+                    gotos: s.gotos,
+                }
+            })
+            .collect()
+    }
+
+    fn resolve_inconsistencies(
+        &self,
+        states: &mut Vec<LR1State<'grammar>>,
+        inconsistent_state: StateIndex,
+    ) -> Result<(), StateIndex> {
+        debug!(
+            "resolve_inconsistencies(inconsistent_state={:?}/{:#?}",
+            inconsistent_state, states[inconsistent_state.0]
+        );
+
+        let mut actions = super::conflicting_actions(&states[inconsistent_state.0]);
+        if actions.is_empty() {
+            // This can mean one of two things: only shifts, or a
+            // single reduction. We have to be careful about states
+            // with a single reduction: even though such a state is
+            // not inconsistent (there is only one possible course of
+            // action), we still want to run the lane table algorithm,
+            // because otherwise we get states with "complete"
+            // lookahead, which messes with error recovery.
+            //
+            // In particular, if there is too much lookahead, we will
+            // reduce even when it is inappropriate to do so.
+            actions = states[inconsistent_state.0]
+                .reductions
+                .iter()
+                .map(|&(_, prod)| Action::Reduce(prod))
+                .collect();
+            if actions.is_empty() {
+                return Ok(());
+            }
+        }
+
+        debug!("resolve_inconsistencies: conflicting_actions={:?}", actions);
+
+        let table = self.build_lane_table(states, inconsistent_state, &actions);
+
+        // Consider first the "LALR" case, where the lookaheads for each
+        // action are completely disjoint.
+        if self.attempt_lalr(&mut states[inconsistent_state.0], &table, &actions) {
+            return Ok(());
+        }
+
+        // Construct the initial states; each state will map to a
+        // context-set derived from its row in the lane-table. This is
+        // fallible, because a state may be internally inconstent.
+        //
+        // (To handle unification, we also map each state to a
+        // `StateSet` that is its entry in the `ena` table.)
+        let rows = table.rows()?;
+        let mut unify = UnificationTable::<StateSet>::new();
+        let mut state_sets = Map::new();
+        for (&state_index, context_set) in &rows {
+            let state_set = unify.new_key(context_set.clone());
+            state_sets.insert(state_index, state_set);
+            debug!(
+                "resolve_inconsistencies: state_index={:?}, state_set={:?}",
+                state_index, state_set
+            );
+        }
+
+        // Now merge state-sets, cloning states where needed.
+        let mut merge = Merge::new(
+            &table,
+            &mut unify,
+            states,
+            &mut state_sets,
+            inconsistent_state,
+        );
+        let beachhead_states = table.beachhead_states();
+        for beachhead_state in beachhead_states {
+            match merge.start(beachhead_state) {
+                Ok(()) => {}
+                Err((source, _)) => {
+                    debug!(
+                        "resolve_inconsistencies: failed to merge, source={:?}",
+                        source
+                    );
+                    return Err(source);
+                }
+            }
+        }
+        merge.patch_target_starts(&actions);
+
+        Ok(())
+    }
+
+    fn attempt_lalr(
+        &self,
+        state: &mut LR1State<'grammar>,
+        table: &LaneTable<'grammar>,
+        actions: &Set<Action<'grammar>>,
+    ) -> bool {
+        match table.columns() {
+            Ok(columns) => {
+                debug!("attempt_lalr, columns={:#?}", columns);
+                columns.apply(state, actions);
+                debug!("attempt_lalr, state={:#?}", state);
+                true
+            }
+            Err(OverlappingLookahead) => {
+                debug!("attempt_lalr, OverlappingLookahead");
+                false
+            }
+        }
+    }
+
+    fn build_lane_table(
+        &self,
+        states: &[LR1State<'grammar>],
+        inconsistent_state: StateIndex,
+        actions: &Set<Action<'grammar>>,
+    ) -> LaneTable<'grammar> {
+        let state_graph = StateGraph::new(states);
+        let mut tracer = LaneTracer::new(
+            self.grammar,
+            self.start_nt.clone(),
+            states,
+            &self.first_sets,
+            &state_graph,
+            actions.len(),
+        );
+        for (i, action) in actions.iter().enumerate() {
+            tracer.start_trace(inconsistent_state, ConflictIndex::new(i), action.clone());
+        }
+        tracer.into_table()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/construct/state_set.rs
@@ -0,0 +1,44 @@
+use ena::unify::{UnifyKey, UnifyValue};
+use lr1::lane_table::table::context_set::{ContextSet, OverlappingLookahead};
+
+/// The unification key for a set of states in the lane table
+/// algorithm.  Each set of states is associated with a
+/// `ContextSet`. When two sets of states are merged, their conflict
+/// sets are merged as well; this will fail if that would produce an
+/// overlapping conflict set.
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub struct StateSet {
+    index: u32,
+}
+
+impl UnifyKey for StateSet {
+    type Value = ContextSet;
+
+    fn index(&self) -> u32 {
+        self.index
+    }
+
+    fn from_index(u: u32) -> Self {
+        StateSet { index: u }
+    }
+
+    fn tag() -> &'static str {
+        "StateSet"
+    }
+}
+
+// FIXME: The `ena` interface is really designed around `UnifyValue`
+// being cheaply cloneable; we should either refactor `ena` a bit or
+// find some other way to associate a `ContextSet` with a state set
+// (for example, we could have each state set be associated with an
+// index that maps to a `ContextSet`), and do the merging ourselves.
+// But this is easier for now, and cloning a `ContextSet` isn't THAT
+// expensive, right? :)
+impl UnifyValue for ContextSet {
+    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, (Self, Self)> {
+        match ContextSet::union(value1, value2) {
+            Ok(v) => Ok(v),
+            Err(OverlappingLookahead) => Err((value1.clone(), value2.clone())),
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/lane/mod.rs
@@ -0,0 +1,149 @@
+//! Code to trace out a single lane, collecting information into the
+//! lane table as we go.
+
+use collections::Set;
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::lookahead::*;
+use lr1::state_graph::StateGraph;
+
+use super::table::{ConflictIndex, LaneTable};
+
+pub struct LaneTracer<'trace, 'grammar: 'trace, L: Lookahead + 'trace> {
+    states: &'trace [State<'grammar, L>],
+    first_sets: &'trace FirstSets,
+    state_graph: &'trace StateGraph,
+    table: LaneTable<'grammar>,
+    start_nt: NonterminalString,
+}
+
+impl<'trace, 'grammar, L: Lookahead> LaneTracer<'trace, 'grammar, L> {
+    pub fn new(
+        grammar: &'grammar Grammar,
+        start_nt: NonterminalString,
+        states: &'trace [State<'grammar, L>],
+        first_sets: &'trace FirstSets,
+        state_graph: &'trace StateGraph,
+        conflicts: usize,
+    ) -> Self {
+        LaneTracer {
+            states: states,
+            first_sets: first_sets,
+            state_graph: state_graph,
+            start_nt: start_nt,
+            table: LaneTable::new(grammar, conflicts),
+        }
+    }
+
+    pub fn into_table(self) -> LaneTable<'grammar> {
+        self.table
+    }
+
+    pub fn start_trace(
+        &mut self,
+        state: StateIndex,
+        conflict: ConflictIndex,
+        action: Action<'grammar>,
+    ) {
+        let mut visited_set = Set::default();
+
+        // if the conflict item is a "shift" item, then the context
+        // is always the terminal to shift (and conflicts only arise
+        // around shifting terminal, so it must be a terminal)
+        match action {
+            Action::Shift(term, _) => {
+                let mut token_set = TokenSet::new();
+                token_set.insert(Token::Terminal(term));
+                self.table.add_lookahead(state, conflict, &token_set);
+            }
+
+            Action::Reduce(prod) => {
+                let item = Item::lr0(prod, prod.symbols.len());
+                self.continue_trace(state, conflict, item, &mut visited_set);
+            }
+        }
+    }
+
+    fn continue_trace(
+        &mut self,
+        state: StateIndex,
+        conflict: ConflictIndex,
+        item: LR0Item<'grammar>,
+        visited: &mut Set<(StateIndex, LR0Item<'grammar>)>,
+    ) {
+        if !visited.insert((state, item)) {
+            return;
+        }
+
+        if item.index > 0 {
+            // This item was reached by shifting some symbol.  We need
+            // to unshift that symbol, which means we walk backwards
+            // to predecessors of `state` in the state graph.
+            //
+            // Example:
+            //
+            //     X = ...p T (*) ...s
+            //
+            // Here we would be "unshifting" T, which means we will
+            // walk to predecessors of the current state that were
+            // reached by shifting T. Those predecessors will contain
+            // an item like `X = ...p (*) T ...s`, which we will then
+            // process in turn.
+            let shifted_symbol = item.production.symbols[item.index - 1].clone();
+            let unshifted_item = Item {
+                index: item.index - 1,
+                ..item
+            };
+            let predecessors = self.state_graph.predecessors(state, shifted_symbol);
+            for predecessor in predecessors {
+                self.table.add_successor(predecessor, state);
+                self.continue_trace(predecessor, conflict, unshifted_item, visited);
+            }
+            return;
+        }
+
+        // Either: we are in the start state, or this item was
+        // reached by an epsilon transition. We have to
+        // "unepsilon", which means that we search elsewhere in
+        // the state for where the epsilon transition could have
+        // come from.
+        //
+        // Example:
+        //
+        //     X = (*) ...
+        //
+        // We will search for other items in the same state like:
+        //
+        //     Y = ...p (*) X ...s
+        //
+        // We can then insert `FIRST(...s)` as lookahead for
+        // `conflict`. If `...s` may derive epsilon, though, we
+        // have to recurse and search with the previous item.
+
+        let state_items = &self.states[state.0].items.vec;
+        let nonterminal = &item.production.nonterminal;
+        if *nonterminal == self.start_nt {
+            // as a special case, if the `X` above is the special, synthetic
+            // start-terminal, then the only thing that comes afterwards is EOF.
+            self.table.add_lookahead(state, conflict, &TokenSet::eof());
+        }
+
+        // NB: Under the normal LR terms, the start nonterminal will
+        // only have one production like `X' = X`, in which case this
+        // loop is useless, but sometimes in tests we don't observe
+        // that restriction, so do it anyway.
+        for pred_item in state_items
+            .iter()
+            .filter(|i| i.can_shift_nonterminal(nonterminal))
+        {
+            let symbol_sets = pred_item.symbol_sets();
+            let mut first = self.first_sets.first0(symbol_sets.suffix);
+            let derives_epsilon = first.take_eof();
+            self.table.add_lookahead(state, conflict, &first);
+            if derives_epsilon {
+                self.continue_trace(state, conflict, pred_item.to_lr0(), visited);
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/mod.rs
@@ -0,0 +1,27 @@
+use collections::Set;
+use lr1::core::*;
+use lr1::lookahead::Lookahead;
+use grammar::repr::*;
+
+mod construct;
+mod lane;
+mod table;
+
+#[cfg(test)]
+mod test;
+
+pub fn build_lane_table_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    construct::LaneTableConstruct::new(grammar, start).construct()
+}
+
+fn conflicting_actions<'grammar, L: Lookahead>(
+    state: &State<'grammar, L>,
+) -> Set<Action<'grammar>> {
+    let conflicts = L::conflicts(state);
+    let reductions = conflicts.iter().map(|c| Action::Reduce(c.production));
+    let actions = conflicts.iter().map(|c| c.action.clone());
+    reductions.chain(actions).collect()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/table/context_set/mod.rs
@@ -0,0 +1,98 @@
+//! A key part of the lane-table algorithm is the idea of a CONTEXT
+//! SET (my name, the paper has no name for this). Basically it
+//! represents the LR1 context under which a given conflicting action
+//! would take place.
+//!
+//! So, for example, imagine this grammar:
+//!
+//! ```notrust
+//! A = B x
+//!   | C y
+//! B = z
+//! C = z
+//! ```
+//!
+//! This gives rise to states like:
+//!
+//! - `S0 = { * B x, * C y, B = * z, C = * z }`
+//! - `S1 = { B = z *, C = z * }`
+//!
+//! This second state has two conflicting items. Let's call them
+//! conflicts 0 and 1 respectively. The conflict set would then have
+//! two entries (one for each conflict) and it would map each of them
+//! to a TokenSet supplying context. So when we trace everything
+//! out we might get a ContextSet of:
+//!
+//! - `[ 0: x, 1: y ]`
+//!
+//! In general, you want to ensure that the token sets of all
+//! conflicting items are pairwise-disjoint, or else if you get to a
+//! state that has both of those items (which, by definition, does
+//! arise) you won't know which to take. In this case, we're all set,
+//! because item 0 occurs only with lookahead `x` and item 1 with
+//! lookahead `y`.
+
+use collections::{Map, Set};
+use lr1::core::*;
+use lr1::lookahead::*;
+mod test;
+
+use super::ConflictIndex;
+
+#[derive(Clone, Debug)]
+pub struct ContextSet {
+    values: Vec<TokenSet>,
+}
+
+#[derive(Debug)]
+pub struct OverlappingLookahead;
+
+impl ContextSet {
+    pub fn new(num_conflicts: usize) -> Self {
+        ContextSet {
+            values: (0..num_conflicts).map(|_| TokenSet::new()).collect(),
+        }
+    }
+
+    pub fn union(set1: &ContextSet, set2: &ContextSet) -> Result<Self, OverlappingLookahead> {
+        let mut result = set1.clone();
+        for (i, t) in set2.values.iter().enumerate() {
+            result.insert(ConflictIndex::new(i), t)?;
+        }
+        Ok(result)
+    }
+
+    /// Attempts to merge the values `conflict: set` into this
+    /// conflict set. If this would result in an invalid conflict set
+    /// (where two conflicts have overlapping lookahead), then returns
+    /// `Err(OverlappingLookahead)` and has no effect.
+    ///
+    /// Assuming no errors, returns `Ok(true)` if this resulted in any
+    /// modifications, and `Ok(false)` otherwise.
+    pub fn insert(
+        &mut self,
+        conflict: ConflictIndex,
+        set: &TokenSet,
+    ) -> Result<bool, OverlappingLookahead> {
+        for (value, index) in self.values.iter().zip((0..).map(ConflictIndex::new)) {
+            if index != conflict {
+                if value.is_intersecting(&set) {
+                    return Err(OverlappingLookahead);
+                }
+            }
+        }
+
+        Ok(self.values[conflict.index].union_with(&set))
+    }
+
+    pub fn apply<'grammar>(&self, state: &mut LR1State<'grammar>, actions: &Set<Action<'grammar>>) {
+        // create a map from each action to its lookahead
+        let lookaheads: Map<Action<'grammar>, &TokenSet> =
+            actions.iter().cloned().zip(&self.values).collect();
+
+        for &mut (ref mut lookahead, production) in &mut state.reductions {
+            let action = Action::Reduce(production);
+            *lookahead = lookaheads[&action].clone();
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/table/context_set/test.rs
@@ -0,0 +1,1 @@
+#![cfg(test)]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/table/mod.rs
@@ -0,0 +1,203 @@
+//! The "Lane Table". In the paper, this is depicted like so:
+//!
+//! ```
+//! +-------+----+-----+----+------------+
+//! + State | C1 | ... | Cn | Successors |
+//! +-------+----+-----+----+------------+
+//! ```
+//!
+//! where each row summarizes some state that potentially contributes
+//! lookahead to the conflict. The columns `Ci` represent each of the
+//! conflicts we are trying to disentangle; their values are each
+//! `TokenSet` indicating the lookahead contributing by this state.
+//! The Successors is a vector of further successors. For simplicity
+//! though we store this using maps, at least for now.
+
+use collections::{Map, Multimap, Set};
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::lookahead::*;
+use std::default::Default;
+use std::fmt::{Debug, Error, Formatter};
+use std::iter;
+
+pub mod context_set;
+use self::context_set::{ContextSet, OverlappingLookahead};
+
+#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub struct ConflictIndex {
+    index: usize,
+}
+
+impl ConflictIndex {
+    pub fn new(index: usize) -> ConflictIndex {
+        ConflictIndex { index: index }
+    }
+}
+
+pub struct LaneTable<'grammar> {
+    _grammar: &'grammar Grammar,
+    conflicts: usize,
+    lookaheads: Map<(StateIndex, ConflictIndex), TokenSet>,
+    successors: Multimap<StateIndex, Set<StateIndex>>,
+}
+
+impl<'grammar> LaneTable<'grammar> {
+    pub fn new(grammar: &'grammar Grammar, conflicts: usize) -> LaneTable {
+        LaneTable {
+            _grammar: grammar,
+            conflicts: conflicts,
+            lookaheads: Map::default(),
+            successors: Multimap::default(),
+        }
+    }
+
+    pub fn add_lookahead(&mut self, state: StateIndex, conflict: ConflictIndex, tokens: &TokenSet) {
+        self.lookaheads
+            .entry((state, conflict))
+            .or_insert_with(|| TokenSet::new())
+            .union_with(&tokens);
+    }
+
+    pub fn add_successor(&mut self, state: StateIndex, succ: StateIndex) {
+        self.successors.push(state, succ);
+    }
+
+    /// Unions together the lookaheads for each column and returns a
+    /// context set containing all of them. For an LALR(1) grammar,
+    /// these token sets will be mutually disjoint, as discussed in
+    /// the [README]; otherwise `Err` will be returned.
+    ///
+    /// [README]: ../README.md
+    pub fn columns(&self) -> Result<ContextSet, OverlappingLookahead> {
+        let mut columns = ContextSet::new(self.conflicts);
+        for (&(_, conflict_index), set) in &self.lookaheads {
+            columns.insert(conflict_index, set)?;
+        }
+        Ok(columns)
+    }
+
+    pub fn successors(&self, state: StateIndex) -> Option<&Set<StateIndex>> {
+        self.successors.get(&state)
+    }
+
+    /// Returns the state of states in the table that are **not**
+    /// reachable from another state in the table. These are called
+    /// "beachhead states".
+    pub fn beachhead_states(&self) -> Set<StateIndex> {
+        // set of all states that are reachable from another state
+        let reachable: Set<StateIndex> = self.successors
+            .iter()
+            .flat_map(|(_pred, succ)| succ)
+            .cloned()
+            .collect();
+
+        self.lookaheads
+            .keys()
+            .map(|&(state_index, _)| state_index)
+            .filter(|s| !reachable.contains(s))
+            .collect()
+    }
+
+    pub fn context_set(&self, state: StateIndex) -> Result<ContextSet, OverlappingLookahead> {
+        let mut set = ContextSet::new(self.conflicts);
+        for (&(state_index, conflict_index), token_set) in &self.lookaheads {
+            if state_index == state {
+                set.insert(conflict_index, token_set)?;
+            }
+        }
+        Ok(set)
+    }
+
+    /// Returns a map containing all states that appear in the table,
+    /// along with the context set for each state (i.e., each row in
+    /// the table, basically). Returns Err if any state has a conflict
+    /// between the context sets even within its own row.
+    pub fn rows(&self) -> Result<Map<StateIndex, ContextSet>, StateIndex> {
+        let mut map = Map::new();
+        for (&(state_index, conflict_index), token_set) in &self.lookaheads {
+            debug!(
+                "rows: inserting state_index={:?} conflict_index={:?} token_set={:?}",
+                state_index, conflict_index, token_set
+            );
+            match {
+                map.entry(state_index)
+                    .or_insert_with(|| ContextSet::new(self.conflicts))
+                    .insert(conflict_index, token_set)
+            } {
+                Ok(_changed) => {}
+                Err(OverlappingLookahead) => {
+                    debug!("rows: intra-row conflict inserting state_index={:?} conflict_index={:?} token_set={:?}",
+                           state_index, conflict_index, token_set);
+                    return Err(state_index);
+                }
+            }
+        }
+
+        // In some cases, there are states that have no context at
+        // all, only successors. In that case, make sure to add an
+        // empty row for them.
+        for (&state_index, _) in &self.successors {
+            map.entry(state_index)
+                .or_insert_with(|| ContextSet::new(self.conflicts));
+        }
+
+        Ok(map)
+    }
+}
+
+impl<'grammar> Debug for LaneTable<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let indices: Set<StateIndex> = self.lookaheads
+            .keys()
+            .map(|&(state, _)| state)
+            .chain(self.successors.iter().map(|(key, _)| key.clone()))
+            .collect();
+
+        let header = iter::once(format!("State"))
+            .chain((0..self.conflicts).map(|i| format!("C{}", i)))
+            .chain(Some(format!("Successors")))
+            .collect();
+
+        let rows = indices.iter().map(|&index| {
+            iter::once(format!("{:?}", index))
+                .chain((0..self.conflicts).map(|i| {
+                    self.lookaheads
+                        .get(&(index, ConflictIndex::new(i)))
+                        .map(|token_set| format!("{:?}", token_set))
+                        .unwrap_or(String::new())
+                }))
+                .chain(Some(
+                    self.successors
+                        .get(&index)
+                        .map(|c| format!("{:?}", c))
+                        .unwrap_or(String::new()),
+                ))
+                .collect()
+        });
+
+        let table: Vec<Vec<_>> = iter::once(header).chain(rows).collect();
+
+        let columns = 2 + self.conflicts;
+
+        let widths: Vec<_> = (0..columns)
+            .map(|c| {
+                // find the max width of any row at this column
+                table.iter().map(|r| r[c].len()).max().unwrap()
+            })
+            .collect();
+
+        for row in &table {
+            try!(write!(fmt, "| "));
+            for (i, column) in row.iter().enumerate() {
+                if i > 0 {
+                    try!(write!(fmt, " | "));
+                }
+                try!(write!(fmt, "{0:1$}", column, widths[i]));
+            }
+            try!(write!(fmt, " |\n"));
+        }
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lane_table/test.rs
@@ -0,0 +1,376 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use test_util::{expect_debug, normalized_grammar};
+use lr1::build;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::interpret;
+use lr1::state_graph::StateGraph;
+use lr1::tls::Lr1Tls;
+use tls::Tls;
+
+use super::construct::*;
+use super::lane::*;
+use super::table::*;
+
+macro_rules! tokens {
+    ($($x:expr),*) => {
+        vec![$(TerminalString::quoted(Atom::from($x))),*]
+    }
+}
+
+fn sym(t: &str) -> Symbol {
+    if t.chars().next().unwrap().is_uppercase() {
+        Symbol::Nonterminal(nt(t))
+    } else {
+        Symbol::Terminal(term(t))
+    }
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn traverse(states: &[LR0State], tokens: &[&str]) -> StateIndex {
+    interpret::interpret_partial(states, tokens.iter().map(|&s| term(s)))
+        .unwrap()
+        .pop()
+        .unwrap()
+}
+
+/// A simplified version of the paper's initial grammar; this version
+/// only has one inconsistent state (the same state they talk about in
+/// the paper).
+pub fn paper_example_g0() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    X "c",
+    Y "d",
+};
+
+X: () = {
+    "e" X,
+    "e",}
+;
+
+Y: () = {
+    "e" Y,
+    "e"
+};
+"#,
+    )
+}
+
+/// A (corrected) version of the sample grammar G1 from the paper. The
+/// grammar as written in the text omits some items, but the diagrams
+/// seem to contain the full set. I believe this is one of the
+/// smallest examples that still requires splitting states from the
+/// LR0 states.
+pub fn paper_example_g1() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    // if "a" is input, then lookahead "d" means "reduce X"
+    // and lookahead "c" means "reduce "Y"
+    "a" X "d",
+    "a" Y "c",
+
+    // if "b" is input, then lookahead "d" means "reduce Y"
+    // and lookahead "c" means "reduce X.
+    "b" X "c",
+    "b" Y "d",
+};
+
+X: () = {
+    "e" X,
+    "e",
+};
+
+Y: () = {
+    "e" Y,
+    "e"
+};
+"#,
+    )
+}
+
+fn build_table<'grammar>(
+    grammar: &'grammar Grammar,
+    goal: &str,
+    tokens: &[&str],
+) -> LaneTable<'grammar> {
+    let lr0_err = build::build_lr0_states(&grammar, nt(goal)).unwrap_err();
+
+    // Push the `tokens` to find the index of the inconsistent state
+    let inconsistent_state_index = traverse(&lr0_err.states, tokens);
+    assert!(
+        lr0_err
+            .conflicts
+            .iter()
+            .any(|c| c.state == inconsistent_state_index)
+    );
+    let inconsistent_state = &lr0_err.states[inconsistent_state_index.0];
+    println!("inconsistent_state={:#?}", inconsistent_state.items);
+
+    // Extract conflicting items and trace the lanes, constructing a table
+    let conflicting_items = super::conflicting_actions(inconsistent_state);
+    println!("conflicting_items={:#?}", conflicting_items);
+    let first_sets = FirstSets::new(&grammar);
+    let state_graph = StateGraph::new(&lr0_err.states);
+    let mut tracer = LaneTracer::new(
+        &grammar,
+        nt("G"),
+        &lr0_err.states,
+        &first_sets,
+        &state_graph,
+        conflicting_items.len(),
+    );
+    for (i, conflicting_item) in conflicting_items.iter().enumerate() {
+        tracer.start_trace(
+            inconsistent_state.index,
+            ConflictIndex::new(i),
+            conflicting_item.clone(),
+        );
+    }
+
+    tracer.into_table()
+}
+
+#[test]
+fn g0_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g0();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["e"]);
+    println!("{:#?}", table);
+    // conflicting_actions={
+    //     Shift("e") // C0
+    //     Reduce(X = "e" => ActionFn(4)) // C1
+    //     Reduce(Y = "e" => ActionFn(6)) // C2
+    // }
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2    | Successors |
+| S0    |       | ["c"] | ["d"] | {S3}       |
+| S3    | ["e"] | []    | []    | {S3}       |
+"#.trim_left(),
+    );
+}
+
+#[test]
+fn paper_example_g1_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["a", "e"]);
+    println!("{:#?}", table);
+    // conflicting_actions={
+    //     Shift("e") // C0
+    //     Reduce(X = "e" => ActionFn(6)) // C1
+    //     Reduce(Y = "e" => ActionFn(8)) // C2
+    // }
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2    | Successors |
+| S1    |       | ["d"] | ["c"] | {S5}       |
+| S2    |       | ["c"] | ["d"] | {S5}       |
+| S5    | ["e"] | []    | []    | {S5}       |
+"#.trim_left(),
+    );
+}
+
+#[test]
+fn paper_example_g0_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g0();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let lr0_err = build::build_lr0_states(&grammar, nt("G")).unwrap_err();
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    // we do not require more *states* than LR(0), just different lookahead
+    assert_eq!(states.len(), lr0_err.states.len());
+
+    let tree = interpret::interpret(&states, tokens!["e", "c"]).unwrap();
+    expect_debug(&tree, r#"[G: [X: "e"], "c"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["e", "e", "c"]).unwrap();
+    expect_debug(&tree, r#"[G: [X: "e", [X: "e"]], "c"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: [Y: "e", [Y: "e"]], "d"]"#);
+
+    interpret::interpret(&states, tokens!["e", "e", "e"]).unwrap_err();
+}
+
+#[test]
+fn paper_example_g1_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_g1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let lr0_err = build::build_lr0_states(&grammar, nt("G")).unwrap_err();
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    // we require more *states* than LR(0), not just different lookahead
+    assert_eq!(states.len() - lr0_err.states.len(), 1);
+
+    let tree = interpret::interpret(&states, tokens!["a", "e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: "a", [X: "e", [X: "e"]], "d"]"#);
+
+    let tree = interpret::interpret(&states, tokens!["b", "e", "e", "d"]).unwrap();
+    expect_debug(&tree, r#"[G: "b", [Y: "e", [Y: "e"]], "d"]"#);
+
+    interpret::interpret(&states, tokens!["e", "e", "e"]).unwrap_err();
+}
+
+pub fn paper_example_large() -> Grammar {
+    normalized_grammar(
+        r#"
+grammar;
+
+pub G: () = {
+    "x" W "a",
+    "x" V "t",
+    "y" W "b",
+    "y" V "t",
+    "z" W "r",
+    "z" V "b",
+    "u" U X "a",
+    "u" U Y "r",
+};
+
+W: () = {
+    U X C
+};
+
+V: () = {
+    U Y "d"
+};
+
+X: () = {
+    "k" "t" U X P,
+    "k" "t"
+};
+
+Y: () = {
+    "k" "t" U Y "u",
+    "k" "t"
+};
+
+U: () = {
+    U "k" "t",
+    "s"
+};
+
+E: () = {
+    "a",
+    "b",
+    "c",
+    "v",
+};
+
+C: () = {
+    "c",
+    "w"
+};
+
+P: () = {
+    "z"
+};
+"#,
+    )
+}
+
+#[test]
+fn large_conflict_1() {
+    let _tls = Tls::test();
+    let grammar = paper_example_large();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let table = build_table(&grammar, "G", &["x", "s", "k", "t"]);
+    println!("{:#?}", table);
+
+    // conflicting_actions={
+    //     Shift("s") // C0
+    //     Reduce(U = U "k" "t") // C1
+    //     Reduce(X = "k" "t") // C2
+    //     Reduce(Y = "k" "t") // C3
+    // }
+
+    expect_debug(
+        &table,
+        r#"
+| State | C0    | C1    | C2         | C3    | Successors |
+| S1    |       | ["k"] |            |       | {S5}       |
+| S2    |       | ["k"] |            |       | {S7}       |
+| S3    |       | ["k"] |            |       | {S7}       |
+| S4    |       | ["k"] |            |       | {S7}       |
+| S5    |       |       | ["a"]      | ["r"] | {S16}      |
+| S7    |       |       | ["c", "w"] | ["d"] | {S16}      |
+| S16   |       |       |            |       | {S27}      |
+| S27   | ["s"] | ["k"] |            |       | {S32}      |
+| S32   |       |       | ["z"]      | ["u"] | {S16}      |
+"#.trim_left(),
+    );
+
+    // ^^ This differs in some particulars from what appears in the
+    // paper, but I believe it to be correct, and the paper to be wrong.
+    //
+    // Here is the table using the state names from the paper. I've
+    // marked the differences with `(*)`. Note that the paper does not
+    // include the C0 column (the shift).
+    //
+    // | State | pi1   | pi2   | pi3        | Successors |
+    // | B     | ["k"] |       | *1         | {G}        |
+    // | C     | ["k"] |       | *1         | {G}        |
+    // | D     | ["k"] |       | *1         | {G}        |
+    // | E     | ["k"] |       |            | {F}        |
+    // | F     |       | ["r"] | ["a"]      | {H}        |
+    // | G     |       | ["d"] | ["c", "w"] | {H}        |
+    // | H     |       |       |            | {I}        |
+    // | I     | ["k"] |       |            | {J}        |
+    // | J     |       | ["u"] | ["z"] *2   | {H}        |
+    //
+    // *1 - the paper lists "a", "b", and "r" here as lookaheads.  We
+    // do not. This is because when we trace back pi3, we never reach
+    // those states, as we have already acquired the necessary token
+    // of context earlier. I can imagine a distinct lane tracing
+    // algorithm that considers *sets* of conflicts and only
+    // terminates when all sets have context, but it's much more
+    // complex to implement, and seems to add little value.
+    //
+    // *2 - the paper does not list this context, and yet it seems to
+    // present. If you trace back "t" and "k" you reach state J which
+    // has the item "X = k t (*)". This "unepsilons" to "X = k t U (*)
+    // X P", and the lookahead from the "X" here is FIRST(P) which is
+    // "z".
+}
+
+#[test]
+fn paper_example_large_build() {
+    let _tls = Tls::test();
+    let grammar = paper_example_large();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let states = LaneTableConstruct::new(&grammar, nt("G"))
+        .construct()
+        .expect("failed to build lane table states");
+
+    let tree = interpret::interpret(&states, tokens!["y", "s", "k", "t", "c", "b"]).unwrap();
+    expect_debug(
+        &tree,
+        r#"[G: "y", [W: [U: "s"], [X: "k", "t"], [C: "c"]], "b"]"#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/lookahead.rs
@@ -0,0 +1,299 @@
+use bit_set::{self, BitSet};
+use collections::Collection;
+use lr1::core::*;
+use lr1::tls::Lr1Tls;
+use std::fmt::{Debug, Error, Formatter};
+use std::hash::Hash;
+use grammar::repr::*;
+
+pub trait Lookahead: Clone + Debug + Eq + Ord + Hash + Collection<Item = Self> {
+    fn fmt_as_item_suffix(&self, fmt: &mut Formatter) -> Result<(), Error>;
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>>;
+}
+
+#[derive(Copy, Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Nil;
+
+impl Collection for Nil {
+    type Item = Nil;
+
+    fn push(&mut self, _: Nil) -> bool {
+        false
+    }
+}
+
+impl Lookahead for Nil {
+    fn fmt_as_item_suffix(&self, _fmt: &mut Formatter) -> Result<(), Error> {
+        Ok(())
+    }
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>> {
+        let index = this_state.index;
+
+        let mut conflicts = vec![];
+
+        for (terminal, &next_state) in &this_state.shifts {
+            conflicts.extend(
+                this_state
+                    .reductions
+                    .iter()
+                    .map(|&(_, production)| Conflict {
+                        state: index,
+                        lookahead: Nil,
+                        production: production,
+                        action: Action::Shift(terminal.clone(), next_state),
+                    }),
+            );
+        }
+
+        if this_state.reductions.len() > 1 {
+            for &(_, production) in &this_state.reductions[1..] {
+                let other_production = this_state.reductions[0].1;
+                conflicts.push(Conflict {
+                    state: index,
+                    lookahead: Nil,
+                    production: production,
+                    action: Action::Reduce(other_production),
+                });
+            }
+        }
+
+        conflicts
+    }
+}
+
+/// I have semi-arbitrarily decided to use the term "token" to mean
+/// either one of the terminals of our language, or else the
+/// pseudo-symbol EOF that represents "end of input".
+#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Token {
+    EOF,
+    Error,
+    Terminal(TerminalString),
+}
+
+impl Lookahead for TokenSet {
+    fn fmt_as_item_suffix(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, " {:?}", self)
+    }
+
+    fn conflicts<'grammar>(this_state: &State<'grammar, Self>) -> Vec<Conflict<'grammar, Self>> {
+        let mut conflicts = vec![];
+
+        for (terminal, &next_state) in &this_state.shifts {
+            let token = Token::Terminal(terminal.clone());
+            let inconsistent = this_state.reductions.iter().filter_map(
+                |&(ref reduce_tokens, production)| {
+                    if reduce_tokens.contains(&token) {
+                        Some(production)
+                    } else {
+                        None
+                    }
+                },
+            );
+            let set = TokenSet::from(token.clone());
+            for production in inconsistent {
+                conflicts.push(Conflict {
+                    state: this_state.index,
+                    lookahead: set.clone(),
+                    production: production,
+                    action: Action::Shift(terminal.clone(), next_state),
+                });
+            }
+        }
+
+        let len = this_state.reductions.len();
+        for i in 0..len {
+            for j in i + 1..len {
+                let &(ref i_tokens, i_production) = &this_state.reductions[i];
+                let &(ref j_tokens, j_production) = &this_state.reductions[j];
+
+                if i_tokens.is_disjoint(j_tokens) {
+                    continue;
+                }
+
+                conflicts.push(Conflict {
+                    state: this_state.index,
+                    lookahead: i_tokens.intersection(j_tokens),
+                    production: i_production,
+                    action: Action::Reduce(j_production),
+                });
+            }
+        }
+
+        conflicts
+    }
+}
+
+impl Token {
+    pub fn unwrap_terminal(&self) -> &TerminalString {
+        match *self {
+            Token::Terminal(ref t) => t,
+            Token::EOF | Token::Error => {
+                panic!("`unwrap_terminal()` invoked but with EOF or Error")
+            }
+        }
+    }
+}
+
+#[derive(Clone, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct TokenSet {
+    bit_set: BitSet<u32>,
+}
+
+fn with<OP, RET>(op: OP) -> RET
+where
+    OP: FnOnce(&TerminalSet) -> RET,
+{
+    Lr1Tls::with(op)
+}
+
+impl TokenSet {
+    pub fn new() -> Self {
+        with(|terminals| TokenSet {
+            bit_set: BitSet::with_capacity(terminals.all.len() + 2),
+        })
+    }
+
+    /// A TokenSet containing all possible terminals + EOF.
+    pub fn all() -> Self {
+        let mut s = TokenSet::new();
+        with(|terminals| {
+            for i in 0..terminals.all.len() {
+                s.bit_set.insert(i);
+            }
+            s.insert_eof();
+        });
+        s
+    }
+
+    pub fn eof() -> Self {
+        let mut set = TokenSet::new();
+        set.insert_eof();
+        set
+    }
+
+    fn eof_bit(&self) -> usize {
+        with(|terminals| terminals.all.len())
+    }
+
+    fn bit(&self, lookahead: &Token) -> usize {
+        match *lookahead {
+            Token::EOF => self.eof_bit(),
+            Token::Error => self.eof_bit() + 1,
+            Token::Terminal(ref t) => with(|terminals| terminals.bits[t]),
+        }
+    }
+
+    pub fn len(&self) -> usize {
+        self.bit_set.len()
+    }
+
+    pub fn insert(&mut self, lookahead: Token) -> bool {
+        let bit = self.bit(&lookahead);
+        self.bit_set.insert(bit)
+    }
+
+    pub fn insert_eof(&mut self) -> bool {
+        let bit = self.eof_bit();
+        self.bit_set.insert(bit)
+    }
+
+    pub fn union_with(&mut self, set: &TokenSet) -> bool {
+        let len = self.len();
+        self.bit_set.union_with(&set.bit_set);
+        self.len() != len
+    }
+
+    pub fn intersection(&self, set: &TokenSet) -> TokenSet {
+        let mut bit_set = self.bit_set.clone();
+        bit_set.intersect_with(&set.bit_set);
+        TokenSet { bit_set: bit_set }
+    }
+
+    pub fn contains(&self, token: &Token) -> bool {
+        self.bit_set.contains(self.bit(token))
+    }
+
+    pub fn contains_eof(&self) -> bool {
+        self.bit_set.contains(self.eof_bit())
+    }
+
+    /// If this set contains EOF, removes it from the set and returns
+    /// true. Otherwise, returns false.
+    pub fn take_eof(&mut self) -> bool {
+        let eof_bit = self.eof_bit();
+        let contains_eof = self.bit_set.contains(eof_bit);
+        self.bit_set.remove(eof_bit);
+        contains_eof
+    }
+
+    pub fn is_disjoint(&self, other: &TokenSet) -> bool {
+        self.bit_set.is_disjoint(&other.bit_set)
+    }
+
+    pub fn is_intersecting(&self, other: &TokenSet) -> bool {
+        !self.is_disjoint(other)
+    }
+
+    pub fn iter<'iter>(&'iter self) -> TokenSetIter<'iter> {
+        TokenSetIter {
+            bit_set: self.bit_set.iter(),
+        }
+    }
+}
+
+pub struct TokenSetIter<'iter> {
+    bit_set: bit_set::Iter<'iter, u32>,
+}
+
+impl<'iter> Iterator for TokenSetIter<'iter> {
+    type Item = Token;
+
+    fn next(&mut self) -> Option<Token> {
+        self.bit_set.next().map(|bit| {
+            with(|terminals| {
+                if bit == terminals.all.len() + 1 {
+                    Token::Error
+                } else if bit == terminals.all.len() {
+                    Token::EOF
+                } else {
+                    Token::Terminal(terminals.all[bit].clone())
+                }
+            })
+        })
+    }
+}
+
+impl<'debug> Debug for TokenSet {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let terminals: Vec<_> = self.iter().collect();
+        Debug::fmt(&terminals, fmt)
+    }
+}
+
+impl<'iter> IntoIterator for &'iter TokenSet {
+    type IntoIter = TokenSetIter<'iter>;
+    type Item = Token;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
+    }
+}
+
+impl Collection for TokenSet {
+    type Item = TokenSet;
+
+    fn push(&mut self, item: TokenSet) -> bool {
+        self.union_with(&item)
+    }
+}
+
+impl From<Token> for TokenSet {
+    fn from(token: Token) -> Self {
+        let mut set = TokenSet::new();
+        set.insert(token);
+        set
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/mod.rs
@@ -0,0 +1,43 @@
+//! Naive LR(1) generation algorithm.
+
+use grammar::repr::*;
+
+pub mod codegen;
+mod build;
+mod build_lalr;
+mod core;
+mod error;
+mod example;
+mod first;
+mod lane_table;
+mod lookahead;
+mod state_graph;
+mod tls;
+mod trace;
+mod report;
+use std::io::{self, Write};
+
+#[cfg(test)]
+mod interpret;
+
+pub use self::core::{LR1Result, LR1TableConstructionError};
+pub use self::error::report_error;
+pub use self::tls::Lr1Tls;
+
+pub fn build_states<'grammar>(
+    grammar: &'grammar Grammar,
+    start: NonterminalString,
+) -> LR1Result<'grammar> {
+    if !grammar.algorithm.lalr {
+        build::build_lr1_states(grammar, start)
+    } else {
+        build_lalr::build_lalr_states(grammar, start)
+    }
+}
+
+pub fn generate_report<'grammar, W: Write + 'grammar>(
+    out: &'grammar mut W,
+    lr1result: &LR1Result<'grammar>,
+) -> io::Result<()> {
+    report::generate_report(out, lr1result)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/report/mod.rs
@@ -0,0 +1,446 @@
+use grammar::repr::*;
+use lr1::core::*;
+use std::io::{self, Write};
+use std::cmp::max;
+use collections::*;
+
+use super::lookahead::*;
+
+pub fn generate_report<'grammar, W: Write + 'grammar>(
+    out: &'grammar mut W,
+    lr1result: &LR1Result<'grammar>,
+) -> io::Result<()> {
+    let mut generator = ReportGenerator::new(out);
+    generator.report_lr_table_construction(lr1result)
+}
+
+static INDENT_STRING: &'static str = "    ";
+
+struct ReportGenerator<'report, W>
+where
+    W: Write + 'report,
+{
+    pub out: &'report mut W,
+}
+
+type ConflictStateMap<'report, 'grammar, L> = Map<StateIndex, Vec<&'report Conflict<'grammar, L>>>;
+
+impl<'report, W> ReportGenerator<'report, W>
+where
+    W: Write + 'report,
+{
+    pub fn new(out: &'report mut W) -> Self {
+        ReportGenerator { out: out }
+    }
+
+    pub fn report_lr_table_construction<'grammar: 'report, L>(
+        &mut self,
+        lr1result: &'report LRResult<'grammar, L>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(self.write_header());
+        try!(self.write_section_header("Summary"));
+        try!(writeln!(self.out, ""));
+        match lr1result {
+            &Ok(ref states) => {
+                try!(writeln!(self.out, "Constructed {} states", states.len()));
+                try!(self.report_states(&states, &Map::new()));
+            }
+            &Err(ref table_construction_error) => {
+                try!(writeln!(self.out, "Failure"));
+                try!(writeln!(
+                    self.out,
+                    "Constructed {} states",
+                    table_construction_error.states.len()
+                ));
+                try!(writeln!(
+                    self.out,
+                    "Has {} conflicts",
+                    table_construction_error.conflicts.len()
+                ));
+                let (sr, rr, conflict_map) =
+                    self.process_conflicts(&table_construction_error.conflicts);
+                if (sr > 0) {
+                    try!(writeln!(self.out, "{}shift/reduce:  {}", INDENT_STRING, sr));
+                }
+                if (rr > 0) {
+                    try!(writeln!(self.out, "{}reduce/reduce: {}", INDENT_STRING, rr));
+                }
+                try!(write!(self.out, "States with conflicts: "));
+                for state in conflict_map.keys() {
+                    try!(write!(self.out, " {}", state));
+                }
+                try!(writeln!(self.out, ""));
+                try!(self.report_states(&table_construction_error.states, &conflict_map));
+            }
+        };
+        Ok(())
+    }
+
+    fn process_conflicts<'grammar, L>(
+        &mut self,
+        conflicts: &'report Vec<Conflict<'grammar, L>>,
+    ) -> (usize, usize, ConflictStateMap<'report, 'grammar, L>)
+    where
+        L: Lookahead,
+    {
+        let mut sr: usize = 0;
+        let mut rr: usize = 0;
+        let mut conflict_map = Map::new();
+        for conflict in conflicts.iter() {
+            match conflict.action {
+                Action::Shift(_, _) => sr = sr + 1,
+                Action::Reduce(_) => rr = rr + 1,
+            }
+            conflict_map
+                .entry(conflict.state)
+                .or_insert(vec![])
+                .push(conflict);
+        }
+        (sr, rr, conflict_map)
+    }
+
+    fn report_states<'grammar, L>(
+        &mut self,
+        states: &Vec<State<'grammar, L>>,
+        conflict_map: &ConflictStateMap<'report, 'grammar, L>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(self.write_section_header("State Table"));
+        for ref state in states {
+            try!(writeln!(self.out, ""));
+            try!(self.report_state(&state, conflict_map.get(&state.index)));
+        }
+        Ok(())
+    }
+
+    fn report_state<'grammar, L>(
+        &mut self,
+        state: &State<'grammar, L>,
+        conflicts_opt: Option<&Vec<&'report Conflict<'grammar, L>>>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(writeln!(self.out, "State {} {{", state.index));
+        try!(self.write_items(&state.items));
+        if (state.reductions.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_reductions(&state.reductions));
+        }
+
+        let max_width = get_width_for_gotos(state);
+
+        if (!state.shifts.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_shifts(&state.shifts, max_width));
+        }
+
+        if (!state.gotos.len() > 0) {
+            try!(writeln!(self.out, ""));
+            try!(self.write_gotos(&state.gotos, max_width));
+        }
+
+        if let Some(conflicts) = conflicts_opt {
+            for conflict in conflicts.iter() {
+                try!(self.write_conflict(conflict));
+            }
+        }
+
+        try!(writeln!(self.out, "}}"));
+        Ok(())
+    }
+
+    fn write_conflict<'grammar, L>(&mut self, conflict: &Conflict<'grammar, L>) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(writeln!(self.out, ""));
+        match conflict.action {
+            Action::Shift(ref terminal, state) => {
+                let max_width = max(
+                    terminal.display_len(),
+                    conflict.production.nonterminal.len(),
+                );
+                try!(writeln!(self.out, "{}shift/reduce conflict", INDENT_STRING));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(conflict.production, max_width));
+                let sterminal = format!("{}", terminal);
+                try!(writeln!(
+                    self.out,
+                    "{}{}shift     {:width$}    shift and goto {}",
+                    INDENT_STRING,
+                    INDENT_STRING,
+                    sterminal,
+                    state,
+                    width = max_width
+                ));
+            }
+            Action::Reduce(other_production) => {
+                let max_width = max(
+                    other_production.nonterminal.len(),
+                    conflict.production.nonterminal.len(),
+                );
+                try!(writeln!(
+                    self.out,
+                    "{}reduce/reduce conflict",
+                    INDENT_STRING
+                ));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(conflict.production, max_width));
+                try!(write!(
+                    self.out,
+                    "{}{}reduction ",
+                    INDENT_STRING, INDENT_STRING
+                ));
+                try!(self.write_production(other_production, max_width));
+            }
+        }
+        try!(self.write_lookahead(&conflict.lookahead));
+        Ok(())
+    }
+
+    fn write_items<'grammar, L>(&mut self, items: &Items<'grammar, L>) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let max_width = get_max_length(items.vec.iter().map(|item| &item.production.nonterminal));
+
+        for item in items.vec.iter() {
+            try!(writeln!(self.out, ""));
+            try!(self.write_item(item, max_width));
+        }
+        Ok(())
+    }
+
+    fn write_item<'grammar, L>(
+        &mut self,
+        item: &Item<'grammar, L>,
+        max_width: usize,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        try!(write!(self.out, "{}", INDENT_STRING));
+        // stringize it first to allow handle :width by Display for string
+        let s = format!("{}", item.production.nonterminal);
+        try!(write!(self.out, "{:width$} ->", s, width = max_width));
+        for i in 0..item.index {
+            try!(write!(self.out, " {}", item.production.symbols[i]));
+        }
+        try!(write!(self.out, " ."));
+        for i in item.index..item.production.symbols.len() {
+            try!(write!(self.out, " {}", item.production.symbols[i]));
+        }
+        try!(writeln!(self.out, ""));
+        try!(self.write_lookahead(&item.lookahead));
+        Ok(())
+    }
+
+    fn write_shifts(
+        &mut self,
+        shifts: &Map<TerminalString, StateIndex>,
+        max_width: usize,
+    ) -> io::Result<()> {
+        for entry in shifts {
+            try!(write!(self.out, "{}", INDENT_STRING));
+            // stringize it first to allow handle :width by Display for string
+            let s = format!("{}", entry.0);
+            try!(writeln!(
+                self.out,
+                "{:width$} shift and goto {}",
+                s,
+                entry.1,
+                width = max_width
+            ));
+        }
+        Ok(())
+    }
+
+    fn write_reductions<'grammar, L>(
+        &mut self,
+        reductions: &Vec<(L, &'grammar Production)>,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let max_width = get_max_length(reductions.into_iter().map(|p| &p.1.nonterminal));
+        for reduction in reductions.iter() {
+            try!(writeln!(self.out, ""));
+            try!(self.write_reduction(reduction, max_width));
+        }
+        Ok(())
+    }
+
+    fn write_production<'grammar>(
+        &mut self,
+        production: &'grammar Production,
+        max_width: usize,
+    ) -> io::Result<()> {
+        try!(write!(
+            self.out,
+            "{:width$} ->",
+            production.nonterminal,
+            width = max_width
+        ));
+        for symbol in production.symbols.iter() {
+            try!(write!(self.out, " {}", symbol));
+        }
+        try!(writeln!(self.out, ""));
+        Ok(())
+    }
+
+    fn write_reduction<'grammar, L>(
+        &mut self,
+        reduction: &(L, &'grammar Production),
+        max_width: usize,
+    ) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        let ref production = reduction.1;
+        try!(write!(self.out, "{}reduction ", INDENT_STRING));
+        try!(self.write_production(production, max_width));
+        try!(self.write_lookahead(&reduction.0));
+        Ok(())
+    }
+
+    fn write_lookahead<L>(&mut self, lookahead: &L) -> io::Result<()>
+    where
+        L: Lookahead + LookaheadPrinter<W>,
+    {
+        if (lookahead.has_anything_to_print()) {
+            try!(write!(
+                self.out,
+                "{}{}lookahead",
+                INDENT_STRING, INDENT_STRING
+            ));
+            try!(lookahead.print(self.out));
+            try!(writeln!(self.out, ""));
+        }
+        Ok(())
+    }
+
+    fn write_gotos(
+        &mut self,
+        gotos: &Map<NonterminalString, StateIndex>,
+        max_width: usize,
+    ) -> io::Result<()> {
+        for entry in gotos {
+            try!(write!(self.out, "{}", INDENT_STRING));
+            // stringize it first to allow handle :width by Display for string
+            let s = format!("{}", entry.0);
+            try!(writeln!(
+                self.out,
+                "{:width$} goto {}",
+                s,
+                entry.1,
+                width = max_width
+            ));
+        }
+        Ok(())
+    }
+
+    fn write_section_header(&mut self, title: &str) -> io::Result<()> {
+        try!(writeln!(self.out, "\n{}", title));
+        try!(writeln!(
+            self.out,
+            "----------------------------------------"
+        ));
+        Ok(())
+    }
+
+    fn write_header(&mut self) -> io::Result<()> {
+        try!(writeln!(self.out, "Lalrpop Report File"));
+        try!(writeln!(
+            self.out,
+            "========================================"
+        ));
+        Ok(())
+    }
+}
+
+// helpers
+
+trait LookaheadPrinter<W>
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, out: &'report mut W) -> io::Result<()>;
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool;
+}
+
+impl<W> LookaheadPrinter<W> for Nil
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, _: &'report mut W) -> io::Result<()> {
+        Ok(())
+    }
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool {
+        false
+    }
+}
+
+impl<W> LookaheadPrinter<W> for TokenSet
+where
+    W: Write,
+{
+    fn print<'report, 'grammar>(self: &Self, out: &'report mut W) -> io::Result<()> {
+        for i in self.iter() {
+            try!(write!(out, " {}", i))
+        }
+        Ok(())
+    }
+
+    fn has_anything_to_print<'report>(self: &Self) -> bool {
+        self.len() > 0
+    }
+}
+
+trait HasDisplayLen {
+    fn display_len(&self) -> usize;
+}
+
+impl<'a> HasDisplayLen for &'a TerminalString {
+    fn display_len(&self) -> usize {
+        TerminalString::display_len(self)
+    }
+}
+
+impl<'a> HasDisplayLen for &'a NonterminalString {
+    fn display_len(&self) -> usize {
+        self.len()
+    }
+}
+
+fn get_max_length<I>(m: I) -> usize
+where
+    I: Iterator,
+    I::Item: HasDisplayLen,
+{
+    m.map(|k| k.display_len()).fold(0, |acc, x| max(acc, x))
+}
+
+fn get_width_for_gotos<'grammar, L>(state: &State<'grammar, L>) -> usize
+where
+    L: Lookahead,
+{
+    let shifts_max_width = get_max_length(state.shifts.keys());
+    let gotos_max_width = get_max_length(state.gotos.keys());
+    max(shifts_max_width, gotos_max_width)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/state_graph.rs
@@ -0,0 +1,94 @@
+use grammar::repr::*;
+use lr1::core::*;
+use lr1::lookahead::Lookahead;
+use petgraph::{EdgeDirection, Graph};
+use petgraph::graph::NodeIndex;
+use petgraph::prelude::*;
+
+// Each state `s` corresponds to the node in the graph with index
+// `s`. The edges are the shift transitions.
+pub struct StateGraph {
+    graph: Graph<(), Symbol>,
+}
+
+impl StateGraph {
+    pub fn new<'grammar, L>(states: &[State<'grammar, L>]) -> StateGraph
+    where
+        L: Lookahead,
+    {
+        let mut graph = Graph::new();
+
+        // First, create the nodes.
+        for i in 0..states.len() {
+            let j = graph.add_node(());
+            assert_eq!(i, j.index());
+        }
+
+        // Add in the edges.
+        for (i, state) in states.iter().enumerate() {
+            // Successors of a node arise from:
+            // - shifts (found in the `conflicts` and `tokens` maps)
+            // - gotos (found in the `gotos` map)
+            graph.extend_with_edges(
+                state
+                    .shifts
+                    .iter()
+                    .map(|(terminal, &state)| (Symbol::Terminal(terminal.clone()), state))
+                    .chain(
+                        state
+                            .gotos
+                            .iter()
+                            .map(|(nt, &state)| (Symbol::Nonterminal(nt.clone()), state)),
+                    )
+                    .map(|(symbol, successor)| {
+                        (NodeIndex::new(i), NodeIndex::new(successor.0), symbol)
+                    }),
+            );
+        }
+
+        StateGraph { graph: graph }
+    }
+
+    /// Given a list of symbols `[X, Y, Z]`, traces back from
+    /// `initial_state_index` to find the set of states whence we
+    /// could have arrived at `initial_state_index` after pushing `X`,
+    /// `Y`, and `Z`.
+    pub fn trace_back(
+        &self,
+        initial_state_index: StateIndex,
+        initial_symbols: &[Symbol],
+    ) -> Vec<StateIndex> {
+        let mut stack = vec![(initial_state_index, initial_symbols)];
+        let mut result = vec![];
+        while let Some((state_index, symbols)) = stack.pop() {
+            if let Some((head, tail)) = symbols.split_last() {
+                stack.extend(
+                    self.graph
+                        .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Incoming)
+                        .filter(|edge| edge.weight() == head)
+                        .map(|edge| (StateIndex(edge.source().index()), tail)),
+                );
+            } else {
+                result.push(state_index);
+            }
+        }
+        result.sort();
+        result.dedup();
+        result
+    }
+
+    pub fn successors(&self, state_index: StateIndex) -> Vec<StateIndex> {
+        self.graph
+            .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Outgoing)
+            .map(|edge| StateIndex(edge.target().index()))
+            .collect()
+    }
+
+    pub fn predecessors(&self, state_index: StateIndex, symbol: Symbol) -> Vec<StateIndex> {
+        self.graph
+            .edges_directed(NodeIndex::new(state_index.0), EdgeDirection::Incoming)
+            .filter(|edge| *edge.weight() == symbol)
+            .map(|edge| StateIndex(edge.source().index()))
+            .collect()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/tls.rs
@@ -0,0 +1,40 @@
+//! Thread-local data specific to LR(1) processing.
+
+use grammar::repr::TerminalSet;
+use std::cell::RefCell;
+use std::mem;
+use std::sync::Arc;
+
+thread_local! {
+    static TERMINALS: RefCell<Option<Arc<TerminalSet>>> = RefCell::new(None)
+}
+
+pub struct Lr1Tls {
+    old_value: Option<Arc<TerminalSet>>,
+}
+
+impl Lr1Tls {
+    pub fn install(terminals: TerminalSet) -> Lr1Tls {
+        let old_value = TERMINALS.with(|s| {
+            let mut s = s.borrow_mut();
+            mem::replace(&mut *s, Some(Arc::new(terminals)))
+        });
+
+        Lr1Tls {
+            old_value: old_value,
+        }
+    }
+
+    pub fn with<OP, RET>(op: OP) -> RET
+    where
+        OP: FnOnce(&TerminalSet) -> RET,
+    {
+        TERMINALS.with(|s| op(s.borrow().as_ref().expect("LR1 TLS not installed")))
+    }
+}
+
+impl Drop for Lr1Tls {
+    fn drop(&mut self) {
+        TERMINALS.with(|s| *s.borrow_mut() = self.old_value.take());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/mod.rs
@@ -0,0 +1,31 @@
+use collections::{set, Set};
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::state_graph::StateGraph;
+use grammar::repr::*;
+
+mod reduce;
+mod shift;
+mod trace_graph;
+
+pub struct Tracer<'trace, 'grammar: 'trace> {
+    states: &'trace [LR1State<'grammar>],
+    first_sets: &'trace FirstSets,
+    state_graph: StateGraph,
+    trace_graph: TraceGraph<'grammar>,
+    visited_set: Set<(StateIndex, NonterminalString)>,
+}
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn new(first_sets: &'trace FirstSets, states: &'trace [LR1State<'grammar>]) -> Self {
+        Tracer {
+            states: states,
+            first_sets: first_sets,
+            state_graph: StateGraph::new(states),
+            trace_graph: TraceGraph::new(),
+            visited_set: set(),
+        }
+    }
+}
+
+pub use self::trace_graph::TraceGraph;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/reduce/mod.rs
@@ -0,0 +1,111 @@
+use lr1::core::*;
+use grammar::repr::*;
+
+use super::Tracer;
+use super::trace_graph::*;
+
+#[cfg(test)]
+mod test;
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn backtrace_reduce(
+        mut self,
+        item_state: StateIndex,
+        item: LR0Item<'grammar>,
+    ) -> TraceGraph<'grammar> {
+        self.trace_reduce_item(item_state, item);
+        self.trace_graph
+    }
+
+    fn trace_reduce_item(&mut self, item_state: StateIndex, item: LR0Item<'grammar>) {
+        // We start out with an item
+        //
+        //     X = ...p (*) ...s
+        //
+        // which we can (eventually) reduce, though we may have to do
+        // some epsilon reductions first if ...s is non-empty. We want
+        // to trace back until we have (at least) one element of
+        // context for the reduction.
+        let nonterminal = &item.production.nonterminal; // X
+
+        // Add an edge
+        //
+        //     [X] -{...p,_,...s}-> [X = ...p (*) ...s]
+        //
+        // because to reach that item we pushed `...p` from the start
+        // of `X` and afterwards we expect to see `...s`.
+        self.trace_graph
+            .add_edge(nonterminal.clone(), item, item.symbol_sets());
+
+        // Walk back to the set of states S where we had:
+        //
+        //     X = (*) ...p
+        let pred_states = self.state_graph.trace_back(item_state, item.prefix());
+
+        // Add in edges from [X] to all the places [X] can be consumed.
+        for pred_state in pred_states {
+            self.trace_reduce_from_state(pred_state, nonterminal);
+        }
+    }
+
+    // We know that we can reduce the nonterminal `Y`. We want to find
+    // at least one element of context, so we search back to find out
+    // who will consume that reduced value. So search for those items
+    // that can shift a `Y`:
+    //
+    //     Z = ... (*) Y ...s
+    //
+    // If we find that `...s` is potentially empty, then we haven't
+    // actually found any context, and so we may have to keep
+    // searching.
+    fn trace_reduce_from_state(&mut self, item_state: StateIndex, nonterminal: &NonterminalString)
+    // "Y"
+    {
+        if !self.visited_set.insert((item_state, nonterminal.clone())) {
+            return;
+        }
+        for pred_item in self.states[item_state.0]
+            .items
+            .vec
+            .iter()
+            .filter(|i| i.can_shift_nonterminal(nonterminal))
+        {
+            // Found a state:
+            //
+            //     Z = ...p (*) Y ...s
+            //
+            // If `...s` does not match `\epsilon`, then we are done,
+            // because `FIRST(...s)` will provide a token of context.
+            // But otherwise we have to keep searching backwards.
+
+            let symbol_sets = pred_item.symbol_sets();
+
+            let first_suffix = self.first_sets.first0(symbol_sets.suffix);
+            let continue_tracing = first_suffix.contains_eof();
+
+            if !continue_tracing {
+                // Add an edge
+                //
+                //    [Z = ...p (*) Y ...s] -(...p,Y,...s)-> [Y]
+                //
+                // and stop.
+                self.trace_graph
+                    .add_edge(pred_item.to_lr0(), nonterminal.clone(), symbol_sets);
+            } else {
+                // Add an edge
+                //
+                //    [Z] -{..p}-> [Y]
+                //
+                // because we can reduce by consuming `...p`
+                // tokens, and continue tracing.
+                self.trace_graph.add_edge(
+                    pred_item.production.nonterminal.clone(),
+                    nonterminal.clone(),
+                    symbol_sets,
+                );
+
+                self.trace_reduce_item(item_state, pred_item.to_lr0());
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/reduce/test.rs
@@ -0,0 +1,364 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::core::Item;
+use lr1::first::FirstSets;
+use lr1::interpret::interpret_partial;
+use lr1::lookahead::{Token, TokenSet};
+use lr1::tls::Lr1Tls;
+use test_util::{expect_debug, normalized_grammar};
+use tls::Tls;
+
+use super::super::Tracer;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+fn term(t: &str) -> TerminalString {
+    TerminalString::quoted(Atom::from(t))
+}
+
+macro_rules! terms {
+    ($($t:expr),*) => {
+        vec![$(term($t)),*]
+    }
+}
+
+fn test_grammar1() -> Grammar {
+    normalized_grammar(
+        r#"
+    grammar;
+
+    pub Start: () = Stmt;
+
+    pub Stmt: () = {
+        Exprs ";",
+        Exprs
+    };
+
+    Exprs: () = {
+        Expr,
+        Exprs "," Expr
+    };
+
+    Expr: () = {
+        "Int",
+        Expr "+" "Int",
+    };
+"#,
+    )
+}
+
+#[test]
+fn backtrace1() {
+    let _tls = Tls::test();
+    let grammar = test_grammar1();
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let states = build_states(&grammar, nt("Start")).unwrap();
+    let tracer = Tracer::new(&first_sets, &states);
+    let state_stack = interpret_partial(&states, terms!["Int"]).unwrap();
+    let top_state = *state_stack.last().unwrap();
+
+    // Top state will have items like:
+    //
+    // Expr = "Int" (*) [EOF],
+    // Expr = "Int" (*) ["+"],
+    // Expr = "Int" (*) [","],
+    // Expr = "Int" (*) [";"]
+    //
+    // Select the ";" one.
+    let semi = Token::Terminal(term(";"));
+    let semi_item = states[top_state.0]
+        .items
+        .vec
+        .iter()
+        .filter(|item| item.lookahead.contains(&semi))
+        .next()
+        .unwrap();
+
+    let backtrace = tracer.backtrace_reduce(top_state, semi_item.to_lr0());
+
+    println!("{:#?}", backtrace);
+
+    let pictures: Vec<_> = backtrace
+        .lr0_examples(semi_item.to_lr0())
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(
+        &pictures,
+        r#"
+[
+    [
+        "  Exprs "," "Int"  ╷ ";"",
+        "  │         └─Expr─┤   │",
+        "  ├─Exprs──────────┘   │",
+        "  └─Stmt───────────────┘"
+    ],
+    [
+        "  Exprs "," "Int"  ╷ "," Expr",
+        "  │         └─Expr─┤        │",
+        "  ├─Exprs──────────┘        │",
+        "  └─Exprs───────────────────┘"
+    ],
+    [
+        "  "Int"   ╷ ";"",
+        "  ├─Expr──┤   │",
+        "  ├─Exprs─┘   │",
+        "  └─Stmt──────┘"
+    ],
+    [
+        "  "Int"   ╷ "," Expr",
+        "  ├─Expr──┤        │",
+        "  ├─Exprs─┘        │",
+        "  └─Exprs──────────┘"
+    ],
+    [
+        "  "Int"  ╷ "+" "Int"",
+        "  ├─Expr─┘         │",
+        "  └─Expr───────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn backtrace2() {
+    let _tls = Tls::test();
+    // This grammar yields a S/R conflict. Is it (int -> int) -> int
+    // or int -> (int -> int)?
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+    let item = Item {
+        production: conflict.production,
+        index: conflict.production.symbols.len(),
+        lookahead: conflict.lookahead.clone(),
+    };
+    println!("item={:?}", item);
+    let backtrace = tracer.backtrace_reduce(conflict.state, item.to_lr0());
+    println!("{:#?}", backtrace);
+    expect_debug(
+        &backtrace,
+        r#"
+[
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Item(Ty = Ty "->" (*) Ty)),
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty, "->", Ty], None, [])-> Item(Ty = Ty "->" Ty (*))),
+    (Item(Ty = (*) Ty "->" Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    // Check that we can successfully enumerate and paint the examples
+    // here.
+    let pictures: Vec<_> = backtrace
+        .lr1_examples(&first_sets, &item)
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(
+        &pictures,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  ├─Ty─────┘       │",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn reduce_backtrace_3_graph() {
+    // This grammar yields a S/R conflict. Is it `(int -> int) -> int`
+    // or `int -> (int -> int)`?
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+    let item = Item {
+        production: conflict.production,
+        index: conflict.production.symbols.len(),
+        lookahead: conflict.lookahead.clone(),
+    };
+    println!("item={:?}", item);
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let graph = tracer.backtrace_reduce(conflict.state, item.to_lr0());
+    expect_debug(
+        &graph,
+        r#"
+[
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Item(Ty = Ty "->" (*) Ty)),
+    (Nonterminal(Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty, "->", Ty], None, [])-> Item(Ty = Ty "->" Ty (*))),
+    (Item(Ty = (*) Ty "->" Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    let list: Vec<_> = graph
+        .lr1_examples(&first_sets, &item)
+        .map(|example| example.paint_unstyled())
+        .collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  ├─Ty─────┘       │",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn backtrace_filter() {
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+    grammar;
+
+    pub Start: () = Stmt;
+
+    pub Stmt: () = {
+        Exprs ";"
+    };
+
+    Exprs: () = {
+        Expr,
+        Exprs "," Expr
+    };
+
+    Expr: () = {
+        ExprAtom ExprSuffix
+    };
+
+    ExprSuffix: () = {
+        (),
+        "?",
+    };
+
+    ExprAtom: () = {
+        "Int",
+    };
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let states = build_states(&grammar, nt("Start")).unwrap();
+    let first_sets = FirstSets::new(&grammar);
+    let tracer = Tracer::new(&first_sets, &states);
+    let state_stack = interpret_partial(&states, terms!["Int"]).unwrap();
+    let top_state = *state_stack.last().unwrap();
+
+    // Top state will have an item like:
+    //
+    // Expr = "Int" (*) [",", ";"],
+    let semi = Token::Terminal(term(";"));
+    let lr1_item = states[top_state.0]
+        .items
+        .vec
+        .iter()
+        .filter(|item| item.lookahead.contains(&semi))
+        .next()
+        .unwrap();
+
+    let backtrace = tracer.backtrace_reduce(top_state, lr1_item.to_lr0());
+
+    println!("{:#?}", backtrace);
+
+    // With no filtering, we get examples with both `;` and `,` as
+    // lookahead (though `ExprSuffix` is in the way).
+    let pictures: Vec<_> = backtrace
+        .lr0_examples(lr1_item.to_lr0())
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(&pictures, r#"
+[
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix ";"",
+        "  │         ├─ExprAtom─┘          │   │",
+        "  │         └─Expr────────────────┤   │",
+        "  ├─Exprs─────────────────────────┘   │",
+        "  └─Stmt──────────────────────────────┘"
+    ],
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix "," Expr",
+        "  │         ├─ExprAtom─┘          │        │",
+        "  │         └─Expr────────────────┤        │",
+        "  ├─Exprs─────────────────────────┘        │",
+        "  └─Exprs──────────────────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix ";"",
+        "  ├─ExprAtom─┘          │   │",
+        "  ├─Expr────────────────┤   │",
+        "  ├─Exprs───────────────┘   │",
+        "  └─Stmt────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix "," Expr",
+        "  ├─ExprAtom─┘          │        │",
+        "  ├─Expr────────────────┤        │",
+        "  ├─Exprs───────────────┘        │",
+        "  └─Exprs────────────────────────┘"
+    ]
+]
+"#.trim());
+
+    // Select those with `;` as lookahead
+    let semi_item = lr1_item.with_lookahead(TokenSet::from(semi));
+    let pictures: Vec<_> = backtrace
+        .lr1_examples(&first_sets, &semi_item)
+        .map(|e| e.paint_unstyled())
+        .collect();
+    expect_debug(&pictures, r#"
+[
+    [
+        "  Exprs "," "Int"      ╷ ExprSuffix ";"",
+        "  │         ├─ExprAtom─┘          │   │",
+        "  │         └─Expr────────────────┤   │",
+        "  ├─Exprs─────────────────────────┘   │",
+        "  └─Stmt──────────────────────────────┘"
+    ],
+    [
+        "  "Int"      ╷ ExprSuffix ";"",
+        "  ├─ExprAtom─┘          │   │",
+        "  ├─Expr────────────────┤   │",
+        "  ├─Exprs───────────────┘   │",
+        "  └─Stmt────────────────────┘"
+    ]
+]
+"#.trim());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/shift/mod.rs
@@ -0,0 +1,101 @@
+use lr1::core::*;
+use grammar::repr::*;
+
+use super::Tracer;
+use super::trace_graph::*;
+
+#[cfg(test)]
+mod test;
+
+/// A backtrace explaining how a particular shift:
+///
+///    X = ...p (*) Token ...
+///
+/// came to be in the list of items for some state S. This backtrace
+/// always has a particular form. First, we can walk back over the
+/// prefix, which will bring us to some set of states S1 all of which
+/// contain the same item, but with the cursor at the front:
+///
+///    X = (*) ...p Token ...
+///
+/// Then we can walk back within those states some number of epsilon
+/// moves, traversing nonterminals of the form:
+///
+///    Y = (*) X ...s
+///
+/// (Note that each nonterminal `Y` may potentially have many
+/// productions of this form. I am not sure yet if they all matter or
+/// not.)
+///
+/// Finally, either we are in the start state, or else we reach some
+/// production of the form:
+///
+///    Z = ...p (*) Y ...s
+///
+/// Ultimately this "trace" is best represented as a DAG. The problem
+/// is that some of those nonterminals could, for example, be
+/// optional.
+
+impl<'trace, 'grammar> Tracer<'trace, 'grammar> {
+    pub fn backtrace_shift(
+        mut self,
+        item_state: StateIndex,
+        item: LR0Item<'grammar>,
+    ) -> TraceGraph<'grammar> {
+        let symbol_sets = item.symbol_sets();
+
+        // The states `S`
+        let pred_states = self.state_graph.trace_back(item_state, symbol_sets.prefix);
+
+        // Add the edge `[X] -{...p,Token,...s}-> [X = ...p (*) Token ...s]`
+        self.trace_graph
+            .add_edge(item.production.nonterminal.clone(), item, symbol_sets);
+
+        for pred_state in pred_states {
+            self.trace_epsilon_edges(pred_state, &item.production.nonterminal);
+        }
+
+        self.trace_graph
+    }
+
+    // Because item.index is 0, we know we are at an index
+    // like:
+    //
+    //     Y = (*) ...
+    //
+    // This can only arise if `Y` is the start nonterminal
+    // or if there is an epsilon move from another item
+    // like:
+    //
+    //     Z = ...p (*) Y ...
+    //
+    // So search for items like Z.
+    fn trace_epsilon_edges(&mut self, item_state: StateIndex, nonterminal: &NonterminalString) // "Y"
+    {
+        if self.visited_set.insert((item_state, nonterminal.clone())) {
+            for pred_item in self.states[item_state.0].items.vec.iter() {
+                if pred_item.can_shift_nonterminal(nonterminal) {
+                    if pred_item.index > 0 {
+                        // Add an edge:
+                        //
+                        //     [Z = ...p (*) Y ...s] -(...p,Y,...s)-> [Y]
+                        self.trace_graph.add_edge(
+                            pred_item,
+                            nonterminal.clone(),
+                            pred_item.symbol_sets(),
+                        );
+                    } else {
+                        // Trace back any incoming edges to [Z = ...p (*) Y ...].
+                        let pred_nonterminal = &pred_item.production.nonterminal;
+                        self.trace_graph.add_edge(
+                            pred_nonterminal.clone(),
+                            nonterminal.clone(),
+                            pred_item.symbol_sets(),
+                        );
+                        self.trace_epsilon_edges(item_state, pred_nonterminal);
+                    }
+                }
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/shift/test.rs
@@ -0,0 +1,78 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::build_states;
+use lr1::core::*;
+use lr1::first::FirstSets;
+use lr1::tls::Lr1Tls;
+use test_util::{expect_debug, normalized_grammar};
+use tls::Tls;
+
+use super::super::Tracer;
+
+fn nt(t: &str) -> NonterminalString {
+    NonterminalString(Atom::from(t))
+}
+
+#[test]
+fn shift_backtrace_1() {
+    // This grammar yields a S/R conflict. Is it `(int -> int) -> int`
+    // or `int -> (int -> int)`?
+
+    let _tls = Tls::test();
+    let grammar = normalized_grammar(
+        r#"
+grammar;
+pub Ty: () = {
+    "int" => (),
+    "bool" => (),
+    <t1:Ty> "->" <t2:Ty> => (),
+};
+"#,
+    );
+    let _lr1_tls = Lr1Tls::install(grammar.terminals.clone());
+    let first_sets = FirstSets::new(&grammar);
+    let err = build_states(&grammar, nt("Ty")).unwrap_err();
+    let conflict = err.conflicts[0].clone();
+    println!("conflict={:?}", conflict);
+
+    // Gin up the LR0 item involved in the shift/reduce conflict:
+    //
+    //     Ty = Ty (*) -> Ty (shift)
+    //
+    // from the item that we can reduce:
+    //
+    //     Ty = Ty -> Ty (*) (reduce)
+
+    assert!(conflict.production.symbols.len() == 3);
+    let item = Item::lr0(conflict.production, 1);
+    println!("item={:?}", item);
+    let tracer = Tracer::new(&first_sets, &err.states);
+    let graph = tracer.backtrace_shift(conflict.state, item);
+    expect_debug(
+        &graph,
+        r#"
+[
+    (Nonterminal(Ty) -([], Some(Ty), ["->", Ty])-> Nonterminal(Ty)),
+    (Nonterminal(Ty) -([Ty], Some("->"), [Ty])-> Item(Ty = Ty (*) "->" Ty)),
+    (Item(Ty = Ty "->" (*) Ty) -([Ty, "->"], Some(Ty), [])-> Nonterminal(Ty))
+]
+"#.trim(),
+    );
+
+    let list: Vec<_> = graph
+        .lr0_examples(item)
+        .map(|example| example.paint_unstyled())
+        .collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Ty "->" Ty "->" Ty",
+        "  │       └─Ty─────┤",
+        "  └─Ty─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/trace_graph/mod.rs
@@ -0,0 +1,452 @@
+use collections::{map, Map};
+use lr1::core::*;
+use lr1::first::*;
+use lr1::lookahead::*;
+use lr1::example::*;
+use grammar::repr::*;
+use petgraph::{Directed, EdgeDirection, Graph};
+use petgraph::graph::{EdgeReference, Edges, NodeIndex};
+use petgraph::prelude::*;
+use std::fmt::{Debug, Error, Formatter};
+
+#[cfg(test)]
+mod test;
+
+/// Trace graphs are used to summarize how it is that we came to be in
+/// a state where we can take some particular shift/reduce action; put
+/// another way, how it is that we came to be in a state with some
+/// particular LR(1) item.
+///
+/// The nodes in the graph are each labeled with a TraceGraphNode and
+/// hence take one of two forms:
+///
+/// - TraceGraphNode::Item -- represents an LR0 item. These nodes are
+///   used for the starting/end points in the graph only.  Basically a
+///   complete trace stretches from the start item to some end item,
+///   and all intermediate nodes are nonterminals.
+/// - TraceGraphNode::Nonterminal -- if this graph is for a shift,
+///   then these represent items where the cursor is at the beginning:
+///   `X = (*) ...`. If the graph is for a reduce, they represent
+///   items where a reduce is possible without shifting any more
+///   terminals (though further reductions may be needed): `X =
+///   ... (*) ...s` where `FIRST(...s)` includes `\epsilon`.
+///
+/// The edges in the graph are also important. They are labeled with
+/// `SymbolSets` instances, meaning that each carries a (prefix,
+/// cursor, and suffix) tuple. The label on an edge `A -> B` means
+/// that transitioning from a state containing `A` to a state
+/// containing `B` is possible if you:
+///
+/// - shift the symbols in `prefix`
+/// - `B` will produce the symbol in `cursor`
+/// - shift the symbols in `suffix` after `B` is popped
+pub struct TraceGraph<'grammar> {
+    // A -L-> B means:
+    //
+    //     Transition from a state containing A to a state containing
+    //     B by (pushing|popping) the symbols L.
+    //
+    // If this trace graph represents a shift backtrace, then the
+    // labels are symbols that are pushed. Otherwise they are labels
+    // that are popped.
+    graph: Graph<TraceGraphNode<'grammar>, SymbolSets<'grammar>>,
+    indices: Map<TraceGraphNode<'grammar>, NodeIndex>,
+}
+
+#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
+pub enum TraceGraphNode<'grammar> {
+    Nonterminal(NonterminalString),
+    Item(LR0Item<'grammar>),
+}
+
+impl<'grammar> TraceGraph<'grammar> {
+    pub fn new() -> Self {
+        TraceGraph {
+            graph: Graph::new(),
+            indices: map(),
+        }
+    }
+
+    pub fn add_node<T>(&mut self, node: T) -> NodeIndex
+    where
+        T: Into<TraceGraphNode<'grammar>>,
+    {
+        let node = node.into();
+        let graph = &mut self.graph;
+        *self.indices
+            .entry(node.clone())
+            .or_insert_with(|| graph.add_node(node))
+    }
+
+    pub fn add_edge<F, T>(&mut self, from: F, to: T, labels: SymbolSets<'grammar>)
+    where
+        F: Into<TraceGraphNode<'grammar>>,
+        T: Into<TraceGraphNode<'grammar>>,
+    {
+        let from = self.add_node(from.into());
+        let to = self.add_node(to.into());
+        if !self.graph
+            .edges_directed(from, EdgeDirection::Outgoing)
+            .any(|edge| edge.target() == to && *edge.weight() == labels)
+        {
+            self.graph.add_edge(from, to, labels);
+        }
+    }
+
+    pub fn lr0_examples<'graph>(
+        &'graph self,
+        lr0_item: LR0Item<'grammar>,
+    ) -> PathEnumerator<'graph, 'grammar> {
+        PathEnumerator::new(self, lr0_item)
+    }
+
+    pub fn lr1_examples<'trace>(
+        &'trace self,
+        first_sets: &'trace FirstSets,
+        item: &LR1Item<'grammar>,
+    ) -> FilteredPathEnumerator<'trace, 'grammar> {
+        FilteredPathEnumerator::new(first_sets, self, item.to_lr0(), item.lookahead.clone())
+    }
+}
+
+impl<'grammar> Into<TraceGraphNode<'grammar>> for NonterminalString {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        TraceGraphNode::Nonterminal(self)
+    }
+}
+
+impl<'grammar, L: Lookahead> Into<TraceGraphNode<'grammar>> for Item<'grammar, L> {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        (&self).into()
+    }
+}
+
+impl<'a, 'grammar, L: Lookahead> Into<TraceGraphNode<'grammar>> for &'a Item<'grammar, L> {
+    fn into(self) -> TraceGraphNode<'grammar> {
+        TraceGraphNode::Item(self.to_lr0())
+    }
+}
+
+// This just exists to help with the `Debug` impl
+struct TraceGraphEdge<'grammar> {
+    from: TraceGraphNode<'grammar>,
+    to: TraceGraphNode<'grammar>,
+    label: (
+        &'grammar [Symbol],
+        Option<&'grammar Symbol>,
+        &'grammar [Symbol],
+    ),
+}
+
+impl<'grammar> Debug for TraceGraphEdge<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "({:?} -{:?}-> {:?})", self.from, self.label, self.to)
+    }
+}
+
+impl<'grammar> Debug for TraceGraph<'grammar> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let mut s = fmt.debug_list();
+        for (node, &index) in &self.indices {
+            for edge in self.graph.edges_directed(index, EdgeDirection::Outgoing) {
+                let label = edge.weight();
+                s.entry(&TraceGraphEdge {
+                    from: node.clone(),
+                    to: self.graph[edge.target()].clone(),
+                    label: (label.prefix, label.cursor, label.suffix),
+                });
+            }
+        }
+        s.finish()
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// PathEnumerator
+//
+// The path enumerater walks a trace graph searching for paths that
+// start at a given item and terminate at another item. If such a path
+// is found, you can then find the complete list of symbols by calling
+// `symbols_and_cursor` and also get access to the state.
+
+pub struct PathEnumerator<'graph, 'grammar: 'graph> {
+    graph: &'graph TraceGraph<'grammar>,
+    stack: Vec<EnumeratorState<'graph, 'grammar>>,
+}
+
+struct EnumeratorState<'graph, 'grammar: 'graph> {
+    index: NodeIndex,
+    symbol_sets: SymbolSets<'grammar>,
+    edges: Edges<'graph, SymbolSets<'grammar>, Directed>,
+}
+
+impl<'graph, 'grammar> PathEnumerator<'graph, 'grammar> {
+    fn new(graph: &'graph TraceGraph<'grammar>, lr0_item: LR0Item<'grammar>) -> Self {
+        let start_state = graph.indices[&TraceGraphNode::Item(lr0_item)];
+        let mut enumerator = PathEnumerator {
+            graph: graph,
+            stack: vec![],
+        };
+        let edges = enumerator.incoming_edges(start_state);
+        enumerator.stack.push(EnumeratorState {
+            index: start_state,
+            symbol_sets: SymbolSets::new(),
+            edges: edges,
+        });
+        enumerator.find_next_trace();
+        enumerator
+    }
+
+    /// Advance to the next example. Returns false if there are no more
+    /// examples.
+    pub fn advance(&mut self) -> bool {
+        // If we have not yet exhausted all the examples, then the top
+        // of the stack should be the last target item that we
+        // found. Pop it off.
+        match self.stack.pop() {
+            Some(top_state) => {
+                assert!(match self.graph.graph[top_state.index] {
+                    TraceGraphNode::Item(_) => true,
+                    TraceGraphNode::Nonterminal(_) => false,
+                });
+
+                self.find_next_trace()
+            }
+            None => false,
+        }
+    }
+
+    fn incoming_edges(&self, index: NodeIndex) -> Edges<'graph, SymbolSets<'grammar>, Directed> {
+        self.graph
+            .graph
+            .edges_directed(index, EdgeDirection::Incoming)
+    }
+
+    /// This is the main operation, written in CPS style and hence it
+    /// can seem a bit confusing. The idea is that `find_next_trace`
+    /// is called when we are ready to consider the next child of
+    /// whatever is on the top of the stack. It simply withdraws
+    /// that next child (if any) and hands it to `push_next`.
+    fn find_next_trace(&mut self) -> bool {
+        if !self.stack.is_empty() {
+            let next_edge = {
+                let top_of_stack = self.stack.last_mut().unwrap();
+                top_of_stack.edges.next()
+            };
+            self.push_next_child_if_any(next_edge)
+        } else {
+            false
+        }
+    }
+
+    /// Invoked with the next child (if any) of the node on the top of
+    /// the stack.
+    ///
+    /// If `next` is `Some`, we simply call `push_next_child`.
+    ///
+    /// If `next` is `None`, then the node on the top of
+    /// the stack *has* no next child, and so it is popped, and then
+    /// we call `find_next_trace` again to start with the next child
+    /// of the new top of the stack.
+    fn push_next_child_if_any(
+        &mut self,
+        next: Option<EdgeReference<'graph, SymbolSets<'grammar>>>,
+    ) -> bool {
+        if let Some(edge) = next {
+            let index = edge.source();
+            let symbol_sets = *edge.weight();
+            self.push_next_child(index, symbol_sets)
+        } else {
+            self.stack.pop();
+            self.find_next_trace()
+        }
+    }
+
+    /// Push the next child of the top of the stack onto the stack,
+    /// making the child the new top.
+    ///
+    /// If the child is an `Item` node, we have found the next trace,
+    /// and hence our search terminates. We push the symbols from this
+    /// item node into the symbols vector and then return true.
+    ///
+    /// Otherwise, we check whether this new node would cause a cycle.
+    /// If so, we do *not* push it, and instead just call
+    /// `find_next_trace` again to proceed to the next child of the
+    /// current top.
+    ///
+    /// Finally, if the new node would NOT cause a cycle, then we can
+    /// push it onto the stack so that it becomes the new top, and
+    /// call `find_next_trace` to start searching its children.
+    fn push_next_child(&mut self, index: NodeIndex, symbol_sets: SymbolSets<'grammar>) -> bool {
+        match self.graph.graph[index] {
+            TraceGraphNode::Item(_) => {
+                // If we reached an item like
+                //
+                //     X = ...p (*) ...s
+                //
+                // then we are done, but we still need to push on the
+                // symbols `...p`.
+                let edges = self.incoming_edges(index);
+                self.stack.push(EnumeratorState {
+                    index: index,
+                    symbol_sets: symbol_sets,
+                    edges: edges,
+                });
+                return true;
+            }
+            TraceGraphNode::Nonterminal(_) => {
+                // If this node already appears on the stack, do not
+                // visit its children.
+                if !self.stack.iter().any(|state| state.index == index) {
+                    let edges = self.incoming_edges(index);
+                    self.stack.push(EnumeratorState {
+                        index: index,
+                        symbol_sets: symbol_sets,
+                        edges: edges,
+                    });
+                }
+                self.find_next_trace()
+            }
+        }
+    }
+
+    pub fn found_trace(&self) -> bool {
+        !self.stack.is_empty()
+    }
+
+    /// Returns the 1-context for the current trace. In other words,
+    /// the set of tokens that may appear next in the input. If this
+    /// trace was derived from a shiftable item, this will always be
+    /// the terminal that was to be shifted; if derived from a reduce
+    /// item, this constitutes the set of lookaheads that will trigger
+    /// a reduce.
+    pub fn first0(&self, first_sets: &FirstSets) -> TokenSet {
+        assert!(self.found_trace());
+        first_sets.first0(
+            self.stack[1]
+                .symbol_sets
+                .cursor
+                .into_iter()
+                .chain(self.stack.iter().flat_map(|s| s.symbol_sets.suffix)),
+        )
+    }
+
+    pub fn example(&self) -> Example {
+        assert!(self.found_trace());
+
+        let mut symbols = vec![];
+
+        symbols.extend(
+            self.stack
+                .iter()
+                .rev()
+                .flat_map(|s| s.symbol_sets.prefix)
+                .cloned()
+                .map(ExampleSymbol::Symbol),
+        );
+
+        let cursor = symbols.len();
+
+        match self.stack[1].symbol_sets.cursor {
+            Some(s) => symbols.push(ExampleSymbol::Symbol(s.clone())),
+            None => if self.stack[1].symbol_sets.prefix.is_empty() {
+                symbols.push(ExampleSymbol::Epsilon)
+            } else {
+            },
+        }
+
+        symbols.extend(
+            self.stack
+                .iter()
+                .flat_map(|s| s.symbol_sets.suffix)
+                .cloned()
+                .map(ExampleSymbol::Symbol),
+        );
+
+        let mut cursors = (0, symbols.len());
+
+        let mut reductions: Vec<_> = self.stack[1..]
+            .iter()
+            .rev()
+            .map(|state| {
+                let nonterminal = match self.graph.graph[state.index] {
+                    TraceGraphNode::Nonterminal(ref nonterminal) => nonterminal.clone(),
+                    TraceGraphNode::Item(ref item) => item.production.nonterminal.clone(),
+                };
+                let reduction = Reduction {
+                    start: cursors.0,
+                    end: cursors.1,
+                    nonterminal: nonterminal,
+                };
+                cursors.0 += state.symbol_sets.prefix.len();
+                cursors.1 -= state.symbol_sets.suffix.len();
+                reduction
+            })
+            .collect();
+        reductions.reverse();
+
+        Example {
+            symbols: symbols,
+            cursor: cursor,
+            reductions: reductions,
+        }
+    }
+}
+
+impl<'graph, 'grammar> Iterator for PathEnumerator<'graph, 'grammar> {
+    type Item = Example;
+
+    fn next(&mut self) -> Option<Example> {
+        if self.found_trace() {
+            let example = self.example();
+            self.advance();
+            Some(example)
+        } else {
+            None
+        }
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// FilteredPathEnumerator
+//
+// Like the path enumerator, but tests for examples with some specific
+// lookahead
+
+pub struct FilteredPathEnumerator<'graph, 'grammar: 'graph> {
+    base: PathEnumerator<'graph, 'grammar>,
+    first_sets: &'graph FirstSets,
+    lookahead: TokenSet,
+}
+
+impl<'graph, 'grammar> FilteredPathEnumerator<'graph, 'grammar> {
+    fn new(
+        first_sets: &'graph FirstSets,
+        graph: &'graph TraceGraph<'grammar>,
+        lr0_item: LR0Item<'grammar>,
+        lookahead: TokenSet,
+    ) -> Self {
+        FilteredPathEnumerator {
+            base: PathEnumerator::new(graph, lr0_item),
+            first_sets: first_sets,
+            lookahead: lookahead,
+        }
+    }
+}
+
+impl<'graph, 'grammar> Iterator for FilteredPathEnumerator<'graph, 'grammar> {
+    type Item = Example;
+
+    fn next(&mut self) -> Option<Example> {
+        while self.base.found_trace() {
+            let firsts = self.base.first0(self.first_sets);
+            if firsts.is_intersecting(&self.lookahead) {
+                let example = self.base.example();
+                self.base.advance();
+                return Some(example);
+            }
+            self.base.advance();
+        }
+        None
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/lr1/trace/trace_graph/test.rs
@@ -0,0 +1,162 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::*;
+use lr1::core::*;
+use test_util::expect_debug;
+use tls::Tls;
+
+macro_rules! nt {
+    ($x:ident) => {
+        NonterminalString(Atom::from(stringify!($x)))
+    }
+}
+
+macro_rules! syms {
+    ($($x:ident),*) => {
+        vec![$(Symbol::Nonterminal(nt!($x))),*]
+    }
+}
+
+macro_rules! production {
+    ($x:ident = $($y:ident)*) => {
+        Production {
+            nonterminal: nt!($x),
+            symbols: syms![$($y),*],
+            action: ActionFn::new(0),
+            span: Span(0, 0)
+        }
+    }
+}
+
+use super::TraceGraph;
+
+#[test]
+fn enumerator() {
+    let _tls = Tls::test();
+
+    // Build this graph:
+    //
+    //     X = X0 (*) X1
+    //     ^
+    //     |
+    //   {X0}
+    //     |
+    // +-> X <-- Z = Z0 (*) X Z1
+    // |
+    // Y = Y0 (*) X Y1
+    //
+    // which enumerates out to:
+    //
+    //    [Y0 X0 (*) X1 Y1]
+    //    [Z0 X0 (*) X1 Z1]
+
+    let productions = vec![
+        production![X = X0 X1],
+        production![Y = Y0 X Y1],
+        production![Z = Z0 X Z1],
+    ];
+
+    let mut graph = TraceGraph::new();
+
+    let item0 = Item::lr0(&productions[0], 1); // X = X0 (*) X1
+    graph.add_edge(nt!(X), item0, item0.symbol_sets());
+
+    let item1 = Item::lr0(&productions[1], 1); // Y = Y0 (*) X Y1
+    graph.add_edge(item1, nt!(X), item1.symbol_sets());
+
+    let item2 = Item::lr0(&productions[2], 1); // Z = Z0 (*) X Z1
+    graph.add_edge(item2, nt!(X), item2.symbol_sets());
+
+    let enumerator = graph.lr0_examples(Item::lr0(&productions[0], 1));
+    let list: Vec<_> = enumerator.map(|example| example.paint_unstyled()).collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Z0 X0 X1 Z1",
+        "  │  └─X─┘  │",
+        "  └─Z───────┘"
+    ],
+    [
+        "  Y0 X0 X1 Y1",
+        "  │  └─X─┘  │",
+        "  └─Y───────┘"
+    ]
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn enumerator1() {
+    let _tls = Tls::test();
+
+    // Build this graph:
+    //
+    //     W = W0 W1 (*)
+    //     ^
+    //  {W0,W1}
+    //     |
+    //     W
+    //     ^
+    //   {X0}
+    //     |
+    // +-> X <-- Z = Z0 (*) X Z1
+    // |
+    // Y = Y0 (*) X Y1
+    //
+    // which enumerates out to:
+    //
+    //    [Y0 X0 (*) X1 Y1]
+    //    [Z0 X0 (*) X1 Z1]
+
+    let productions = vec![
+        production![W = W0 W1],
+        production![X = X0 W X1], // where X1 may be empty
+        production![Y = Y0 X Y1],
+        production![Z = Z0 X Z1],
+    ];
+
+    let mut graph = TraceGraph::new();
+
+    let item0 = Item::lr0(&productions[0], 2); // W = W0 W1 (*)
+    graph.add_edge(nt!(W), item0, item0.symbol_sets());
+
+    graph.add_edge(
+        nt!(X),
+        nt!(W),
+        SymbolSets {
+            prefix: &productions[1].symbols[..1],
+            cursor: Some(&productions[1].symbols[1]),
+            suffix: &productions[1].symbols[2..],
+        },
+    );
+
+    let item1 = Item::lr0(&productions[2], 1);
+    graph.add_edge(item1, nt!(X), item1.symbol_sets());
+
+    let item2 = Item::lr0(&productions[3], 1);
+    graph.add_edge(item2, nt!(X), item2.symbol_sets());
+
+    let enumerator = graph.lr0_examples(Item::lr0(&productions[0], 2));
+    let list: Vec<_> = enumerator.map(|example| example.paint_unstyled()).collect();
+    expect_debug(
+        &list,
+        r#"
+[
+    [
+        "  Z0 X0 W0 W1 X1 Z1",
+        "  │  │  └─W─┘  │  │",
+        "  │  └─X───────┘  │",
+        "  └─Z─────────────┘"
+    ],
+    [
+        "  Y0 X0 W0 W1 X1 Y1",
+        "  │  │  └─W─┘  │  │",
+        "  │  └─X───────┘  │",
+        "  └─Y─────────────┘"
+    ]
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/main.rs
@@ -0,0 +1,153 @@
+extern crate docopt;
+extern crate lalrpop;
+#[macro_use]
+extern crate serde_derive;
+extern crate serde;
+
+use docopt::Docopt;
+use lalrpop::Configuration;
+use std::env;
+use std::io::{self, Write};
+use std::process;
+
+static VERSION: &'static str = env!("CARGO_PKG_VERSION");
+
+fn main() {
+    main1().unwrap();
+}
+
+fn main1() -> io::Result<()> {
+    let mut stderr = std::io::stderr();
+    let mut stdout = std::io::stdout();
+
+    let args: Args = Docopt::new(USAGE)
+        .and_then(|d| d.argv(env::args()).deserialize())
+        .unwrap_or_else(|e| e.exit());
+
+    if args.flag_version {
+        try!(writeln!(stdout, "{}", VERSION));
+        process::exit(0);
+    }
+
+    let mut config = Configuration::new();
+
+    match args.flag_level.unwrap_or(LevelFlag::Info) {
+        LevelFlag::Quiet => config.log_quiet(),
+        LevelFlag::Info => config.log_info(),
+        LevelFlag::Verbose => config.log_verbose(),
+        LevelFlag::Debug => config.log_debug(),
+    };
+
+    if args.flag_force {
+        config.force_build(true);
+    }
+
+    if args.flag_color {
+        config.always_use_colors();
+    }
+
+    if args.flag_comments {
+        config.emit_comments(true);
+    }
+
+    if args.flag_report {
+        config.emit_report(true);
+    }
+
+    if args.arg_inputs.len() == 0 {
+        try!(writeln!(
+            stderr,
+            "Error: no input files specified! Try --help for help."
+        ));
+        process::exit(1);
+    }
+
+    for arg in args.arg_inputs {
+        match config.process_file(&arg) {
+            Ok(()) => {}
+            Err(err) => {
+                try!(writeln!(
+                    stderr,
+                    "Error encountered processing `{}`: {}",
+                    arg, err
+                ));
+                process::exit(1);
+            }
+        }
+    }
+
+    Ok(())
+}
+
+const USAGE: &'static str = "
+Usage: lalrpop [options] <inputs>...
+       lalrpop --help
+       lalrpop (-V | --version)
+
+Options:
+    -V, --version        Print version.
+    -l, --level LEVEL    Set the debug level. (Default: info)
+                         Valid values: quiet, info, verbose, debug.
+    -f, --force          Force execution, even if the .lalrpop file is older than the .rs file.
+    -c, --color          Force colorful output, even if this is not a TTY.
+    --comments           Enable comments in the generated code.
+    --report             Generate report files.
+";
+
+#[derive(Debug, Deserialize)]
+struct Args {
+    arg_inputs: Vec<String>,
+    flag_level: Option<LevelFlag>,
+    flag_force: bool,
+    flag_color: bool,
+    flag_comments: bool,
+    flag_report: bool,
+    flag_version: bool,
+}
+
+#[derive(Debug, Deserialize)]
+enum LevelFlag {
+    Quiet,
+    Info,
+    Verbose,
+    Debug,
+}
+
+#[cfg(test)]
+mod test {
+    use docopt::Docopt;
+    use super::USAGE;
+    use super::Args;
+
+    #[test]
+    fn test_usage_help() {
+        let argv = || vec!["lalrpop", "--help"];
+        let _: Args = Docopt::new(USAGE)
+            .and_then(|d| d.help(false).argv(argv().into_iter()).deserialize())
+            .unwrap();
+    }
+
+    #[test]
+    fn test_usage_version() {
+        let argv = || vec!["lalrpop", "--version"];
+        let _: Args = Docopt::new(USAGE)
+            .and_then(|d| d.argv(argv().into_iter()).deserialize())
+            .unwrap();
+    }
+
+    #[test]
+    fn test_usage_single_input() {
+        let argv = || vec!["lalrpop", "file.lalrpop"];
+        let _: Args = Docopt::new(USAGE)
+            .and_then(|d| d.argv(argv().into_iter()).deserialize())
+            .unwrap();
+    }
+
+    #[test]
+    fn test_usage_multiple_inputs() {
+        let argv = || vec!["lalrpop", "file.lalrpop", "../file2.lalrpop"];
+        let _: Args = Docopt::new(USAGE)
+            .and_then(|d| d.argv(argv().into_iter()).deserialize())
+            .unwrap();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/builder.rs
@@ -0,0 +1,309 @@
+use grammar::parse_tree::Span;
+use message::{Content, Message};
+use message::indent::Indent;
+use message::horiz::Horiz;
+use message::styled::Styled;
+use message::text::Text;
+use message::vert::Vert;
+use message::wrap::Wrap;
+use style::Style;
+
+pub struct MessageBuilder {
+    span: Span,
+    heading: Option<Box<Content>>,
+    body: Option<Box<Content>>,
+}
+
+pub struct HeadingCharacter {
+    message: MessageBuilder,
+}
+
+pub struct BodyCharacter {
+    message: MessageBuilder,
+}
+
+impl MessageBuilder {
+    pub fn new(span: Span) -> Self {
+        MessageBuilder {
+            span: span,
+            heading: None,
+            body: None,
+        }
+    }
+
+    pub fn heading(self) -> Builder<HeadingCharacter> {
+        Builder::new(HeadingCharacter { message: self })
+    }
+
+    pub fn body(self) -> Builder<BodyCharacter> {
+        Builder::new(BodyCharacter { message: self })
+    }
+
+    pub fn end(self) -> Message {
+        Message::new(
+            self.span,
+            self.heading.expect("never defined a heading"),
+            self.body.expect("never defined a body"),
+        )
+    }
+}
+
+impl Character for HeadingCharacter {
+    type End = MessageBuilder;
+
+    fn end(mut self, items: Vec<Box<Content>>) -> MessageBuilder {
+        assert!(
+            self.message.heading.is_none(),
+            "already defined a heading for this message"
+        );
+        self.message.heading = Some(Box::new(Vert::new(items, 1)));
+        self.message
+    }
+}
+
+impl Character for BodyCharacter {
+    type End = MessageBuilder;
+
+    fn end(mut self, items: Vec<Box<Content>>) -> MessageBuilder {
+        assert!(
+            self.message.body.is_none(),
+            "already defined a body for this message"
+        );
+        self.message.body = Some(Box::new(Vert::new(items, 2)));
+        self.message
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Inline builder: Useful for constructing little bits of content: for
+// example, converting an Example into something renderable. Using an
+// inline builder, if you push exactly one item, then when you call
+// `end` that is what you get; otherwise, you get items laid out
+// adjacent to one another horizontally (no spaces in between).
+
+pub struct InlineBuilder;
+
+impl InlineBuilder {
+    pub fn new() -> Builder<InlineBuilder> {
+        Builder::new(InlineBuilder)
+    }
+}
+
+impl Character for InlineBuilder {
+    type End = Box<Content>;
+
+    fn end(self, mut items: Vec<Box<Content>>) -> Box<Content> {
+        if items.len() == 1 {
+            items.pop().unwrap()
+        } else {
+            Box::new(Horiz::new(items, 1))
+        }
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Builder -- generic helper for multi-part items
+
+/// The builder is used to construct multi-part items. It is intended
+/// to be used in a "method-call chain" style. The base method is
+/// called `push`, and it simply pushes a new child of the current
+/// parent.
+///
+/// Methods whose name like `begin_foo` are used to create a new
+/// multi-part child; they return a fresh builder corresponding to the
+/// child. When the child is completely constructed, call `end` to
+/// finish the child builder and return to the parent builder.
+///
+/// Methods whose name ends in "-ed", such as `styled`, post-process
+/// the last item pushed. They will panic if invoked before any items
+/// have been pushed.
+///
+/// Example:
+///
+/// ```
+/// let node =
+///    InlineBuilder::new()
+///        .begin_lines() // starts a child builder for adjacent lines
+///        .text("foo")   // add a text node "foo" to the child builder
+///        .text("bar")   // add a text node "bar" to the child builder
+///        .end()         // finish the lines builder, return to the parent
+///        .end();        // finish the parent `InlineBuilder`, yielding up the
+///                       // `lines` child that was pushed (see `InlineBuilder`
+///                       // for more details)
+/// ```
+pub struct Builder<C: Character> {
+    items: Vec<Box<Content>>,
+    character: C,
+}
+
+impl<C: Character> Builder<C> {
+    fn new(character: C) -> Self {
+        Builder {
+            items: vec![],
+            character: character,
+        }
+    }
+
+    pub fn push<I>(mut self, item: I) -> Self
+    where
+        I: Into<Box<Content>>,
+    {
+        self.items.push(item.into());
+        self
+    }
+
+    fn pop(&mut self) -> Option<Box<Content>> {
+        self.items.pop()
+    }
+
+    pub fn begin_vert(self, separate: usize) -> Builder<VertCharacter<C>> {
+        Builder::new(VertCharacter {
+            base: self,
+            separate: separate,
+        })
+    }
+
+    pub fn begin_lines(self) -> Builder<VertCharacter<C>> {
+        self.begin_vert(1)
+    }
+
+    pub fn begin_paragraphs(self) -> Builder<VertCharacter<C>> {
+        self.begin_vert(2)
+    }
+
+    pub fn begin_horiz(self, separate: usize) -> Builder<HorizCharacter<C>> {
+        Builder::new(HorizCharacter {
+            base: self,
+            separate: separate,
+        })
+    }
+
+    // "item1item2"
+    pub fn begin_adjacent(self) -> Builder<HorizCharacter<C>> {
+        self.begin_horiz(1)
+    }
+
+    // "item1 item2"
+    pub fn begin_spaced(self) -> Builder<HorizCharacter<C>> {
+        self.begin_horiz(2)
+    }
+
+    pub fn begin_wrap(self) -> Builder<WrapCharacter<C>> {
+        Builder::new(WrapCharacter { base: self })
+    }
+
+    pub fn styled(mut self, style: Style) -> Self {
+        let content = self.pop().expect("bold must be applied to an item");
+        self.push(Box::new(Styled::new(style, content)))
+    }
+
+    pub fn indented_by(mut self, amount: usize) -> Self {
+        let content = self.pop().expect("indent must be applied to an item");
+        self.push(Box::new(Indent::new(amount, content)))
+    }
+
+    pub fn indented(self) -> Self {
+        self.indented_by(2)
+    }
+
+    pub fn text<T: ToString>(self, text: T) -> Self {
+        self.push(Box::new(Text::new(text.to_string())))
+    }
+
+    /// Take the item just pushed and makes some text adjacent to it.
+    /// E.g. `builder.wrap().text("foo").adjacent_text(".").end()`
+    /// result in `"foo."` being printed without any wrapping in
+    /// between.
+    pub fn adjacent_text<T: ToString, U: ToString>(mut self, prefix: T, suffix: U) -> Self {
+        let item = self.pop().expect("adjacent text must be added to an item");
+        let prefix = prefix.to_string();
+        let suffix = suffix.to_string();
+        if !prefix.is_empty() && !suffix.is_empty() {
+            self.begin_adjacent()
+                .text(prefix)
+                .push(item)
+                .text(suffix)
+                .end()
+        } else if !suffix.is_empty() {
+            self.begin_adjacent().push(item).text(suffix).end()
+        } else if !prefix.is_empty() {
+            self.begin_adjacent().text(prefix).push(item).end()
+        } else {
+            self.push(item)
+        }
+    }
+
+    pub fn verbatimed(self) -> Self {
+        self.adjacent_text("`", "`")
+    }
+
+    pub fn punctuated<T: ToString>(self, text: T) -> Self {
+        self.adjacent_text("", text)
+    }
+
+    pub fn wrap_text<T: ToString>(self, text: T) -> Self {
+        self.begin_wrap().text(text).end()
+    }
+
+    pub fn end(self) -> C::End {
+        self.character.end(self.items)
+    }
+}
+
+pub trait Character {
+    type End;
+    fn end(self, items: Vec<Box<Content>>) -> Self::End;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct HorizCharacter<C: Character> {
+    base: Builder<C>,
+    separate: usize,
+}
+
+impl<C: Character> Character for HorizCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Horiz::new(items, self.separate)))
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct VertCharacter<C: Character> {
+    base: Builder<C>,
+    separate: usize,
+}
+
+impl<C: Character> Character for VertCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Vert::new(items, self.separate)))
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+pub struct WrapCharacter<C: Character> {
+    base: Builder<C>,
+}
+
+impl<C: Character> Character for WrapCharacter<C> {
+    type End = Builder<C>;
+
+    fn end(self, items: Vec<Box<Content>>) -> Builder<C> {
+        self.base.push(Box::new(Wrap::new(items)))
+    }
+}
+
+impl<T> From<Box<T>> for Box<Content>
+where
+    T: Content + 'static,
+{
+    fn from(b: Box<T>) -> Box<Content> {
+        b
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/horiz.rs
@@ -0,0 +1,44 @@
+use ascii_canvas::AsciiView;
+use itertools::Itertools;
+use super::*;
+
+#[derive(Debug)]
+pub struct Horiz {
+    items: Vec<Box<Content>>,
+    separate: usize, // 0 => overlapping, 1 => each on its own line, 2 => paragraphs
+}
+
+impl Horiz {
+    pub fn new(items: Vec<Box<Content>>, separate: usize) -> Self {
+        Horiz {
+            items: items,
+            separate: separate,
+        }
+    }
+}
+
+impl Content for Horiz {
+    fn min_width(&self) -> usize {
+        self.items
+            .iter()
+            .map(|c| c.min_width())
+            .intersperse(self.separate)
+            .fold(0, |a, b| a + b)
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        emit_horiz(view, &self.items, self.separate);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+pub fn emit_horiz(view: &mut AsciiView, items: &[Box<Content>], separate: usize) {
+    let mut column = 0;
+    for item in items {
+        let (_, end_column) = item.emit_at(view, 0, column);
+        column = end_column + separate;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/indent.rs
@@ -0,0 +1,32 @@
+use ascii_canvas::AsciiView;
+use super::*;
+
+#[derive(Debug)]
+pub struct Indent {
+    amount: usize,
+    content: Box<Content>,
+}
+
+impl Indent {
+    pub fn new(amount: usize, content: Box<Content>) -> Self {
+        Indent {
+            amount: amount,
+            content: content,
+        }
+    }
+}
+
+impl Content for Indent {
+    fn min_width(&self) -> usize {
+        self.content.min_width() + self.amount
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let mut subview = view.shift(0, self.amount);
+        self.content.emit(&mut subview);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/message.rs
@@ -0,0 +1,84 @@
+use ascii_canvas::AsciiView;
+use grammar::parse_tree::Span;
+use message::Content;
+use std::cmp;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use tls::Tls;
+
+/// The top-level message display like this:
+///
+/// ```
+/// <span>: <heading>
+///
+/// <body>
+/// ```
+///
+/// This is equivalent to a
+///
+/// ```
+/// Vert[separate=2] {
+///     Horiz[separate=1] {
+///         Horiz[separate=0] {
+///             Citation { span },
+///             Text { ":" },
+///         },
+///         <heading>,
+///     },
+///     <body>
+/// }
+/// ```
+pub struct Message {
+    span: Span,
+    heading: Box<Content>,
+    body: Box<Content>,
+}
+
+impl Message {
+    pub fn new(span: Span, heading: Box<Content>, body: Box<Content>) -> Self {
+        Message {
+            span: span,
+            heading: heading,
+            body: body,
+        }
+    }
+}
+
+impl Content for Message {
+    fn min_width(&self) -> usize {
+        let file_text = Tls::file_text();
+        let span = file_text.span_str(self.span).chars().count();
+        let heading = self.heading.min_width();
+        let body = self.body.min_width();
+        cmp::max(span + heading + 2, body + 2)
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let session = Tls::session();
+        let file_text = Tls::file_text();
+
+        let span = file_text.span_str(self.span);
+        view.write_chars(0, 0, span.chars(), Style::new());
+        let count = span.chars().count();
+        view.write_chars(0, count, ":".chars(), Style::new());
+
+        let (row, _) = self.heading
+            .emit_at(&mut view.styled(session.heading), 0, count + 2);
+
+        self.body.emit_at(view, row + 2, 2);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+impl Debug for Message {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        fmt.debug_struct("Message")
+            .field("span", &self.span)
+            .field("heading", &self.heading)
+            .field("body", &self.body)
+            .finish()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/mod.rs
@@ -0,0 +1,79 @@
+use ascii_canvas::{AsciiCanvas, AsciiView};
+
+use std::cmp;
+use std::fmt::Debug;
+
+pub mod builder;
+pub mod horiz;
+pub mod message;
+pub mod indent;
+pub mod styled;
+#[cfg(test)]
+mod test;
+pub mod text;
+pub mod vert;
+pub mod wrap;
+
+/// Content which can be rendered.
+pub trait Content: Debug {
+    fn min_width(&self) -> usize;
+
+    fn emit(&self, view: &mut AsciiView);
+
+    /// Creates a canvas at least `min_width` in width (it may be
+    /// larger if the content requires that) and fills it with the
+    /// current content. Returns the canvas. Typically `min_width`
+    /// would be 80 or the width of the current terminal.
+    fn emit_to_canvas(&self, min_width: usize) -> AsciiCanvas {
+        let computed_min = self.min_width();
+        let min_width = cmp::max(min_width, computed_min);
+        debug!(
+            "emit_to_canvas: min_width={} computed_min={} self={:#?}",
+            min_width, computed_min, self
+        );
+        let mut canvas = AsciiCanvas::new(0, min_width);
+        self.emit(&mut canvas);
+        canvas
+    }
+
+    /// Emit at a particular upper-left corner, returning the
+    /// lower-right corner that was emitted.
+    fn emit_at(&self, view: &mut AsciiView, row: usize, column: usize) -> (usize, usize) {
+        debug!(
+            "emit_at({},{}) self={:?} min_width={:?}",
+            row,
+            column,
+            self,
+            self.min_width()
+        );
+        let mut shifted_view = view.shift(row, column);
+        self.emit(&mut shifted_view);
+        let (r, c) = shifted_view.close();
+        (r, c)
+    }
+
+    /// When items are enclosed into a wrap, this method deconstructs
+    /// them into their indivisible components.
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>);
+}
+
+/// Helper function: convert `content` into wrap items and then map
+/// those with `op`, appending the final result into `wrap_items`.
+/// Useful for "modifier" content items like `Styled` that do not
+/// affect wrapping.
+fn into_wrap_items_map<OP, C>(content: Box<Content>, wrap_items: &mut Vec<Box<Content>>, op: OP)
+where
+    OP: FnMut(Box<Content>) -> C,
+    C: Content + 'static,
+{
+    let mut subvector = vec![];
+    content.into_wrap_items(&mut subvector);
+    wrap_items.extend(
+        subvector
+            .into_iter()
+            .map(op)
+            .map(|item| Box::new(item) as Box<Content>),
+    );
+}
+
+pub use self::message::Message;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/styled.rs
@@ -0,0 +1,41 @@
+use ascii_canvas::AsciiView;
+use std::fmt::{Debug, Error, Formatter};
+use style::Style;
+use super::*;
+
+pub struct Styled {
+    style: Style,
+    content: Box<Content>,
+}
+
+impl Styled {
+    pub fn new(style: Style, content: Box<Content>) -> Self {
+        Styled {
+            style: style,
+            content: content,
+        }
+    }
+}
+
+impl Content for Styled {
+    fn min_width(&self) -> usize {
+        self.content.min_width()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        self.content.emit(&mut view.styled(self.style))
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        let style = self.style;
+        super::into_wrap_items_map(self.content, wrap_items, |item| Styled::new(style, item))
+    }
+}
+
+impl Debug for Styled {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        fmt.debug_struct("Styled")
+            .field("content", &self.content)
+            .finish()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/test.rs
@@ -0,0 +1,142 @@
+use ascii_canvas::AsciiCanvas;
+use grammar::parse_tree::Span;
+use message::builder::MessageBuilder;
+use test_util::expect_debug;
+use tls::Tls;
+
+use super::*;
+
+fn install_tls() -> Tls {
+    Tls::test_string(
+        r#"foo
+bar
+baz
+"#,
+    )
+}
+
+#[test]
+fn hello_world() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end()
+        .body()
+        .begin_wrap()
+        .text(
+            "This is a very, very, very, very long sentence. \
+             OK, not THAT long!",
+        )
+        .end()
+        .indented_by(4)
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "      This is a very, very,",
+    "      very, very long sentence.",
+    "      OK, not THAT long!"
+]
+"#.trim(),
+    );
+}
+
+/// Test a case where the body in the message is longer than the
+/// header (which used to mess up the `min_width` computation).
+#[test]
+fn long_body() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end()
+        .body()
+        .text(
+            "This is a very, very, very, very long sentence. \
+             OK, not THAT long!",
+        )
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "  This is a very, very, very, very long sentence. OK, not THAT long!"
+]
+"#.trim(),
+    );
+}
+
+#[test]
+fn paragraphs() {
+    let _tls = install_tls();
+    let msg = MessageBuilder::new(Span(0, 2))
+        .heading()
+        .text("Hello, world!")
+        .end() // heading
+        .body()
+        .begin_paragraphs()
+        .begin_wrap()
+        .text("This is the first paragraph. It contains a lot of really interesting \
+               information that the reader will no doubt peruse with care.")
+        .end()
+        .begin_wrap()
+        .text("This is the second paragraph. It contains even more really interesting \
+               information that the reader will no doubt skip over with wild abandon.")
+        .end()
+        .begin_wrap()
+        .text("This is the final paragraph. The reader won't even spare this one \
+               a second glance, despite it containing just waht they need to know \
+               to solve their problem and to derive greater pleasure from life. \
+               The secret: All you need is love! Dum da da dum.")
+        .end()
+        .end()
+        .end()
+        .end();
+    let min_width = msg.min_width();
+    let mut canvas = AsciiCanvas::new(0, min_width);
+    msg.emit(&mut canvas);
+    expect_debug(
+        &canvas.to_strings(),
+        r#"
+[
+    "tmp.txt:1:1: 1:2: Hello, world!",
+    "",
+    "  This is the first paragraph.",
+    "  It contains a lot of really",
+    "  interesting information that",
+    "  the reader will no doubt",
+    "  peruse with care.",
+    "",
+    "  This is the second paragraph.",
+    "  It contains even more really",
+    "  interesting information that",
+    "  the reader will no doubt skip",
+    "  over with wild abandon.",
+    "",
+    "  This is the final paragraph.",
+    "  The reader won't even spare",
+    "  this one a second glance,",
+    "  despite it containing just",
+    "  waht they need to know to",
+    "  solve their problem and to",
+    "  derive greater pleasure from",
+    "  life. The secret: All you",
+    "  need is love! Dum da da dum."
+]
+"#.trim(),
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/text.rs
@@ -0,0 +1,37 @@
+use ascii_canvas::AsciiView;
+use style::Style;
+
+use super::*;
+
+/// Text to be display. This will be flowed appropriately depending on
+/// the container; e.g., in a Horiz, it will be one unit, but in a
+/// Wrap, it will be broken up word by word.
+#[derive(Debug)]
+pub struct Text {
+    text: String,
+}
+
+impl Text {
+    pub fn new(text: String) -> Self {
+        Text { text: text }
+    }
+}
+
+impl Content for Text {
+    fn min_width(&self) -> usize {
+        self.text.chars().count()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        view.write_chars(0, 0, self.text.chars(), Style::new())
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.extend(
+            self.text
+                .split_whitespace()
+                .map(|word| Text::new(word.to_string()))
+                .map(|item| Box::new(item) as Box<Content>),
+        );
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/vert.rs
@@ -0,0 +1,39 @@
+use ascii_canvas::AsciiView;
+use super::*;
+
+#[derive(Debug)]
+pub struct Vert {
+    items: Vec<Box<Content>>,
+    separate: usize, // 0 => overlapping, 1 => each on its own line, 2 => paragraphs
+}
+
+impl Vert {
+    pub fn new(items: Vec<Box<Content>>, separate: usize) -> Self {
+        Vert {
+            items: items,
+            separate: separate,
+        }
+    }
+}
+
+impl Content for Vert {
+    fn min_width(&self) -> usize {
+        self.items.iter().map(|c| c.min_width()).max().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        emit_vert(view, &self.items, self.separate);
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.push(self);
+    }
+}
+
+pub fn emit_vert(view: &mut AsciiView, items: &[Box<Content>], separate: usize) {
+    let mut row = 0;
+    for item in items {
+        let (end_row, _) = item.emit_at(view, row, 0);
+        row = end_row + separate;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/message/wrap.rs
@@ -0,0 +1,54 @@
+use ascii_canvas::AsciiView;
+use std::cmp;
+use super::*;
+
+#[derive(Debug)]
+pub struct Wrap {
+    items: Vec<Box<Content>>,
+}
+
+impl Wrap {
+    pub fn new(items: Vec<Box<Content>>) -> Self {
+        let mut wrap_items = vec![];
+        for item in items {
+            item.into_wrap_items(&mut wrap_items);
+        }
+        Wrap { items: wrap_items }
+    }
+}
+
+impl Content for Wrap {
+    fn min_width(&self) -> usize {
+        self.items.iter().map(|c| c.min_width()).max().unwrap()
+    }
+
+    fn emit(&self, view: &mut AsciiView) {
+        let columns = view.columns();
+        let mut row = 0; // current row
+        let mut height = 1; // max height of anything in this row
+        let mut column = 0; // current column in this row
+
+        for item in &self.items {
+            let len = item.min_width();
+
+            // If we don't have enough space for this content,
+            // then move to the next line.
+            if column + len > columns {
+                column = 0;
+                row += height;
+                height = 1;
+            }
+
+            assert!(column + len <= columns);
+
+            let (c_row, c_column) = item.emit_at(view, row, column);
+            assert!(c_column >= column);
+            column = c_column + 2;
+            height = cmp::max(c_row - row + 1, height);
+        }
+    }
+
+    fn into_wrap_items(self: Box<Self>, wrap_items: &mut Vec<Box<Content>>) {
+        wrap_items.extend(self.items); // `items` are already subdivided
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/inline/graph/mod.rs
@@ -0,0 +1,119 @@
+#![allow(dead_code)]
+
+use string_cache::DefaultAtom as Atom;
+use normalize::{NormError, NormResult};
+use petgraph::graph::{Graph, NodeIndex};
+use grammar::consts::INLINE;
+use grammar::repr::*;
+use collections::{map, Map};
+
+#[cfg(test)]
+mod test;
+
+/// Computes the proper order to inline the various nonterminals in
+/// `grammar`. Reports an error if there is an inline
+/// cycle. Otherwise, yields an ordering such that we inline X before
+/// Y if Y references X.  I actually think it doesn't matter what
+/// order we do the inlining, really, but this order seems better
+/// somehow. :) (That is, inline into something before we inline it.)
+pub fn inline_order(grammar: &Grammar) -> NormResult<Vec<NonterminalString>> {
+    let mut graph = NonterminalGraph::new(grammar);
+    graph.create_nodes();
+    graph.add_edges();
+    graph.inline_order()
+}
+
+struct NonterminalGraph<'grammar> {
+    grammar: &'grammar Grammar,
+    graph: Graph<NonterminalString, ()>,
+    nonterminal_map: Map<NonterminalString, NodeIndex>,
+}
+
+#[derive(Copy, Clone)]
+enum WalkState {
+    NotVisited,
+    Visiting,
+    Visited,
+}
+
+impl<'grammar> NonterminalGraph<'grammar> {
+    fn new(grammar: &'grammar Grammar) -> NonterminalGraph<'grammar> {
+        NonterminalGraph {
+            grammar: grammar,
+            graph: Graph::new(),
+            nonterminal_map: map(),
+        }
+    }
+
+    fn create_nodes(&mut self) {
+        let inline = Atom::from(INLINE);
+        for (name, data) in &self.grammar.nonterminals {
+            if data.annotations.iter().any(|a| a.id == inline) {
+                let index = self.graph.add_node(name.clone());
+                self.nonterminal_map.insert(name.clone(), index);
+            }
+        }
+    }
+
+    fn add_edges(&mut self) {
+        for production in self.grammar
+            .nonterminals
+            .values()
+            .flat_map(|d| &d.productions)
+        {
+            let from_index = match self.nonterminal_map.get(&production.nonterminal) {
+                Some(&index) => index,
+                None => continue, // this is not an inlined nonterminal
+            };
+
+            for symbol in &production.symbols {
+                match *symbol {
+                    Symbol::Nonterminal(ref to) => {
+                        if let Some(&to_index) = self.nonterminal_map.get(to) {
+                            self.graph.add_edge(from_index, to_index, ());
+                        }
+                    }
+                    Symbol::Terminal(_) => {}
+                }
+            }
+        }
+    }
+
+    fn inline_order(&self) -> NormResult<Vec<NonterminalString>> {
+        let mut states = vec![WalkState::NotVisited; self.graph.node_count()];
+        let mut result = vec![];
+        for node in self.nonterminal_map.values().cloned() {
+            try!(self.walk(&mut states, &mut result, node));
+        }
+        Ok(result)
+    }
+
+    fn walk(
+        &self,
+        states: &mut Vec<WalkState>,
+        result: &mut Vec<NonterminalString>,
+        source: NodeIndex,
+    ) -> NormResult<()> {
+        let nt = self.graph.node_weight(source).unwrap();
+
+        match states[source.index()] {
+            WalkState::NotVisited => {
+                states[source.index()] = WalkState::Visiting;
+                for target in self.graph.neighbors(source) {
+                    try!(self.walk(states, result, target));
+                }
+                states[source.index()] = WalkState::Visited;
+                result.push(nt.clone());
+                Ok(())
+            }
+            WalkState::Visited => Ok(()),
+            WalkState::Visiting => {
+                return_err!(
+                    self.grammar.nonterminals[&nt].span,
+                    "cyclic inline directive: `{}` would have to be inlined into itself",
+                    nt
+                );
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/inline/graph/test.rs
@@ -0,0 +1,52 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::repr::NonterminalString;
+use normalize::lower_helper;
+use parser;
+use session::Session;
+use super::inline_order;
+
+#[test]
+fn test_inline_self_cycle() {
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    assert!(inline_order(&grammar).is_err());
+}
+
+#[test]
+fn test_inline_cycle_3() {
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = B;
+    #[inline] B: () = C;
+    #[inline] C: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    assert!(inline_order(&grammar).is_err());
+}
+
+#[test]
+fn test_inline_order() {
+    // because C references A, we inline A first.
+    let grammar = parser::parse_grammar(
+        r#"
+    grammar;
+    extern { }
+    #[inline] A: () = B;
+    B: () = C;
+    #[inline] C: () = A;
+"#,
+    ).unwrap();
+    let grammar = lower_helper(&Session::test(), grammar, true).unwrap();
+    let a = NonterminalString(Atom::from("A"));
+    let c = NonterminalString(Atom::from("C"));
+    assert_eq!(inline_order(&grammar).unwrap(), vec![a, c]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/inline/mod.rs
@@ -0,0 +1,156 @@
+/*!
+ * Inlining of nonterminals
+ */
+
+use grammar::repr::*;
+use normalize::NormResult;
+
+mod graph;
+
+#[cfg(test)]
+mod test;
+
+pub fn inline(mut grammar: Grammar) -> NormResult<Grammar> {
+    let order = try!(graph::inline_order(&grammar));
+    for nt in order {
+        inline_nt(&mut grammar, &nt);
+    }
+    Ok(grammar)
+}
+
+fn inline_nt(grammar: &mut Grammar, inline_nt: &NonterminalString) {
+    let inline_productions: Vec<_> = grammar.productions_for(inline_nt).iter().cloned().collect();
+    for (_, data) in &mut grammar.nonterminals {
+        let mut new_productions = vec![];
+        let mut new_action_fn_defns = vec![];
+
+        for into_production in &data.productions {
+            if !into_production
+                .symbols
+                .contains(&Symbol::Nonterminal(inline_nt.clone()))
+            {
+                new_productions.push(into_production.clone());
+                continue;
+            }
+
+            let mut inliner = Inliner {
+                action_fn_defns: &grammar.action_fn_defns,
+                inline_nonterminal: inline_nt.clone(),
+                into_production: into_production,
+                inline_fallible: 0,
+                inline_productions: &inline_productions,
+                new_symbols: vec![],
+                new_productions: &mut new_productions,
+                new_action_fn_defns: &mut new_action_fn_defns,
+            };
+
+            inliner.inline(&into_production.symbols);
+        }
+
+        data.productions = new_productions;
+        grammar.action_fn_defns.extend(new_action_fn_defns);
+    }
+}
+
+struct Inliner<'a> {
+    /// Action fn defns
+    action_fn_defns: &'a [ActionFnDefn],
+
+    /// The nonterminal `A` being inlined
+    inline_nonterminal: NonterminalString,
+
+    /// The full set of productions `A = B C D | E F G` for the
+    /// nonterminal `A` being inlined
+    inline_productions: &'a [Production],
+
+    /// Number of actions that we have inlined for `A` so far which
+    /// have been fallible. IOW, if we are inlining `A` into `X = Y A
+    /// A Z`, and in the first instance of `A` we used a fallible
+    /// action, but the second we used an infallible one, count would
+    /// be 1.
+    inline_fallible: u32,
+
+    /// The `X = Y A Z` being inlined into
+    into_production: &'a Production,
+
+    /// The list of symbols we building up for the new production.
+    /// For example, this would (eventually) contain `Y B C D Z`,
+    /// given our running example.
+    new_symbols: Vec<InlinedSymbol>,
+
+    /// The output vector of all productions for `X` that we have created
+    new_productions: &'a mut Vec<Production>,
+
+    /// Vector of all action fn defns from the grammar.
+    new_action_fn_defns: &'a mut Vec<ActionFnDefn>,
+}
+
+impl<'a> Inliner<'a> {
+    fn inline(&mut self, into_symbols: &[Symbol]) {
+        if into_symbols.is_empty() {
+            // create an action fn for the result of inlining
+            let into_action = self.into_production.action;
+            let into_fallible = self.action_fn_defns[into_action.index()].fallible;
+            let into_ret_type = self.action_fn_defns[into_action.index()].ret_type.clone();
+            let inline_fallible = self.inline_fallible != 0;
+            let index = self.action_fn_defns.len() + self.new_action_fn_defns.len();
+            let action_fn = ActionFn::new(index);
+            let inline_defn = InlineActionFnDefn {
+                action: into_action,
+                symbols: self.new_symbols.clone(),
+            };
+            self.new_action_fn_defns.push(ActionFnDefn {
+                fallible: into_fallible || inline_fallible,
+                ret_type: into_ret_type,
+                kind: ActionFnDefnKind::Inline(inline_defn),
+            });
+            let prod_symbols: Vec<Symbol> = self.new_symbols
+                .iter()
+                .flat_map(|sym| match *sym {
+                    InlinedSymbol::Original(ref s) => vec![s.clone()],
+                    InlinedSymbol::Inlined(_, ref s) => s.clone(),
+                })
+                .collect();
+            self.new_productions.push(Production {
+                nonterminal: self.into_production.nonterminal.clone(),
+                span: self.into_production.span,
+                symbols: prod_symbols,
+                action: action_fn,
+            });
+        } else {
+            let next_symbol = &into_symbols[0];
+            match *next_symbol {
+                Symbol::Nonterminal(ref n) if *n == self.inline_nonterminal => {
+                    // Replace the current symbol with each of the
+                    // `inline_productions` in turn.
+                    for inline_production in self.inline_productions {
+                        // If this production is fallible, increment
+                        // count of fallible actions.
+                        let inline_action = inline_production.action;
+                        let fallible = self.action_fn_defns[inline_action.index()].fallible;
+                        self.inline_fallible += fallible as u32;
+
+                        // Push the symbols of the production inline.
+                        self.new_symbols.push(InlinedSymbol::Inlined(
+                            inline_production.action,
+                            inline_production.symbols.clone(),
+                        ));
+
+                        // Inline remaining symbols:
+                        self.inline(&into_symbols[1..]);
+
+                        // Reset state after we have inlined remaining symbols:
+                        self.new_symbols.pop();
+                        self.inline_fallible -= fallible as u32;
+                    }
+                }
+                _ => {
+                    self.new_symbols
+                        .push(InlinedSymbol::Original(next_symbol.clone()));
+                    self.inline(&into_symbols[1..]);
+                    self.new_symbols.pop();
+                }
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/inline/test.rs
@@ -0,0 +1,102 @@
+use grammar::parse_tree::NonterminalString;
+use grammar::repr::Grammar;
+use string_cache::DefaultAtom as Atom;
+use normalize::{self, NormResult};
+use parser;
+use session::Session;
+
+use super::inline;
+
+fn inlined_grammar(text: &str) -> NormResult<Grammar> {
+    let g = parser::parse_grammar(text).unwrap();
+    let g = normalize::lower_helper(&Session::test(), g, true).unwrap();
+    inline(g)
+}
+
+#[test]
+fn sri() {
+    // This grammar gets a shift-reduce conflict because if the input
+    // is "&" (*) "L", then we see two possibilities, and we must decide
+    // between them:
+    //
+    // "&" (*) "L" E
+    //  |       |  |
+    //  +-------+--|
+    //          |
+    //          E
+    //
+    // or
+    //
+    // "&"      (*) "L"
+    //  |            |
+    //  |  OPT_L     E
+    //  |   |        |
+    //  +---+---+----+
+    //          |
+    //          E
+    //
+    // to some extent this may be a false conflict, in that inlined
+    // rules would address it, but it's an interesting one for
+    // producing a useful error message.
+
+    let grammar = inlined_grammar(
+        r#"
+        grammar;
+
+        E: () = {
+            "L",
+            "&" OPT_L E
+        };
+
+        #[inline] OPT_L: () = {
+            (),
+            "L"
+        };
+    "#,
+    ).unwrap();
+
+    let nt = NonterminalString(Atom::from("E"));
+
+    // After inlining, we expect:
+    //
+    // E = "L"
+    // E = "&" E
+    // E = "&" "L" E
+    //
+    // Note that the `()` also gets inlined.
+    let e_productions = grammar.productions_for(&nt);
+    assert_eq!(e_productions.len(), 3);
+    assert_eq!(format!("{:?}", e_productions[0].symbols), r#"["L"]"#);
+    assert_eq!(format!("{:?}", e_productions[1].symbols), r#"["&", E]"#);
+    assert_eq!(
+        format!("{:?}", e_productions[2].symbols),
+        r#"["&", "L", E]"#
+    );
+}
+
+#[test]
+fn issue_55() {
+    let grammar = inlined_grammar(
+        r#"
+grammar;
+
+pub E: () = {
+    "X" "{" <a:AT*> <e:ET> <b:AT*> "}" => ()
+};
+
+AT: () = {
+    "type" ";" => ()
+};
+
+ET: () = {
+    "enum" "{" "}" => ()
+};
+    "#,
+    ).unwrap();
+    let nt = NonterminalString(Atom::from("E"));
+
+    // The problem in issue #55 was that we would inline both `AT*`
+    // the same way, so we ended up with `E = X { ET }` and `E = X {
+    // AT+ ET AT+ }` but not `E = X { AT+ ET }` or `E = X { ET AT+ }`.
+    assert!(grammar.productions_for(&nt).len() == 4);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/lower/mod.rs
@@ -0,0 +1,459 @@
+//! Lower
+//!
+
+use string_cache::DefaultAtom as Atom;
+use normalize::NormResult;
+use normalize::norm_util::{self, Symbols};
+use grammar::consts::*;
+use grammar::pattern::{Pattern, PatternKind};
+use grammar::parse_tree as pt;
+use grammar::parse_tree::{read_algorithm, InternToken, NonterminalString, Path, TerminalString};
+use grammar::repr as r;
+use session::Session;
+use collections::{map, Map};
+
+pub fn lower(session: &Session, grammar: pt::Grammar, types: r::Types) -> NormResult<r::Grammar> {
+    let state = LowerState::new(session, types, &grammar);
+    state.lower(grammar)
+}
+
+struct LowerState<'s> {
+    session: &'s Session,
+    prefix: String,
+    action_fn_defns: Vec<r::ActionFnDefn>,
+    nonterminals: Map<NonterminalString, r::NonterminalData>,
+    conversions: Vec<(TerminalString, Pattern<r::TypeRepr>)>,
+    intern_token: Option<InternToken>,
+    types: r::Types,
+    uses_error_recovery: bool,
+}
+
+impl<'s> LowerState<'s> {
+    fn new(session: &'s Session, types: r::Types, grammar: &pt::Grammar) -> Self {
+        LowerState {
+            session: session,
+            prefix: grammar.prefix.clone(),
+            action_fn_defns: vec![],
+            nonterminals: map(),
+            conversions: vec![],
+            types: types,
+            intern_token: None,
+            uses_error_recovery: false,
+        }
+    }
+
+    fn lower(mut self, grammar: pt::Grammar) -> NormResult<r::Grammar> {
+        let start_symbols = self.synthesize_start_symbols(&grammar);
+
+        let mut uses = vec![];
+        let mut token_span = None;
+        let internal_token_path = Path {
+            absolute: false,
+            ids: vec![Atom::from("Token")],
+        };
+
+        for item in grammar.items {
+            match item {
+                pt::GrammarItem::Use(data) => {
+                    uses.push(data);
+                }
+
+                pt::GrammarItem::MatchToken(_) => {
+                    // The declarations in the match token are handled
+                    // fully by the `token_check` when it constructs the
+                    //  `InternToken` -- there is nothing left to do here.
+                }
+
+                pt::GrammarItem::InternToken(data) => {
+                    token_span = Some(grammar.span);
+                    let span = grammar.span;
+                    let input_str = r::TypeRepr::Ref {
+                        lifetime: Some(Atom::from(INPUT_LIFETIME)),
+                        mutable: false,
+                        referent: Box::new(r::TypeRepr::Nominal(r::NominalTypeRepr {
+                            path: r::Path::str(),
+                            types: vec![],
+                        })),
+                    };
+                    self.conversions
+                        .extend(data.match_entries.iter().enumerate().map(
+                            |(index, match_entry)| {
+                                let pattern = Pattern {
+                                    span: span,
+                                    kind: PatternKind::TupleStruct(
+                                        internal_token_path.clone(),
+                                        vec![
+                                            Pattern {
+                                                span: span,
+                                                kind: PatternKind::Usize(index),
+                                            },
+                                            Pattern {
+                                                span: span,
+                                                kind: PatternKind::Choose(input_str.clone()),
+                                            },
+                                        ],
+                                    ),
+                                };
+
+                                (match_entry.user_name.clone(), pattern)
+                            },
+                        ));
+                    self.intern_token = Some(data);
+                }
+
+                pt::GrammarItem::ExternToken(data) => {
+                    if let Some(enum_token) = data.enum_token {
+                        token_span = Some(enum_token.type_span);
+                        self.conversions
+                            .extend(enum_token.conversions.iter().map(|conversion| {
+                                (
+                                    conversion.from.clone(),
+                                    conversion.to.map(&mut |t| t.type_repr()),
+                                )
+                            }));
+                    }
+                }
+
+                pt::GrammarItem::Nonterminal(nt) => {
+                    let nt_name = &nt.name;
+                    let productions: Vec<_> = nt.alternatives
+                        .into_iter()
+                        .map(|alt| {
+                            let nt_type = self.types.nonterminal_type(nt_name).clone();
+                            let symbols = self.symbols(&alt.expr.symbols);
+                            let action = self.action_kind(nt_type, &alt.expr, &symbols, alt.action);
+                            r::Production {
+                                nonterminal: nt_name.clone(),
+                                span: alt.span,
+                                symbols: symbols,
+                                action: action,
+                            }
+                        })
+                        .collect();
+                    self.nonterminals.insert(
+                        nt_name.clone(),
+                        r::NonterminalData {
+                            name: nt_name.clone(),
+                            visibility: nt.visibility.clone(),
+                            annotations: nt.annotations,
+                            span: nt.span,
+                            productions: productions,
+                        },
+                    );
+                }
+            }
+        }
+
+        let parameters = grammar
+            .parameters
+            .iter()
+            .map(|p| r::Parameter {
+                name: p.name.clone(),
+                ty: p.ty.type_repr(),
+            })
+            .collect();
+
+        let where_clauses = grammar
+            .where_clauses
+            .iter()
+            .map(|wc| wc.map(pt::TypeRef::type_repr))
+            .collect();
+
+        let mut algorithm = r::Algorithm::default();
+
+        // FIXME Error recovery only works for parse tables so temporarily only generate parse tables for
+        // testing
+        if self.session.unit_test && !self.uses_error_recovery {
+            algorithm.codegen = r::LrCodeGeneration::TestAll;
+        }
+
+        read_algorithm(&grammar.annotations, &mut algorithm);
+
+        let mut all_terminals: Vec<_> = self.conversions
+            .iter()
+            .map(|c| c.0.clone())
+            .chain(if self.uses_error_recovery {
+                Some(TerminalString::Error)
+            } else {
+                None
+            })
+            .collect();
+        all_terminals.sort();
+
+        let terminal_bits: Map<_, _> = all_terminals.iter().cloned().zip(0..).collect();
+
+        Ok(r::Grammar {
+            uses_error_recovery: self.uses_error_recovery,
+            prefix: self.prefix,
+            start_nonterminals: start_symbols,
+            uses: uses,
+            action_fn_defns: self.action_fn_defns,
+            nonterminals: self.nonterminals,
+            conversions: self.conversions.into_iter().collect(),
+            types: self.types,
+            token_span: token_span.unwrap(),
+            type_parameters: grammar.type_parameters,
+            parameters: parameters,
+            where_clauses: where_clauses,
+            algorithm: algorithm,
+            intern_token: self.intern_token,
+            terminals: r::TerminalSet {
+                all: all_terminals,
+                bits: terminal_bits,
+            },
+            module_attributes: grammar.module_attributes,
+        })
+    }
+
+    fn synthesize_start_symbols(
+        &mut self,
+        grammar: &pt::Grammar,
+    ) -> Map<NonterminalString, NonterminalString> {
+        grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .filter(|nt| nt.visibility.is_pub())
+            .map(|nt| {
+                // create a synthetic symbol `__Foo` for each public symbol `Foo`
+                // with a rule like:
+                //
+                //     __Foo = Foo;
+                let fake_name =
+                    pt::NonterminalString(Atom::from(format!("{}{}", self.prefix, nt.name)));
+                let nt_type = self.types.nonterminal_type(&nt.name).clone();
+                self.types.add_type(fake_name.clone(), nt_type.clone());
+                let expr = pt::ExprSymbol {
+                    symbols: vec![
+                        pt::Symbol::new(nt.span, pt::SymbolKind::Nonterminal(fake_name.clone())),
+                    ],
+                };
+                let symbols = vec![r::Symbol::Nonterminal(nt.name.clone())];
+                let action_fn = self.action_fn(nt_type, false, &expr, &symbols, None);
+                let production = r::Production {
+                    nonterminal: fake_name.clone(),
+                    symbols: symbols,
+                    action: action_fn,
+                    span: nt.span,
+                };
+                self.nonterminals.insert(
+                    fake_name.clone(),
+                    r::NonterminalData {
+                        name: fake_name.clone(),
+                        visibility: nt.visibility.clone(),
+                        annotations: vec![],
+                        span: nt.span,
+                        productions: vec![production],
+                    },
+                );
+                (nt.name.clone(), fake_name)
+            })
+            .collect()
+    }
+
+    fn action_kind(
+        &mut self,
+        nt_type: r::TypeRepr,
+        expr: &pt::ExprSymbol,
+        symbols: &[r::Symbol],
+        action: Option<pt::ActionKind>,
+    ) -> r::ActionFn {
+        match action {
+            Some(pt::ActionKind::Lookahead) => self.lookahead_action_fn(),
+            Some(pt::ActionKind::Lookbehind) => self.lookbehind_action_fn(),
+            Some(pt::ActionKind::User(string)) => {
+                self.action_fn(nt_type, false, &expr, &symbols, Some(string))
+            }
+            Some(pt::ActionKind::Fallible(string)) => {
+                self.action_fn(nt_type, true, &expr, &symbols, Some(string))
+            }
+            None => self.action_fn(nt_type, false, &expr, &symbols, None),
+        }
+    }
+
+    fn lookahead_action_fn(&mut self) -> r::ActionFn {
+        let action_fn_defn = r::ActionFnDefn {
+            fallible: false,
+            ret_type: self.types.terminal_loc_type(),
+            kind: r::ActionFnDefnKind::Lookaround(r::LookaroundActionFnDefn::Lookahead),
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn lookbehind_action_fn(&mut self) -> r::ActionFn {
+        let action_fn_defn = r::ActionFnDefn {
+            fallible: false,
+            ret_type: self.types.terminal_loc_type(),
+            kind: r::ActionFnDefnKind::Lookaround(r::LookaroundActionFnDefn::Lookbehind),
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn action_fn(
+        &mut self,
+        nt_type: r::TypeRepr,
+        fallible: bool,
+        expr: &pt::ExprSymbol,
+        symbols: &[r::Symbol],
+        action: Option<String>,
+    ) -> r::ActionFn {
+        let action = match action {
+            Some(s) => s,
+            None => {
+                // If the user declared a type `()`, or we inferred
+                // it, then there is only one possible action that
+                // will type-check (`()`), so supply that. Otherwise,
+                // default is to include all selected items.
+                if nt_type.is_unit() {
+                    format!("()")
+                } else {
+                    format!("(<>)")
+                }
+            }
+        };
+
+        // Note that the action fn takes ALL of the symbols in `expr`
+        // as arguments, and some of them are simply dropped based on
+        // the user's selections.
+
+        // The set of argument types is thus the type of all symbols:
+        let arg_types: Vec<r::TypeRepr> =
+            symbols.iter().map(|s| s.ty(&self.types)).cloned().collect();
+
+        let action_fn_defn = match norm_util::analyze_expr(expr) {
+            Symbols::Named(names) => {
+                // if there are named symbols, we want to give the
+                // arguments the names that the user gave them:
+                let arg_patterns = patterns(
+                    names
+                        .iter()
+                        .map(|&(index, ref name, _)| (index, name.clone())),
+                    symbols.len(),
+                );
+
+                let action = {
+                    match norm_util::check_between_braces(&action) {
+                        norm_util::Presence::None => action,
+                        norm_util::Presence::Normal => {
+                            let name_str: String = {
+                                let name_strs: Vec<_> = names
+                                    .iter()
+                                    .map(|&(_, ref name, _)| name.as_ref())
+                                    .collect();
+                                name_strs.join(", ")
+                            };
+                            action.replace("<>", &name_str)
+                        }
+                        norm_util::Presence::InCurlyBrackets => {
+                            let name_str = {
+                                let name_strs: Vec<_> = names
+                                    .iter()
+                                    .map(|&(_, ref name, _)| format!("{0}:{0}", &*name))
+                                    .collect();
+                                name_strs.join(", ")
+                            };
+                            action.replace("<>", &name_str)
+                        }
+                    }
+                };
+
+                r::ActionFnDefn {
+                    fallible: fallible,
+                    ret_type: nt_type,
+                    kind: r::ActionFnDefnKind::User(r::UserActionFnDefn {
+                        arg_patterns: arg_patterns,
+                        arg_types: arg_types,
+                        code: action,
+                    }),
+                }
+            }
+            Symbols::Anon(indices) => {
+                let names: Vec<_> = (0..indices.len()).map(|i| self.fresh_name(i)).collect();
+                let arg_patterns = patterns(
+                    indices
+                        .iter()
+                        .map(|&(index, _)| index)
+                        .zip(names.iter().cloned()),
+                    symbols.len(),
+                );
+                let name_str = {
+                    let name_strs: Vec<_> = names.iter().map(|n| n.as_ref()).collect();
+                    name_strs.join(", ")
+                };
+                let action = action.replace("<>", &name_str);
+                r::ActionFnDefn {
+                    fallible: fallible,
+                    ret_type: nt_type,
+                    kind: r::ActionFnDefnKind::User(r::UserActionFnDefn {
+                        arg_patterns: arg_patterns,
+                        arg_types: arg_types,
+                        code: action,
+                    }),
+                }
+            }
+        };
+
+        self.add_action_fn(action_fn_defn)
+    }
+
+    fn add_action_fn(&mut self, action_fn_defn: r::ActionFnDefn) -> r::ActionFn {
+        let index = r::ActionFn::new(self.action_fn_defns.len());
+        self.action_fn_defns.push(action_fn_defn);
+        index
+    }
+
+    fn symbols(&mut self, symbols: &[pt::Symbol]) -> Vec<r::Symbol> {
+        symbols.iter().map(|sym| self.symbol(sym)).collect()
+    }
+
+    fn symbol(&mut self, symbol: &pt::Symbol) -> r::Symbol {
+        match symbol.kind {
+            pt::SymbolKind::Terminal(ref id) => r::Symbol::Terminal(id.clone()),
+            pt::SymbolKind::Nonterminal(ref id) => r::Symbol::Nonterminal(id.clone()),
+            pt::SymbolKind::Choose(ref s) | pt::SymbolKind::Name(_, ref s) => self.symbol(s),
+            pt::SymbolKind::Error => {
+                self.uses_error_recovery = true;
+                r::Symbol::Terminal(TerminalString::Error)
+            }
+
+            pt::SymbolKind::Macro(..)
+            | pt::SymbolKind::Repeat(..)
+            | pt::SymbolKind::Expr(..)
+            | pt::SymbolKind::AmbiguousId(_)
+            | pt::SymbolKind::Lookahead
+            | pt::SymbolKind::Lookbehind => unreachable!(
+                "symbol `{}` should have been normalized away by now",
+                symbol
+            ),
+        }
+    }
+
+    fn fresh_name(&self, i: usize) -> Atom {
+        Atom::from(format!("{}{}", self.prefix, i))
+    }
+}
+
+fn patterns<I>(mut chosen: I, num_args: usize) -> Vec<Atom>
+where
+    I: Iterator<Item = (usize, Atom)>,
+{
+    let blank = Atom::from("_");
+
+    let mut next_chosen = chosen.next();
+
+    let result = (0..num_args)
+        .map(|index| match next_chosen.clone() {
+            Some((chosen_index, ref chosen_name)) if chosen_index == index => {
+                next_chosen = chosen.next();
+                chosen_name.clone()
+            }
+            _ => blank.clone(),
+        })
+        .collect();
+
+    debug_assert!(next_chosen.is_none());
+
+    result
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/macro_expand/mod.rs
@@ -0,0 +1,603 @@
+use std::collections::{HashMap, HashSet};
+use string_cache::DefaultAtom as Atom;
+use grammar::consts::INLINE;
+use grammar::parse_tree::{ActionKind, Alternative, Annotation, Condition, ConditionOp, ExprSymbol,
+                          Grammar, GrammarItem, MacroSymbol, NonterminalData, NonterminalString,
+                          Path, RepeatOp, RepeatSymbol, Span, Symbol, SymbolKind, TerminalLiteral,
+                          TerminalString, TypeRef, Visibility};
+use normalize::resolve;
+use normalize::{NormError, NormResult};
+use normalize::norm_util::{self, Symbols};
+use regex::Regex;
+use std::mem;
+
+#[cfg(test)]
+mod test;
+
+pub fn expand_macros(input: Grammar) -> NormResult<Grammar> {
+    let input = try!(resolve::resolve(input));
+
+    let items = input.items;
+
+    let (macro_defs, mut items): (Vec<_>, Vec<_>) =
+        items.into_iter().partition(|mi| mi.is_macro_def());
+
+    let macro_defs: HashMap<_, _> = macro_defs
+        .into_iter()
+        .map(|md| match md {
+            GrammarItem::Nonterminal(ref data) => (data.name.clone(), data.clone()),
+            _ => unreachable!(),
+        })
+        .collect();
+
+    let mut expander = MacroExpander::new(macro_defs);
+    try!(expander.expand(&mut items));
+
+    Ok(Grammar {
+        items: items,
+        ..input
+    })
+}
+
+struct MacroExpander {
+    macro_defs: HashMap<NonterminalString, NonterminalData>,
+    expansion_set: HashSet<NonterminalString>,
+    expansion_stack: Vec<Symbol>,
+}
+
+impl MacroExpander {
+    fn new(macro_defs: HashMap<NonterminalString, NonterminalData>) -> MacroExpander {
+        MacroExpander {
+            macro_defs: macro_defs,
+            expansion_stack: Vec::new(),
+            expansion_set: HashSet::new(),
+        }
+    }
+
+    fn expand(&mut self, items: &mut Vec<GrammarItem>) -> NormResult<()> {
+        let mut counter = 0;
+        loop {
+            // Find any macro uses in items added since last round and
+            // replace them in place with the expanded version:
+            for item in &mut items[counter..] {
+                self.replace_item(item);
+            }
+            counter = items.len();
+
+            // No more expansion to do.
+            if self.expansion_stack.is_empty() {
+                return Ok(());
+            }
+
+            // Drain expansion stack:
+            while let Some(sym) = self.expansion_stack.pop() {
+                match sym.kind {
+                    SymbolKind::Macro(msym) => {
+                        items.push(try!(self.expand_macro_symbol(sym.span, msym)))
+                    }
+                    SymbolKind::Expr(expr) => {
+                        items.push(try!(self.expand_expr_symbol(sym.span, expr)))
+                    }
+                    SymbolKind::Repeat(repeat) => {
+                        items.push(try!(self.expand_repeat_symbol(sym.span, *repeat)))
+                    }
+                    SymbolKind::Lookahead => items.push(try!(self.expand_lookaround_symbol(
+                        sym.span,
+                        "@L",
+                        ActionKind::Lookahead
+                    ))),
+                    SymbolKind::Lookbehind => items.push(try!(self.expand_lookaround_symbol(
+                        sym.span,
+                        "@R",
+                        ActionKind::Lookbehind
+                    ))),
+                    _ => assert!(false, "don't know how to expand `{:?}`", sym),
+                }
+            }
+        }
+    }
+
+    fn replace_item(&mut self, item: &mut GrammarItem) {
+        match *item {
+            GrammarItem::MatchToken(..) => {}
+            GrammarItem::ExternToken(..) => {}
+            GrammarItem::InternToken(..) => {}
+            GrammarItem::Use(..) => {}
+            GrammarItem::Nonterminal(ref mut data) => {
+                // Should not encounter macro definitions here,
+                // they've already been siphoned off.
+                assert!(!data.is_macro_def());
+
+                for alternative in &mut data.alternatives {
+                    self.replace_symbols(&mut alternative.expr.symbols);
+                }
+            }
+        }
+    }
+
+    fn replace_symbols(&mut self, symbols: &mut [Symbol]) {
+        for symbol in symbols {
+            self.replace_symbol(symbol);
+        }
+    }
+
+    fn replace_symbol(&mut self, symbol: &mut Symbol) {
+        match symbol.kind {
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+            SymbolKind::Macro(ref mut m) => for sym in &mut m.args {
+                self.replace_symbol(sym);
+            },
+            SymbolKind::Expr(ref mut expr) => {
+                self.replace_symbols(&mut expr.symbols);
+            }
+            SymbolKind::Repeat(ref mut repeat) => {
+                self.replace_symbol(&mut repeat.symbol);
+            }
+            SymbolKind::Terminal(_) | SymbolKind::Nonterminal(_) | SymbolKind::Error => {
+                return;
+            }
+            SymbolKind::Choose(ref mut sym) | SymbolKind::Name(_, ref mut sym) => {
+                self.replace_symbol(sym);
+                return;
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind => {}
+        }
+
+        // only symbols we intend to expand fallthrough to here
+
+        let key = NonterminalString(Atom::from(symbol.canonical_form()));
+        let replacement = Symbol {
+            span: symbol.span,
+            kind: SymbolKind::Nonterminal(key.clone()),
+        };
+        let to_expand = mem::replace(symbol, replacement);
+        if self.expansion_set.insert(key) {
+            self.expansion_stack.push(to_expand);
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Macro expansion
+
+    fn expand_macro_symbol(&mut self, span: Span, msym: MacroSymbol) -> NormResult<GrammarItem> {
+        let msym_name = NonterminalString(Atom::from(msym.canonical_form()));
+
+        let mdef = match self.macro_defs.get(&msym.name) {
+            Some(v) => v,
+            None => return_err!(span, "no macro definition found for `{}`", msym.name),
+        };
+
+        if mdef.args.len() != msym.args.len() {
+            return_err!(
+                span,
+                "expected {} arguments to `{}` but found {}",
+                mdef.args.len(),
+                msym.name,
+                msym.args.len()
+            );
+        }
+
+        let args: HashMap<NonterminalString, SymbolKind> = mdef.args
+            .iter()
+            .cloned()
+            .zip(msym.args.into_iter().map(|s| s.kind))
+            .collect();
+
+        let type_decl = mdef.type_decl
+            .as_ref()
+            .map(|tr| self.macro_expand_type_ref(&args, tr));
+
+        // due to the use of `try!`, it's a bit awkward to write this with an iterator
+        let mut alternatives: Vec<Alternative> = vec![];
+
+        for alternative in &mdef.alternatives {
+            if !try!(self.evaluate_cond(&args, &alternative.condition)) {
+                continue;
+            }
+            alternatives.push(Alternative {
+                span: span,
+                expr: self.macro_expand_expr_symbol(&args, &alternative.expr),
+                condition: None,
+                action: alternative.action.clone(),
+            });
+        }
+
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: mdef.visibility.clone(),
+            span: span,
+            name: msym_name,
+            annotations: mdef.annotations.clone(),
+            args: vec![],
+            type_decl: type_decl,
+            alternatives: alternatives,
+        }))
+    }
+
+    fn macro_expand_type_refs(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        type_refs: &[TypeRef],
+    ) -> Vec<TypeRef> {
+        type_refs
+            .iter()
+            .map(|tr| self.macro_expand_type_ref(args, tr))
+            .collect()
+    }
+
+    fn macro_expand_type_ref(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        type_ref: &TypeRef,
+    ) -> TypeRef {
+        match *type_ref {
+            TypeRef::Tuple(ref trs) => TypeRef::Tuple(self.macro_expand_type_refs(args, trs)),
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => TypeRef::Nominal {
+                path: path.clone(),
+                types: self.macro_expand_type_refs(args, types),
+            },
+            TypeRef::Lifetime(ref id) => TypeRef::Lifetime(id.clone()),
+            TypeRef::OfSymbol(ref sym) => TypeRef::OfSymbol(sym.clone()),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => TypeRef::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(self.macro_expand_type_ref(args, referent)),
+            },
+            TypeRef::Id(ref id) => match args.get(&NonterminalString(id.clone())) {
+                Some(sym) => TypeRef::OfSymbol(sym.clone()),
+                None => TypeRef::Nominal {
+                    path: Path::from_id(id.clone()),
+                    types: vec![],
+                },
+            },
+        }
+    }
+
+    fn evaluate_cond(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        opt_cond: &Option<Condition>,
+    ) -> NormResult<bool> {
+        if let Some(ref c) = *opt_cond {
+            match args[&c.lhs] {
+                SymbolKind::Terminal(TerminalString::Literal(TerminalLiteral::Quoted(ref lhs))) => {
+                    match c.op {
+                        ConditionOp::Equals => Ok(lhs == &c.rhs),
+                        ConditionOp::NotEquals => Ok(lhs != &c.rhs),
+                        ConditionOp::Match => self.re_match(c.span, lhs, &c.rhs),
+                        ConditionOp::NotMatch => Ok(!try!(self.re_match(c.span, lhs, &c.rhs))),
+                    }
+                }
+                ref lhs => {
+                    return_err!(
+                        c.span,
+                        "invalid condition LHS `{}`, expected a string literal, not `{}`",
+                        c.lhs,
+                        lhs
+                    );
+                }
+            }
+        } else {
+            Ok(true)
+        }
+    }
+
+    fn re_match(&self, span: Span, lhs: &Atom, regex: &Atom) -> NormResult<bool> {
+        let re = match Regex::new(&regex) {
+            Ok(re) => re,
+            Err(err) => return_err!(span, "invalid regular expression `{}`: {}", regex, err),
+        };
+        Ok(re.is_match(&lhs))
+    }
+
+    fn macro_expand_symbols(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        expr: &[Symbol],
+    ) -> Vec<Symbol> {
+        expr.iter()
+            .map(|s| self.macro_expand_symbol(args, s))
+            .collect()
+    }
+
+    fn macro_expand_expr_symbol(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        expr: &ExprSymbol,
+    ) -> ExprSymbol {
+        ExprSymbol {
+            symbols: self.macro_expand_symbols(args, &expr.symbols),
+        }
+    }
+
+    fn macro_expand_symbol(
+        &self,
+        args: &HashMap<NonterminalString, SymbolKind>,
+        symbol: &Symbol,
+    ) -> Symbol {
+        let kind = match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                SymbolKind::Expr(self.macro_expand_expr_symbol(args, expr))
+            }
+            SymbolKind::Terminal(ref id) => SymbolKind::Terminal(id.clone()),
+            SymbolKind::Nonterminal(ref id) => match args.get(id) {
+                Some(sym) => sym.clone(),
+                None => SymbolKind::Nonterminal(id.clone()),
+            },
+            SymbolKind::Macro(ref msym) => SymbolKind::Macro(MacroSymbol {
+                name: msym.name.clone(),
+                args: self.macro_expand_symbols(args, &msym.args),
+            }),
+            SymbolKind::Repeat(ref r) => SymbolKind::Repeat(Box::new(RepeatSymbol {
+                op: r.op,
+                symbol: self.macro_expand_symbol(args, &r.symbol),
+            })),
+            SymbolKind::Choose(ref sym) => {
+                SymbolKind::Choose(Box::new(self.macro_expand_symbol(args, sym)))
+            }
+            SymbolKind::Name(ref id, ref sym) => {
+                SymbolKind::Name(id.clone(), Box::new(self.macro_expand_symbol(args, sym)))
+            }
+            SymbolKind::Lookahead => SymbolKind::Lookahead,
+            SymbolKind::Lookbehind => SymbolKind::Lookbehind,
+            SymbolKind::Error => SymbolKind::Error,
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+        };
+
+        Symbol {
+            span: symbol.span,
+            kind: kind,
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Expr expansion
+
+    fn expand_expr_symbol(&mut self, span: Span, expr: ExprSymbol) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(expr.canonical_form()));
+
+        let ty_ref =
+            match norm_util::analyze_expr(&expr) {
+                Symbols::Named(names) => {
+                    let (_, ref ex_id, ex_sym) = names[0];
+                    return_err!(
+                    span,
+                    "named symbols like `{}:{}` are only allowed at the top-level of a nonterminal",
+                    ex_id, ex_sym)
+                }
+                Symbols::Anon(syms) => maybe_tuple(
+                    syms.into_iter()
+                        .map(|(_, s)| TypeRef::OfSymbol(s.kind.clone()))
+                        .collect(),
+                ),
+            };
+
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: Visibility::Priv,
+            span: span,
+            name: name,
+            annotations: inline(span),
+            args: vec![],
+            type_decl: Some(ty_ref),
+            alternatives: vec![
+                Alternative {
+                    span: span,
+                    expr: expr,
+                    condition: None,
+                    action: action("(<>)"),
+                },
+            ],
+        }))
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Expr expansion
+
+    fn expand_repeat_symbol(
+        &mut self,
+        span: Span,
+        repeat: RepeatSymbol,
+    ) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(repeat.canonical_form()));
+        let v = Atom::from("v");
+        let e = Atom::from("e");
+
+        let base_symbol_ty = TypeRef::OfSymbol(repeat.symbol.kind.clone());
+
+        match repeat.op {
+            RepeatOp::Star => {
+                let path = Path::vec();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                let plus_repeat = Box::new(RepeatSymbol {
+                    op: RepeatOp::Plus,
+                    symbol: repeat.symbol.clone(),
+                });
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name,
+                    annotations: inline(span),
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X* =
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol { symbols: vec![] },
+                            condition: None,
+                            action: action("vec![]"),
+                        },
+                        // X* = <v:X+>
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(
+                                            v,
+                                            Box::new(Symbol::new(
+                                                span,
+                                                SymbolKind::Repeat(plus_repeat),
+                                            )),
+                                        ),
+                                    ),
+                                ],
+                            },
+                            condition: None,
+                            action: action("v"),
+                        },
+                    ],
+                }))
+            }
+
+            RepeatOp::Plus => {
+                let path = Path::vec();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name.clone(),
+                    annotations: vec![],
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X+ = X
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![repeat.symbol.clone()],
+                            },
+                            condition: None,
+                            action: action("vec![<>]"),
+                        },
+                        // X+ = <v:X+> <e:X>
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(
+                                            v,
+                                            Box::new(Symbol::new(
+                                                span,
+                                                SymbolKind::Nonterminal(name),
+                                            )),
+                                        ),
+                                    ),
+                                    Symbol::new(
+                                        span,
+                                        SymbolKind::Name(e, Box::new(repeat.symbol.clone())),
+                                    ),
+                                ],
+                            },
+                            condition: None,
+                            action: action("{ let mut v = v; v.push(e); v }"),
+                        },
+                    ],
+                }))
+            }
+
+            RepeatOp::Question => {
+                let path = Path::option();
+                let ty_ref = TypeRef::Nominal {
+                    path: path,
+                    types: vec![base_symbol_ty],
+                };
+
+                Ok(GrammarItem::Nonterminal(NonterminalData {
+                    visibility: Visibility::Priv,
+                    span: span,
+                    name: name,
+                    annotations: inline(span),
+                    args: vec![],
+                    type_decl: Some(ty_ref),
+                    alternatives: vec![
+                        // X? = X => Some(<>)
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol {
+                                symbols: vec![repeat.symbol.clone()],
+                            },
+                            condition: None,
+                            action: action("Some(<>)"),
+                        },
+                        // X? = { => None; }
+                        Alternative {
+                            span: span,
+                            expr: ExprSymbol { symbols: vec![] },
+                            condition: None,
+                            action: action("None"),
+                        },
+                    ],
+                }))
+            }
+        }
+    }
+
+    fn expand_lookaround_symbol(
+        &mut self,
+        span: Span,
+        name: &str,
+        action: ActionKind,
+    ) -> NormResult<GrammarItem> {
+        let name = NonterminalString(Atom::from(name));
+        Ok(GrammarItem::Nonterminal(NonterminalData {
+            visibility: Visibility::Priv,
+            span: span,
+            name: name,
+            annotations: inline(span),
+            args: vec![],
+            type_decl: None,
+            alternatives: vec![
+                Alternative {
+                    span: span,
+                    expr: ExprSymbol { symbols: vec![] },
+                    condition: None,
+                    action: Some(action),
+                },
+            ],
+        }))
+    }
+}
+
+fn maybe_tuple(v: Vec<TypeRef>) -> TypeRef {
+    if v.len() == 1 {
+        v.into_iter().next().unwrap()
+    } else {
+        TypeRef::Tuple(v)
+    }
+}
+
+fn action(s: &str) -> Option<ActionKind> {
+    Some(ActionKind::User(s.to_string()))
+}
+
+fn inline(span: Span) -> Vec<Annotation> {
+    vec![
+        Annotation {
+            id_span: span,
+            id: Atom::from(INLINE),
+        },
+    ]
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/macro_expand/test.rs
@@ -0,0 +1,112 @@
+use parser;
+use test_util::compare;
+
+use super::expand_macros;
+
+#[test]
+fn test_comma() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    Comma<E>: Vec<E> =
+       <v:(<E> ",")*> <e:E?> =>
+           v.into_iter().chain(e.into_iter()).collect();
+
+    Ids = Comma<"Id">;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r##"
+grammar;
+    Ids = `Comma<"Id">`;
+
+    `Comma<"Id">`: Vec<#"Id"#> =
+        <v:`(<"Id"> ",")*`> <e:`"Id"?`> => v.into_iter().chain(e.into_iter()).collect();
+
+    #[inline]
+    `"Id"?`: ::std::option::Option<#"Id"#> = {
+        "Id" => Some(<>),
+        => None
+    };
+
+    #[inline]
+    `(<"Id"> ",")*`: ::std::vec::Vec<#`(<"Id"> ",")`#> = {
+        => vec![],
+        <v:`(<"Id"> ",")+`> => v,
+    };
+
+    #[inline]
+    `(<"Id"> ",")`: #"Id"# = {
+        <"Id"> "," => (<>),
+    };
+
+    `(<"Id"> ",")+`: ::std::vec::Vec<#`(<"Id"> ",")`#> = {
+        `(<"Id"> ",")` => vec![<>],
+        <v:`(<"Id"> ",")+`> <e:`(<"Id"> ",")`> => { let mut v = v; v.push(e); v },
+    };
+"##,
+    ).unwrap();
+
+    compare(actual, expected);
+}
+
+#[test]
+fn test_if_match() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    Expr<E> = {
+       "A" if E == "A*C",
+       "B" if E ~~ "^A*C$",
+       "C" if E != "A*C",
+       "D" if E !~ "^A*C$"
+    };
+
+    Expr1 = Expr<"A*C">;
+    Expr2 = Expr<"AAC">;
+    Expr3 = Expr<"ABC">;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r#"
+grammar;
+    Expr1 = `Expr<"A*C">`;
+    Expr2 = `Expr<"AAC">`;
+    Expr3 = `Expr<"ABC">`;
+
+    `Expr<"ABC">` = { "C", "D" };
+    `Expr<"AAC">` = { "B", "C" };
+    `Expr<"A*C">` = { "A", "D" };
+"#,
+    ).unwrap();
+
+    compare(actual, expected);
+}
+
+#[test]
+fn test_lookahead() {
+    let grammar = parser::parse_grammar(
+        r#"
+        grammar;
+        Expr = @L;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+
+    let expected = parser::parse_grammar(
+        r#"
+        grammar;
+        Expr = `@L`;
+        #[inline] `@L` = =>@L;
+"#,
+    ).unwrap();
+
+    compare(actual, expected);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/mod.rs
@@ -0,0 +1,119 @@
+/*!
+ * Normalization processes a parse tree until it is in suitable form to
+ * be converted to the more canonical form. This is done as a series of
+ * passes, each contained in their own module below.
+ */
+
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use session::Session;
+
+pub type NormResult<T> = Result<T, NormError>;
+
+#[derive(Clone, Debug)]
+pub struct NormError {
+    pub message: String,
+    pub span: pt::Span,
+}
+
+macro_rules! return_err {
+    ($span: expr, $($args:expr),+) => {
+        return Err(NormError {
+            message: format!($($args),+),
+            span: $span
+        });
+    }
+}
+
+pub fn normalize(session: &Session, grammar: pt::Grammar) -> NormResult<r::Grammar> {
+    normalize_helper(session, grammar, true)
+}
+
+/// for unit tests, it is convenient to skip the validation step, and supply a dummy session
+#[cfg(test)]
+pub fn normalize_without_validating(grammar: pt::Grammar) -> NormResult<r::Grammar> {
+    normalize_helper(&Session::new(), grammar, false)
+}
+
+fn normalize_helper(
+    session: &Session,
+    grammar: pt::Grammar,
+    validate: bool,
+) -> NormResult<r::Grammar> {
+    let grammar = try!(lower_helper(session, grammar, validate));
+    let grammar = profile!(session, "Inlining", try!(inline::inline(grammar)));
+    Ok(grammar)
+}
+
+fn lower_helper(session: &Session, grammar: pt::Grammar, validate: bool) -> NormResult<r::Grammar> {
+    profile!(
+        session,
+        "Grammar validation",
+        if validate {
+            try!(prevalidate::validate(&grammar));
+        }
+    );
+    let grammar = profile!(
+        session,
+        "Grammar resolution",
+        try!(resolve::resolve(grammar))
+    );
+    let grammar = profile!(
+        session,
+        "Macro expansion",
+        try!(macro_expand::expand_macros(grammar))
+    );
+    let grammar = profile!(session, "Token check", try!(token_check::validate(grammar)));
+    let types = profile!(session, "Infer types", try!(tyinfer::infer_types(&grammar)));
+    let grammar = profile!(
+        session,
+        "Lowering",
+        try!(lower::lower(session, grammar, types))
+    );
+    Ok(grammar)
+}
+
+// These are executed *IN ORDER*:
+
+// Check most safety conditions.
+mod prevalidate;
+
+// Resolve identifiers into terminals/nonterminals etc.
+mod resolve;
+
+// Expands macros and expressions
+//
+//     X = ...1 Comma<X> (X Y Z) ...2
+//
+// to
+//
+//     X = ...1 `Comma<X>` `(X Y Z)` ...2
+//     `Comma_X`: Vec<<X>> = ...;
+//     `(X Y Z)` = X Y Z;
+//
+// AFTER THIS POINT: No more macros, macro references, guarded
+// alternatives, repeats, or expr symbols, though type indirections
+// may occur.
+mod macro_expand;
+
+// Check if there is an extern token and all terminals have have a
+// conversion; if no extern token, synthesize an intern token.
+mod token_check;
+
+// Computes types where the user omitted them (or from macro
+// byproducts).
+//
+// AFTER THIS POINT: there is a separate `repr::Types` table
+// providing all nonterminals with an explicit type.
+mod tyinfer;
+
+// Lowers the parse tree to the repr notation.
+mod lower;
+
+// Inline nonterminals that have requested it.
+mod inline;
+
+///////////////////////////////////////////////////////////////////////////
+// Shared routines
+
+mod norm_util;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/norm_util.rs
@@ -0,0 +1,134 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::{ActionKind, Alternative, ExprSymbol, Symbol, SymbolKind};
+
+#[derive(Debug)]
+pub enum AlternativeAction<'a> {
+    User(&'a ActionKind),
+    Default(Symbols<'a>),
+}
+
+#[derive(Debug)]
+pub enum Symbols<'a> {
+    Named(Vec<(usize, Atom, &'a Symbol)>),
+    Anon(Vec<(usize, &'a Symbol)>),
+}
+
+pub fn analyze_action<'a>(alt: &'a Alternative) -> AlternativeAction<'a> {
+    // We can't infer types for alternatives with actions
+    if let Some(ref code) = alt.action {
+        return AlternativeAction::User(code);
+    }
+
+    AlternativeAction::Default(analyze_expr(&alt.expr))
+}
+
+pub fn analyze_expr<'a>(expr: &'a ExprSymbol) -> Symbols<'a> {
+    // First look for named symbols.
+    let named_symbols: Vec<_> = expr.symbols
+        .iter()
+        .enumerate()
+        .filter_map(|(idx, sym)| match sym.kind {
+            SymbolKind::Name(ref id, ref sub) => Some((idx, id.clone(), &**sub)),
+            _ => None,
+        })
+        .collect();
+    if !named_symbols.is_empty() {
+        return Symbols::Named(named_symbols);
+    }
+
+    // Otherwise, make a tuple of the items they chose with `<>`.
+    let chosen_symbol_types: Vec<_> = expr.symbols
+        .iter()
+        .enumerate()
+        .filter_map(|(idx, sym)| match sym.kind {
+            SymbolKind::Choose(ref sub) => Some((idx, &**sub)),
+            _ => None,
+        })
+        .collect();
+    if !chosen_symbol_types.is_empty() {
+        return Symbols::Anon(chosen_symbol_types);
+    }
+
+    // If they didn't choose anything with `<>`, make a tuple of everything.
+    Symbols::Anon(expr.symbols.iter().enumerate().collect())
+}
+
+#[derive(Copy, Clone, PartialEq, Eq, Debug)]
+pub enum Presence {
+    None,
+    InCurlyBrackets,
+    Normal,
+}
+
+impl Presence {
+    pub fn is_in_curly_brackets(&self) -> bool {
+        *self == Presence::InCurlyBrackets
+    }
+}
+
+pub fn check_between_braces(action: &str) -> Presence {
+    if let Some(funky_index) = action.find("<>") {
+        let (before, after) = {
+            let (before, after) = action.split_at(funky_index);
+            (before.trim(), after[2..].trim())
+        };
+
+        let last_before = before.chars().last();
+        let next_after = after.chars().next();
+        if let (Some('{'), Some('}')) = (last_before, next_after) {
+            Presence::InCurlyBrackets
+        } else {
+            Presence::Normal
+        }
+    } else {
+        Presence::None
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn detecting_normal_funky_expression() {
+        assert_eq!(Presence::Normal, check_between_braces("<>"));
+        assert_eq!(Presence::Normal, check_between_braces("ble <> blaa"));
+        assert_eq!(Presence::Normal, check_between_braces("ble <> } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <> } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <>} b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ e <> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{ <> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{<> e } b"));
+        assert_eq!(Presence::Normal, check_between_braces("bl{<>"));
+        assert_eq!(Presence::Normal, check_between_braces("<>}"));
+    }
+
+    #[test]
+    fn detecting_nopresence_of_funky_expression() {
+        assert_eq!(Presence::None, check_between_braces("< >"));
+        assert_eq!(Presence::None, check_between_braces("ble <b> blaa"));
+    }
+
+    #[test]
+    fn detecting_incurlybrackets_funky_expression() {
+        assert_eq!(Presence::InCurlyBrackets, check_between_braces("{<>}"));
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("ble{<> }blaa")
+        );
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("ble{ <> } b")
+        );
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("bl{         <>} b")
+        );
+        assert_eq!(Presence::InCurlyBrackets, check_between_braces("bl{<>} b"));
+        assert_eq!(
+            Presence::InCurlyBrackets,
+            check_between_braces("bl{<>         } b")
+        );
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/prevalidate/mod.rs
@@ -0,0 +1,296 @@
+//! Validate checks some basic safety conditions.
+
+use super::{NormError, NormResult};
+use super::norm_util::{self, Symbols};
+
+use grammar::consts::*;
+use grammar::parse_tree::*;
+use grammar::repr as r;
+use string_cache::DefaultAtom as Atom;
+use collections::{set, Multimap};
+use util::Sep;
+
+#[cfg(test)]
+mod test;
+
+pub fn validate(grammar: &Grammar) -> NormResult<()> {
+    let match_token: Option<&MatchToken> = grammar
+        .items
+        .iter()
+        .filter_map(|item| item.as_match_token())
+        .next();
+
+    let extern_token: Option<&ExternToken> = grammar
+        .items
+        .iter()
+        .filter_map(|item| item.as_extern_token())
+        .next();
+
+    let validator = Validator {
+        grammar: grammar,
+        match_token: match_token,
+        extern_token: extern_token,
+    };
+
+    validator.validate()
+}
+
+struct Validator<'grammar> {
+    grammar: &'grammar Grammar,
+    match_token: Option<&'grammar MatchToken>,
+    extern_token: Option<&'grammar ExternToken>,
+}
+
+impl<'grammar> Validator<'grammar> {
+    fn validate(&self) -> NormResult<()> {
+        let allowed_names = vec![
+            Atom::from(LALR),
+            Atom::from(TABLE_DRIVEN),
+            Atom::from(RECURSIVE_ASCENT),
+            Atom::from(TEST_ALL),
+        ];
+        for annotation in &self.grammar.annotations {
+            if !allowed_names.contains(&annotation.id) {
+                return_err!(
+                    annotation.id_span,
+                    "unrecognized annotation `{}`",
+                    annotation.id
+                );
+            }
+        }
+
+        for item in &self.grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+
+                GrammarItem::MatchToken(ref data) => {
+                    if data.span != self.match_token.unwrap().span {
+                        return_err!(data.span, "multiple match definitions are not permitted");
+                    }
+
+                    // Only error if a custom lexer is specified, having a custom types is ok
+                    if let Some(d) = self.extern_token {
+                        if d.enum_token.is_some() {
+                            return_err!(
+                                d.span,
+                                "extern (with custom tokens) and match definitions are mutually exclusive");
+                        }
+                    }
+
+                    // Ensure that the catch all is final item of final block
+                    for (contents_idx, match_contents) in data.contents.iter().enumerate() {
+                        for (item_idx, item) in match_contents.items.iter().enumerate() {
+                            if item.is_catch_all()
+                                && (contents_idx != &data.contents.len() - 1
+                                    || item_idx != &match_contents.items.len() - 1)
+                            {
+                                return_err!(item.span(), "Catch all must be final item");
+                            } else {
+                                println!("ok");
+                            }
+                        }
+                    }
+                }
+
+                GrammarItem::ExternToken(ref data) => {
+                    if data.span != self.extern_token.unwrap().span {
+                        return_err!(data.span, "multiple extern definitions are not permitted");
+                    }
+
+                    // Only error if a custom lexer is specified, having a custom types is ok
+                    if let Some(d) = self.match_token {
+                        if data.enum_token.is_some() {
+                            return_err!(
+                                d.span,
+                                "match and extern (with custom tokens) definitions are mutually exclusive");
+                        }
+                    }
+
+                    let allowed_names = vec![Atom::from(LOCATION), Atom::from(ERROR)];
+                    let mut new_names = set();
+                    for associated_type in &data.associated_types {
+                        if !allowed_names.contains(&associated_type.type_name) {
+                            return_err!(
+                                associated_type.type_span,
+                                "associated type `{}` not recognized, \
+                                 try one of the following: {}",
+                                associated_type.type_name,
+                                Sep(", ", &allowed_names)
+                            );
+                        } else if !new_names.insert(associated_type.type_name.clone()) {
+                            return_err!(
+                                associated_type.type_span,
+                                "associated type `{}` already specified",
+                                associated_type.type_name
+                            );
+                        }
+                    }
+                }
+                GrammarItem::Nonterminal(ref data) => {
+                    if data.visibility.is_pub() && !data.args.is_empty() {
+                        return_err!(data.span, "macros cannot be marked public");
+                    }
+                    let inline_annotation = Atom::from(INLINE);
+                    let known_annotations = vec![inline_annotation.clone()];
+                    let mut found_annotations = set();
+                    for annotation in &data.annotations {
+                        if !known_annotations.contains(&annotation.id) {
+                            return_err!(
+                                annotation.id_span,
+                                "unrecognized annotation `{}`",
+                                annotation.id
+                            );
+                        } else if !found_annotations.insert(annotation.id.clone()) {
+                            return_err!(
+                                annotation.id_span,
+                                "duplicate annotation `{}`",
+                                annotation.id
+                            );
+                        } else if annotation.id == inline_annotation && data.visibility.is_pub() {
+                            return_err!(
+                                annotation.id_span,
+                                "public items cannot be marked #[inline]"
+                            );
+                        }
+                    }
+
+                    for alternative in &data.alternatives {
+                        try!(self.validate_alternative(alternative));
+                    }
+                }
+                GrammarItem::InternToken(..) => {}
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_alternative(&self, alternative: &Alternative) -> NormResult<()> {
+        try!(self.validate_expr(&alternative.expr));
+
+        match norm_util::analyze_expr(&alternative.expr) {
+            Symbols::Named(syms) => {
+                if alternative.action.is_none() {
+                    let sym = syms.iter().map(|&(_, _, sym)| sym).next().unwrap();
+                    return_err!(
+                        sym.span,
+                        "named symbols (like `{}`) require a custom action",
+                        sym
+                    );
+                }
+            }
+            Symbols::Anon(_) => {
+                let empty_string = "".to_string();
+                let action = {
+                    match alternative.action {
+                        Some(ActionKind::User(ref action)) => action,
+                        Some(ActionKind::Fallible(ref action)) => action,
+                        _ => &empty_string,
+                    }
+                };
+                if norm_util::check_between_braces(action).is_in_curly_brackets() {
+                    return_err!(
+                        alternative.span,
+                        "Using `<>` between curly braces (e.g., `{{<>}}`) only works when your parsed values have been given names (e.g., `<x:Foo>`, not just `<Foo>`)");
+                }
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_expr(&self, expr: &ExprSymbol) -> NormResult<()> {
+        for symbol in &expr.symbols {
+            try!(self.validate_symbol(symbol));
+        }
+
+        let chosen: Vec<&Symbol> = expr.symbols
+            .iter()
+            .filter(|sym| match sym.kind {
+                SymbolKind::Choose(_) => true,
+                _ => false,
+            })
+            .collect();
+
+        let named: Multimap<Atom, Vec<&Symbol>> = expr.symbols
+            .iter()
+            .filter_map(|sym| match sym.kind {
+                SymbolKind::Name(ref nt, _) => Some((nt.clone(), sym)),
+                _ => None,
+            })
+            .collect();
+
+        if !chosen.is_empty() && !named.is_empty() {
+            return_err!(
+                chosen[0].span,
+                "anonymous symbols like this one cannot be combined with \
+                 named symbols like `{}`",
+                named.into_iter().next().unwrap().1[0]
+            );
+        }
+
+        for (name, syms) in named.into_iter() {
+            if syms.len() > 1 {
+                return_err!(
+                    syms[1].span,
+                    "multiple symbols named `{}` are not permitted",
+                    name
+                );
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_symbol(&self, symbol: &Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                try!(self.validate_expr(expr));
+            }
+            SymbolKind::AmbiguousId(_) => { /* see resolve */ }
+            SymbolKind::Terminal(_) => { /* see postvalidate! */ }
+            SymbolKind::Nonterminal(_) => { /* see resolve */ }
+            SymbolKind::Error => {
+                let mut algorithm = r::Algorithm::default();
+                read_algorithm(&self.grammar.annotations, &mut algorithm);
+                if algorithm.codegen == r::LrCodeGeneration::RecursiveAscent {
+                    return_err!(
+                        symbol.span,
+                        "error recovery is not yet supported by recursive ascent parsers"
+                    );
+                }
+            }
+            SymbolKind::Macro(ref msym) => {
+                debug_assert!(msym.args.len() > 0);
+                for arg in &msym.args {
+                    try!(self.validate_symbol(arg));
+                }
+            }
+            SymbolKind::Repeat(ref repeat) => {
+                try!(self.validate_symbol(&repeat.symbol));
+            }
+            SymbolKind::Choose(ref sym) | SymbolKind::Name(_, ref sym) => {
+                try!(self.validate_symbol(sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind => {
+                // if using an internal tokenizer, lookahead/lookbehind are ok.
+                if let Some(extern_token) = self.extern_token {
+                    if extern_token.enum_token.is_some() {
+                        // otherwise, the Location type must be specified.
+                        let loc = Atom::from(LOCATION);
+                        if self.extern_token.unwrap().associated_type(loc).is_none() {
+                            return_err!(
+                                symbol.span,
+                                "lookahead/lookbehind require you to declare the type of \
+                                 a location; add a `type {} = ..` statement to the extern token \
+                                 block",
+                                LOCATION
+                            );
+                        }
+                    }
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/prevalidate/test.rs
@@ -0,0 +1,151 @@
+use parser;
+use test_util;
+
+fn check_err(expected_err: &str, grammar: &str, span: &str) {
+    let parsed_grammar = parser::parse_grammar(&grammar).unwrap();
+    let err = super::validate(&parsed_grammar).unwrap_err();
+    test_util::check_norm_err(expected_err, span, err);
+}
+
+#[test]
+fn named_symbols() {
+    check_err(
+        r#"named symbols \(like `"Num"`\) require a custom action"#,
+        r#"grammar; Term = { <n:"Num"> };"#,
+        r#"                     ~~~~~    "#,
+    );
+}
+
+#[test]
+fn bad_assoc_type() {
+    check_err(
+        r#"associated type `Foo` not recognized"#,
+        r#"grammar; extern { type Foo = i32; enum Tok { } }"#,
+        r#"                       ~~~                      "#,
+    );
+}
+
+#[test]
+fn dup_assoc_type() {
+    check_err(
+        r#"associated type `Location` already specified"#,
+        r#"grammar; extern { type Location = i32; type Location = u32; enum Tok { } }"#,
+        r#"                                            ~~~~~~~~                      "#,
+    );
+}
+
+#[test]
+fn lookahead_without_loc_type() {
+    check_err(
+        r#"lookahead/lookbehind require you to declare the type of a location"#,
+        r#"grammar; extern { enum Tok { } } Foo = @L;"#,
+        r#"                                       ~~ "#,
+    );
+}
+
+#[test]
+fn multiple_extern_token() {
+    check_err(
+        r#"multiple extern definitions are not permitted"#,
+        r#"grammar; extern { enum Tok { } } extern { enum Tok { } }"#,
+        r#"                                 ~~~~~~                 "#,
+    );
+}
+
+#[test]
+fn unrecognized_annotation() {
+    check_err(
+        r#"unrecognized annotation `foo`"#,
+        r#"grammar; #[foo] Term = ();"#,
+        r#"           ~~~            "#,
+    );
+}
+
+#[test]
+fn duplicate_annotation() {
+    check_err(
+        r#"duplicate annotation `inline`"#,
+        r#"grammar; #[inline] #[inline] Term = ();"#,
+        r#"                     ~~~~~~            "#,
+    );
+}
+
+#[test]
+fn pub_inline_annotation() {
+    check_err(
+        r#"public items cannot be marked #\[inline\]"#,
+        r#"grammar; #[inline] pub Term = ();"#,
+        r#"           ~~~~~~            "#,
+    );
+}
+
+#[test]
+fn multiple_match_token() {
+    check_err(
+        r#"multiple match definitions are not permitted"#,
+        r#"grammar; match { _ } match { _ }"#,
+        r#"                     ~~~~~      "#,
+    );
+}
+
+#[test]
+fn match_after_extern_token() {
+    check_err(
+        r#"match and extern \(with custom tokens\) definitions are mutually exclusive"#,
+        r#"grammar; extern { enum Tok { } } match { _ }"#,
+        r#"                                 ~~~~~      "#,
+    );
+}
+
+#[test]
+fn extern_after_match_token() {
+    check_err(
+        r#"extern \(with custom tokens\) and match definitions are mutually exclusive"#,
+        r#"grammar; match { _ } extern { enum Tok { } }"#,
+        r#"                     ~~~~~~                 "#,
+    );
+}
+
+#[test]
+fn match_catch_all_first_of_last() {
+    check_err(
+        r#"Catch all must be final item"#,
+        r#"grammar; match { _, "abc" }"#,
+        r#"                 ~         "#,
+    );
+}
+
+#[test]
+fn match_catch_all_last_of_first() {
+    check_err(
+        r#"Catch all must be final item"#,
+        r#"grammar; match { "abc", _ } else { "foo" }"#,
+        r#"                        ~                 "#,
+    );
+}
+
+#[test]
+fn expandable_expression_requires_named_variables() {
+    check_err(
+        r#"Using `<>` between curly braces \(e.g., `\{<>\}`\) only works when your parsed values have been given names \(e.g., `<x:Foo>`, not just `<Foo>`\)"#,
+        r#"grammar; Term = { <A> => Foo {<>} };"#,
+        r#"                  ~~~~~~~~~~~~~~~~  "#);
+}
+
+#[test]
+fn mixing_names_and_anonymous_values() {
+    check_err(
+        r#"anonymous symbols like this one cannot be combined with named symbols like `b:B`"#,
+        r#"grammar; Term = { <A> <b:B> => Alien: Eighth passanger of Nostromo};"#,
+        r#"                  ~~~                                               "#,
+    );
+}
+
+#[test]
+fn public_macros() {
+    check_err(
+        r#"macros cannot be marked public"#,
+        r#"grammar; pub Comma<T> = (T ",")* T?;"#,
+        r#"             ~~~~~~~~               "#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/resolve/mod.rs
@@ -0,0 +1,298 @@
+//! Resolves identifiers to decide if they are macros, terminals, or
+//! nonterminals. Rewrites the parse tree accordingly.
+
+use super::{NormError, NormResult};
+
+use grammar::parse_tree::*;
+use string_cache::DefaultAtom as Atom;
+use collections::{map, Map};
+
+#[cfg(test)]
+mod test;
+
+pub fn resolve(mut grammar: Grammar) -> NormResult<Grammar> {
+    try!(resolve_in_place(&mut grammar));
+    Ok(grammar)
+}
+
+fn resolve_in_place(grammar: &mut Grammar) -> NormResult<()> {
+    let globals = {
+        let nonterminal_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .map(|nt| {
+                (
+                    nt.span.clone(),
+                    nt.name.0.clone(),
+                    Def::Nonterminal(nt.args.len()),
+                )
+            });
+
+        let terminal_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_extern_token())
+            .flat_map(|extern_token| extern_token.enum_token.as_ref())
+            .flat_map(|enum_token| &enum_token.conversions)
+            .filter_map(|conversion| match conversion.from {
+                TerminalString::Literal(..) | TerminalString::Error => None,
+                TerminalString::Bare(ref id) => Some((conversion.span, id.clone(), Def::Terminal)),
+            });
+
+        // Extract all the bare identifiers that appear in the RHS of a `match` declaration.
+        // Example:
+        //     match {
+        //         r"(?)begin" => "BEGIN",
+        //     } else {
+        //         r"[a-zA-Z_][a-zA-Z0-9_]*" => ID,
+        //     }
+        // This would result in `vec![ID]`.
+        let match_identifiers = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_match_token())
+            .flat_map(|match_token| &match_token.contents)
+            .flat_map(|match_contents| &match_contents.items)
+            .filter_map(|item| match *item {
+                MatchItem::Mapped(_, TerminalString::Bare(ref id), _) => {
+                    Some((item.span(), id.clone(), Def::Terminal))
+                }
+                _ => None,
+            });
+
+        let all_identifiers = nonterminal_identifiers
+            .chain(terminal_identifiers)
+            .chain(match_identifiers);
+
+        let mut identifiers = map();
+        for (span, id, def) in all_identifiers {
+            if let Some(old_def) = identifiers.insert(id.clone(), def) {
+                let description = def.description();
+                let old_description = old_def.description();
+                if description == old_description {
+                    return_err!(span, "two {}s declared with the name `{}`", description, id);
+                } else {
+                    return_err!(
+                        span,
+                        "{} and {} both declared with the name `{}`",
+                        description,
+                        old_description,
+                        id
+                    );
+                }
+            }
+        }
+
+        ScopeChain {
+            previous: None,
+            identifiers: identifiers,
+        }
+    };
+
+    let validator = Validator { globals: globals };
+
+    validator.validate(grammar)
+}
+
+struct Validator {
+    globals: ScopeChain<'static>,
+}
+
+#[derive(Copy, Clone, Debug)]
+enum Def {
+    Terminal,
+    Nonterminal(usize), // argument is the number of macro arguments
+    MacroArg,
+}
+
+#[derive(Debug)]
+struct ScopeChain<'scope> {
+    previous: Option<&'scope ScopeChain<'scope>>,
+    identifiers: Map<Atom, Def>,
+}
+
+impl Def {
+    fn description(&self) -> &'static str {
+        match *self {
+            Def::Terminal => "terminal",
+            Def::Nonterminal(0) => "nonterminal",
+            Def::Nonterminal(_) => "macro",
+            Def::MacroArg => "macro argument",
+        }
+    }
+}
+
+impl Validator {
+    fn validate(&self, grammar: &mut Grammar) -> NormResult<()> {
+        for item in &mut grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+                GrammarItem::MatchToken(..) => {}
+                GrammarItem::InternToken(..) => {}
+                GrammarItem::ExternToken(..) => {}
+                GrammarItem::Nonterminal(ref mut data) => {
+                    let identifiers = try!(self.validate_macro_args(data.span, &data.args));
+                    let locals = ScopeChain {
+                        previous: Some(&self.globals),
+                        identifiers: identifiers,
+                    };
+                    for alternative in &mut data.alternatives {
+                        try!(self.validate_alternative(&locals, alternative));
+                    }
+                }
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_macro_args(
+        &self,
+        span: Span,
+        args: &[NonterminalString],
+    ) -> NormResult<Map<Atom, Def>> {
+        for (index, arg) in args.iter().enumerate() {
+            if args[..index].contains(&arg) {
+                return_err!(
+                    span,
+                    "multiple macro arguments declared with the name `{}`",
+                    arg
+                );
+            }
+        }
+        Ok(args.iter()
+            .map(|nt| (nt.0.clone(), Def::MacroArg))
+            .collect())
+    }
+
+    fn validate_alternative(
+        &self,
+        scope: &ScopeChain,
+        alternative: &mut Alternative,
+    ) -> NormResult<()> {
+        if let Some(ref condition) = alternative.condition {
+            let def = try!(self.validate_id(scope, condition.span.clone(), &condition.lhs.0));
+            match def {
+                Def::MacroArg => { /* OK */ }
+                _ => {
+                    return_err!(
+                        condition.span,
+                        "only macro arguments can be used in conditions, \
+                         not {}s like `{}`",
+                        def.description(),
+                        condition.lhs
+                    );
+                }
+            }
+        }
+
+        try!(self.validate_expr(scope, &mut alternative.expr));
+
+        Ok(())
+    }
+
+    fn validate_expr(&self, scope: &ScopeChain, expr: &mut ExprSymbol) -> NormResult<()> {
+        for symbol in &mut expr.symbols {
+            try!(self.validate_symbol(scope, symbol));
+        }
+
+        Ok(())
+    }
+
+    fn validate_symbol(&self, scope: &ScopeChain, symbol: &mut Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref mut expr) => {
+                try!(self.validate_expr(scope, expr));
+            }
+            SymbolKind::AmbiguousId(_) => {
+                try!(self.rewrite_ambiguous_id(scope, symbol));
+            }
+            SymbolKind::Terminal(_) => { /* see postvalidate! */ }
+            SymbolKind::Nonterminal(ref id) => {
+                // in normal operation, the parser never produces Nonterminal(_) entries,
+                // but during testing we do produce nonterminal entries
+                let def = try!(self.validate_id(scope, symbol.span, &id.0));
+                match def {
+                    Def::Nonterminal(0) | Def::MacroArg => {
+                        // OK
+                    }
+                    Def::Terminal | Def::Nonterminal(_) => {
+                        return_err!(
+                            symbol.span,
+                            "`{}` is a {}, not a nonterminal",
+                            def.description(),
+                            id
+                        );
+                    }
+                }
+            }
+            SymbolKind::Macro(ref mut msym) => {
+                debug_assert!(msym.args.len() > 0);
+                let def = try!(self.validate_id(scope, symbol.span, &msym.name.0));
+                match def {
+                    Def::Nonterminal(0) | Def::Terminal | Def::MacroArg => return_err!(
+                        symbol.span,
+                        "`{}` is a {}, not a macro",
+                        def.description(),
+                        msym.name
+                    ),
+                    Def::Nonterminal(arity) => {
+                        if arity != msym.args.len() {
+                            return_err!(
+                                symbol.span,
+                                "wrong number of arguments to `{}`: \
+                                 expected {}, found {}",
+                                msym.name,
+                                arity,
+                                msym.args.len()
+                            );
+                        }
+                    }
+                }
+
+                for arg in &mut msym.args {
+                    try!(self.validate_symbol(scope, arg));
+                }
+            }
+            SymbolKind::Repeat(ref mut repeat) => {
+                try!(self.validate_symbol(scope, &mut repeat.symbol));
+            }
+            SymbolKind::Choose(ref mut sym) | SymbolKind::Name(_, ref mut sym) => {
+                try!(self.validate_symbol(scope, sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind | SymbolKind::Error => {}
+        }
+
+        Ok(())
+    }
+
+    fn rewrite_ambiguous_id(&self, scope: &ScopeChain, symbol: &mut Symbol) -> NormResult<()> {
+        let id = if let SymbolKind::AmbiguousId(ref name) = symbol.kind {
+            name.clone()
+        } else {
+            panic!("Should never happen.");
+        };
+        symbol.kind = match try!(self.validate_id(scope, symbol.span, &id)) {
+            Def::MacroArg | Def::Nonterminal(0) => SymbolKind::Nonterminal(NonterminalString(id)),
+            Def::Terminal => SymbolKind::Terminal(TerminalString::Bare(id)),
+            Def::Nonterminal(_) => return_err!(symbol.span, "`{}` is a macro", id),
+        };
+        Ok(())
+    }
+
+    fn validate_id(&self, scope: &ScopeChain, span: Span, id: &Atom) -> NormResult<Def> {
+        match scope.def(id) {
+            Some(def) => Ok(def),
+            None => return_err!(span, "no definition found for `{}`", id),
+        }
+    }
+}
+
+impl<'scope> ScopeChain<'scope> {
+    fn def(&self, id: &Atom) -> Option<Def> {
+        self.identifiers
+            .get(id)
+            .cloned()
+            .or_else(|| self.previous.and_then(|s| s.def(id)))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/resolve/test.rs
@@ -0,0 +1,82 @@
+use parser;
+use grammar::parse_tree::Span;
+use regex::Regex;
+
+fn check_err(expected_err: &str, grammar: &str) {
+    let expected_err = Regex::new(expected_err).unwrap();
+
+    // the string will have a `>>>` and `<<<` in it, which serve to
+    // indicate the span where an error is expected.
+    let start_index = grammar.find(">>>").unwrap();
+    let grammar = grammar.replace(">>>", ""); // remove the `>>>` marker
+    let end_index = grammar.rfind("<<<").unwrap();
+    let grammar = grammar.replace("<<<", "");
+
+    assert!(start_index <= end_index);
+
+    let parsed_grammar = parser::parse_grammar(&grammar).unwrap();
+    match super::resolve(parsed_grammar) {
+        Ok(_) => {
+            panic!("expected error for grammar");
+        }
+        Err(err) => {
+            assert_eq!(err.span, Span(start_index, end_index));
+            assert!(
+                expected_err.is_match(&err.message),
+                "unexpected error text `{}`, did not match `{}`",
+                err.message,
+                expected_err
+            );
+        }
+    }
+}
+
+#[test]
+fn unknown_nonterminal() {
+    check_err("no definition found for `Y`", r#"grammar; X = X >>>Y<<<;"#);
+}
+
+#[test]
+fn unknown_nonterminal_in_macro_arg() {
+    check_err(
+        "no definition found for `Y`",
+        r#"grammar; X = X Id<>>>Y<<<>; Id<T> = T;"#,
+    );
+}
+
+#[test]
+fn unknown_nonterminal_in_repeat_question() {
+    check_err("no definition found for `Y`", r#"grammar; X = >>>Y<<<?;"#);
+}
+
+#[test]
+fn unknown_nonterminal_two() {
+    check_err(
+        "no definition found for `Expr`",
+        r#"grammar; Term = { <n:"Num"> => n.as_num(), "A" <>>>Expr<<<> "B" };"#,
+    );
+}
+
+#[test]
+fn double_nonterminal() {
+    check_err(
+        "two nonterminals declared with the name `A`",
+        r#"grammar; A = "Foo"; >>>A<<< = "Bar";"#,
+    );
+}
+
+#[test]
+fn repeated_macro_arg() {
+    check_err(
+        "multiple macro arguments declared with the name `Y`",
+        r#"grammar; >>>X<Y,Y><<< = "foo";"#,
+    );
+}
+
+#[test]
+fn overlapping_terminal_and_nonterminal() {
+    check_err(
+        "terminal and nonterminal both declared with the name `A`",
+        r#"grammar; A = "Foo"; extern { enum Foo { >>>A => Foo::A(..) <<<} }"#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/token_check/mod.rs
@@ -0,0 +1,424 @@
+//! If an extern token is provided, then this pass validates that
+//! terminal IDs have conversions. Otherwise, it generates a
+//! tokenizer. This can only be done after macro expansion because
+//! some macro arguments never make it into an actual production and
+//! are only used in `if` conditions; we use string literals for
+//! those, but they do not have to have a defined conversion.
+
+use super::{NormError, NormResult};
+
+use string_cache::DefaultAtom as Atom;
+use lexer::re;
+use lexer::dfa::{self, DFAConstructionError, Precedence};
+use lexer::nfa::NFAConstructionError::*;
+use grammar::consts::*;
+use grammar::parse_tree::*;
+use collections::{Map, Set};
+
+#[cfg(test)]
+mod test;
+
+pub fn validate(mut grammar: Grammar) -> NormResult<Grammar> {
+    let mode = {
+        let mode = if let Some(enum_token) = grammar.enum_token() {
+            assert!(
+                grammar.match_token().is_none(),
+                "validator permitted both an extern/match section"
+            );
+
+            TokenMode::Extern {
+                conversions: enum_token
+                    .conversions
+                    .iter()
+                    .map(|conversion| conversion.from.clone())
+                    .collect(),
+            }
+        } else {
+            TokenMode::Internal {
+                match_block: MatchBlock::new(grammar.match_token())?,
+            }
+        };
+
+        let mut validator = Validator {
+            grammar: &grammar,
+            mode: mode,
+        };
+
+        validator.validate()?;
+
+        validator.mode
+    };
+
+    match mode {
+        TokenMode::Extern { .. } => {
+            // If using an external tokenizer, we're all done at this point.
+        }
+        TokenMode::Internal { match_block } => {
+            // Otherwise, construct the `InternToken` item.
+            construct(&mut grammar, match_block)?;
+        }
+    }
+
+    Ok(grammar)
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Validation phase -- this phase walks the grammar and visits all
+// terminals. If using an external set of tokens, it checks that all
+// terminals have a defined conversion to some pattern. Otherwise,
+// it collects all terminals into the `all_literals` set for later use.
+
+struct Validator<'grammar> {
+    grammar: &'grammar Grammar,
+    mode: TokenMode,
+}
+
+enum TokenMode {
+    /// If there is an `extern { ... }` section that defines
+    /// conversions of the form `TERMINAL => PATTERN`, then this is a
+    /// set of those terminals. These are the only terminals that the
+    /// user should be using.
+    Extern { conversions: Set<TerminalString> },
+
+    /// Otherwise, we are synthesizing the tokenizer. In that case,
+    /// `match_block` summarizes the data from the `match { ... }`
+    /// section, if any. If there was no `match` section, or the
+    /// section contains a wildcard, the user can also use additional
+    /// terminals in the grammar.
+    Internal { match_block: MatchBlock },
+}
+
+/// Data summarizing the `match { }` block, along with any literals we
+/// scraped up.
+#[derive(Default)]
+struct MatchBlock {
+    /// This map stores the `match { }` entries. If `match_catch_all`
+    /// is true, then we will grow this set with "identity mappings"
+    /// for new literals that we find.
+    match_entries: Vec<MatchEntry>,
+
+    /// The names of all terminals the user can legally type. If
+    /// `match_catch_all` is true, then if we encounter additional
+    /// terminal literals in the grammar, we will add them to this
+    /// set.
+    match_user_names: Set<TerminalString>,
+
+    /// For each terminal literal that we have to match, the span
+    /// where it appeared in user's source.  This can either be in the
+    /// `match { }` section or else in the grammar somewhere (if added
+    /// due to a catch-all, or there is no match section).
+    spans: Map<TerminalLiteral, Span>,
+
+    /// True if we should permit unrecognized literals to be used.
+    catch_all: bool,
+}
+
+impl MatchBlock {
+    /// Creates a `MatchBlock` by reading the data out of the `match {
+    /// ... }` block that the user provided (if any).
+    fn new(opt_match_token: Option<&MatchToken>) -> NormResult<Self> {
+        let mut match_block = Self::default();
+        if let Some(match_token) = opt_match_token {
+            for (idx, mc) in match_token.contents.iter().enumerate() {
+                let precedence = &match_token.contents.len() - idx;
+                for item in &mc.items {
+                    match *item {
+                        MatchItem::Unmapped(ref sym, span) => {
+                            match_block.add_match_entry(
+                                precedence,
+                                sym.clone(),
+                                TerminalString::Literal(sym.clone()),
+                                span,
+                            )?;
+                        }
+                        MatchItem::Mapped(ref sym, ref user, span) => {
+                            match_block.add_match_entry(
+                                precedence,
+                                sym.clone(),
+                                user.clone(),
+                                span,
+                            )?;
+                        }
+                        MatchItem::CatchAll(_) => {
+                            match_block.catch_all = true;
+                        }
+                    }
+                }
+            }
+        } else {
+            // no match block is equivalent to `match { _ }`
+            match_block.catch_all = true;
+        }
+        Ok(match_block)
+    }
+
+    fn add_match_entry(
+        &mut self,
+        match_group_precedence: usize,
+        sym: TerminalLiteral,
+        user_name: TerminalString,
+        span: Span,
+    ) -> NormResult<()> {
+        if let Some(_old_span) = self.spans.insert(sym.clone(), span) {
+            return_err!(span, "multiple match entries for `{}`", sym);
+        }
+
+        // NB: It's legal for multiple regex to produce same terminal.
+        self.match_user_names.insert(user_name.clone());
+
+        self.match_entries.push(MatchEntry {
+            precedence: match_group_precedence * 2 + sym.base_precedence(),
+            match_literal: sym,
+            user_name: user_name,
+        });
+        Ok(())
+    }
+
+    fn add_literal_from_grammar(&mut self, sym: TerminalLiteral, span: Span) -> NormResult<()> {
+        // Already saw this literal, maybe in a match entry, maybe in the grammar.
+        if self.match_user_names
+            .contains(&TerminalString::Literal(sym.clone()))
+        {
+            return Ok(());
+        }
+
+        if !self.catch_all {
+            return_err!(
+                span,
+                "terminal `{}` does not have a match mapping defined for it",
+                sym
+            );
+        }
+
+        self.match_user_names
+            .insert(TerminalString::Literal(sym.clone()));
+
+        self.match_entries.push(MatchEntry {
+            precedence: sym.base_precedence(),
+            match_literal: sym.clone(),
+            user_name: TerminalString::Literal(sym.clone()),
+        });
+
+        self.spans.insert(sym, span);
+
+        Ok(())
+    }
+}
+
+impl<'grammar> Validator<'grammar> {
+    fn validate(&mut self) -> NormResult<()> {
+        for item in &self.grammar.items {
+            match *item {
+                GrammarItem::Use(..) => {}
+                GrammarItem::MatchToken(..) => {}
+                GrammarItem::ExternToken(_) => {}
+                GrammarItem::InternToken(_) => {}
+                GrammarItem::Nonterminal(ref data) => for alternative in &data.alternatives {
+                    try!(self.validate_alternative(alternative));
+                },
+            }
+        }
+        Ok(())
+    }
+
+    fn validate_alternative(&mut self, alternative: &Alternative) -> NormResult<()> {
+        assert!(alternative.condition.is_none()); // macro expansion should have removed these
+        try!(self.validate_expr(&alternative.expr));
+        Ok(())
+    }
+
+    fn validate_expr(&mut self, expr: &ExprSymbol) -> NormResult<()> {
+        for symbol in &expr.symbols {
+            try!(self.validate_symbol(symbol));
+        }
+        Ok(())
+    }
+
+    fn validate_symbol(&mut self, symbol: &Symbol) -> NormResult<()> {
+        match symbol.kind {
+            SymbolKind::Expr(ref expr) => {
+                try!(self.validate_expr(expr));
+            }
+            SymbolKind::Terminal(ref term) => {
+                try!(self.validate_terminal(symbol.span, term));
+            }
+            SymbolKind::Nonterminal(_) => {}
+            SymbolKind::Repeat(ref repeat) => {
+                try!(self.validate_symbol(&repeat.symbol));
+            }
+            SymbolKind::Choose(ref sym) | SymbolKind::Name(_, ref sym) => {
+                try!(self.validate_symbol(sym));
+            }
+            SymbolKind::Lookahead | SymbolKind::Lookbehind | SymbolKind::Error => {}
+            SymbolKind::AmbiguousId(ref id) => {
+                panic!("ambiguous id `{}` encountered after name resolution", id)
+            }
+            SymbolKind::Macro(..) => {
+                panic!("macro not removed: {:?}", symbol);
+            }
+        }
+
+        Ok(())
+    }
+
+    fn validate_terminal(&mut self, span: Span, term: &TerminalString) -> NormResult<()> {
+        match self.mode {
+            // If there is an extern token definition, validate that
+            // this terminal has a defined conversion.
+            TokenMode::Extern { ref conversions } => {
+                if !conversions.contains(term) {
+                    return_err!(
+                        span,
+                        "terminal `{}` does not have a pattern defined for it",
+                        term
+                    );
+                }
+            }
+
+            // If there is no extern token definition, then collect
+            // the terminal literals ("class", r"[a-z]+") into a set.
+            TokenMode::Internal {
+                ref mut match_block,
+            } => {
+                match *term {
+                    TerminalString::Bare(_) => assert!(
+                        match_block.match_user_names.contains(term),
+                        "bare terminal without match entry: {}",
+                        term
+                    ),
+
+                    TerminalString::Literal(ref l) => {
+                        match_block.add_literal_from_grammar(l.clone(), span)?
+                    }
+
+                    // Error is a builtin terminal that always exists
+                    TerminalString::Error => (),
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Construction phase -- if we are constructing a tokenizer, this
+// phase builds up an internal token DFA.
+
+fn construct(grammar: &mut Grammar, match_block: MatchBlock) -> NormResult<()> {
+    let MatchBlock {
+        mut match_entries,
+        spans,
+        ..
+    } = match_block;
+
+    // Sort match entries by order of increasing precedence.
+    match_entries.sort();
+
+    // Build up two vectors, one of parsed regular expressions and
+    // one of precedences, that are parallel with `literals`.
+    let mut regexs = Vec::with_capacity(match_entries.len());
+    let mut precedences = Vec::with_capacity(match_entries.len());
+    try!({
+        for match_entry in &match_entries {
+            precedences.push(Precedence(match_entry.precedence));
+            match match_entry.match_literal {
+                TerminalLiteral::Quoted(ref s) => {
+                    regexs.push(re::parse_literal(&s));
+                }
+                TerminalLiteral::Regex(ref s) => {
+                    match re::parse_regex(&s) {
+                        Ok(regex) => regexs.push(regex),
+                        Err(error) => {
+                            let literal_span = spans[&match_entry.match_literal];
+                            // FIXME -- take offset into account for
+                            // span; this requires knowing how many #
+                            // the user used, which we do not track
+                            return_err!(literal_span, "invalid regular expression: {}", error);
+                        }
+                    }
+                }
+            }
+        }
+        Ok(())
+    });
+
+    let dfa = match dfa::build_dfa(&regexs, &precedences) {
+        Ok(dfa) => dfa,
+        Err(DFAConstructionError::NFAConstructionError { index, error }) => {
+            let feature = match error {
+                NamedCaptures => r#"named captures (`(?P<foo>...)`)"#,
+                NonGreedy => r#""non-greedy" repetitions (`*?` or `+?`)"#,
+                WordBoundary => r#"word boundaries (`\b` or `\B`)"#,
+                LineBoundary => r#"line boundaries (`^` or `$`)"#,
+                TextBoundary => r#"text boundaries (`^` or `$`)"#,
+                ByteRegex => r#"byte-based matches"#,
+            };
+            let literal = &match_entries[index.index()].match_literal;
+            return_err!(
+                spans[literal],
+                "{} are not supported in regular expressions",
+                feature
+            )
+        }
+        Err(DFAConstructionError::Ambiguity { match0, match1 }) => {
+            let literal0 = &match_entries[match0.index()].match_literal;
+            let literal1 = &match_entries[match1.index()].match_literal;
+            // FIXME(#88) -- it'd be nice to give an example here
+            return_err!(
+                spans[literal0],
+                "ambiguity detected between the terminal `{}` and the terminal `{}`",
+                literal0,
+                literal1
+            )
+        }
+    };
+
+    grammar.items.push(GrammarItem::InternToken(InternToken {
+        match_entries: match_entries,
+        dfa: dfa,
+    }));
+
+    // we need to inject a `'input` lifetime and `input: &'input str` parameter as well:
+
+    let input_lifetime = Atom::from(INPUT_LIFETIME);
+    for parameter in &grammar.type_parameters {
+        match *parameter {
+            TypeParameter::Lifetime(ref i) if *i == input_lifetime => {
+                return_err!(
+                    grammar.span,
+                    "since there is no external token enum specified, \
+                     the `'input` lifetime is implicit and cannot be declared"
+                );
+            }
+            _ => {}
+        }
+    }
+
+    let input_parameter = Atom::from(INPUT_PARAMETER);
+    for parameter in &grammar.parameters {
+        if parameter.name == input_parameter {
+            return_err!(
+                grammar.span,
+                "since there is no external token enum specified, \
+                 the `input` parameter is implicit and cannot be declared"
+            );
+        }
+    }
+
+    grammar
+        .type_parameters
+        .insert(0, TypeParameter::Lifetime(input_lifetime.clone()));
+
+    let parameter = Parameter {
+        name: input_parameter,
+        ty: TypeRef::Ref {
+            lifetime: Some(input_lifetime),
+            mutable: false,
+            referent: Box::new(TypeRef::Id(Atom::from("str"))),
+        },
+    };
+    grammar.parameters.push(parameter);
+
+    Ok(())
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/token_check/test.rs
@@ -0,0 +1,203 @@
+use parser;
+use normalize::resolve::resolve;
+use normalize::NormResult;
+use lexer::dfa::interpret;
+use grammar::parse_tree::Grammar;
+use test_util;
+
+fn validate_grammar(grammar: &str) -> NormResult<Grammar> {
+    let parsed_grammar = parser::parse_grammar(&grammar).expect("parse grammar");
+    let parsed_grammar = resolve(parsed_grammar).expect("resolve");
+    super::validate(parsed_grammar)
+}
+
+fn check_err(expected_err: &str, grammar: &str, span: &str) {
+    let err = validate_grammar(&grammar).unwrap_err();
+    test_util::check_norm_err(expected_err, span, err);
+}
+
+fn check_intern_token(grammar: &str, expected_tokens: Vec<(&'static str, &'static str)>) {
+    let parsed_grammar = validate_grammar(&grammar).expect("validate");
+    let intern_token = parsed_grammar.intern_token().expect("intern_token");
+    println!("intern_token: {:?}", intern_token);
+    for (input, expected_user_name) in expected_tokens {
+        let actual_user_name =
+            interpret::interpret(&intern_token.dfa, input).map(|(index, text)| {
+                let user_name = &intern_token.match_entries[index.index()].user_name;
+                (user_name.clone(), text)
+            });
+        let actual_user_name = format!("{:?}", actual_user_name);
+        if expected_user_name != actual_user_name {
+            panic!(
+                "input `{}` matched `{}` but we expected `{}`",
+                input, actual_user_name, expected_user_name
+            );
+        }
+    }
+}
+
+#[test]
+fn unknown_terminal() {
+    check_err(
+        r#"terminal `"\+"` does not have a pattern defined for it"#,
+        r#"grammar; extern { enum Term { } } X = X "+";"#,
+        r#"                                        ~~~ "#,
+    );
+}
+
+#[test]
+fn unknown_id_terminal() {
+    check_err(
+        r#"terminal `"foo"` does not have a pattern defined for it"#,
+        r#"grammar; extern { enum Term { } } X = X "foo";"#,
+        r#"                                        ~~~~~ "#,
+    );
+}
+
+#[test]
+fn tick_input_lifetime_already_declared() {
+    check_err(
+        r#".*the `'input` lifetime is implicit and cannot be declared"#,
+        r#"grammar<'input>; X = X "foo";"#,
+        r#"~~~~~~~                      "#,
+    );
+}
+
+#[test]
+fn input_parameter_already_declared() {
+    check_err(
+        r#".*the `input` parameter is implicit and cannot be declared"#,
+        r#"grammar(input:u32); X = X "foo";"#,
+        r#"~~~~~~~                         "#,
+    );
+}
+
+#[test]
+fn invalid_regular_expression_unterminated_group() {
+    check_err(
+        r#"Unclosed parenthesis"#,
+        r#"grammar; X = X r"(123";"#,
+        r#"               ~~~~~~~ "#,
+    );
+}
+
+#[test]
+fn quoted_literals() {
+    check_intern_token(
+        r#"grammar; X = X "+" "-" "foo" "(" ")";"#,
+        vec![
+            ("+", r#"Some(("+", "+"))"#),
+            ("-", r#"Some(("-", "-"))"#),
+            ("(", r#"Some(("(", "("))"#),
+            (")", r#"Some((")", ")"))"#),
+            ("foo", r#"Some(("foo", "foo"))"#),
+            ("<", r#"None"#),
+        ],
+    );
+}
+
+#[test]
+fn regex_literals() {
+    check_intern_token(
+        r#"grammar; X = X r"[a-z]+" r"[0-9]+";"#,
+        vec![
+            ("a", r##"Some((r#"[a-z]+"#, "a"))"##),
+            ("def", r##"Some((r#"[a-z]+"#, "def"))"##),
+            ("1", r##"Some((r#"[0-9]+"#, "1"))"##),
+            ("9123456", r##"Some((r#"[0-9]+"#, "9123456"))"##),
+        ],
+    );
+}
+
+/// Basic test for match mappings.
+#[test]
+fn match_mappings() {
+    check_intern_token(
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } else { "abc" => ALPHA } X = "BEGIN" ALPHA;"#,
+        vec![
+            ("BEGIN", r##"Some(("BEGIN", "BEGIN"))"##),
+            ("begin", r##"Some(("BEGIN", "begin"))"##),
+            ("abc", r#"Some((ALPHA, "abc"))"#),
+        ],
+    );
+}
+
+/// Match mappings, exercising precedence. Here the ID regex *would*
+/// be ambiguous with the begin regex.
+#[test]
+fn match_precedence() {
+    check_intern_token(
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } else { r"\w+" => ID } X = ();"#,
+        vec![
+            ("BEGIN", r##"Some(("BEGIN", "BEGIN"))"##),
+            ("begin", r##"Some(("BEGIN", "begin"))"##),
+            ("abc", r#"Some((ID, "abc"))"#),
+        ],
+    );
+}
+
+/// Test that, without a `catch-all`, using unrecognized literals is an error.
+#[test]
+fn invalid_match_literal() {
+    check_err(
+        r#"terminal `"foo"` does not have a match mapping defined for it"#,
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } X = "foo";"#,
+        r#"                                               ~~~~~ "#,
+    );
+}
+
+/// Test that, without a `catch-all`, using unrecognized literals is an error.
+#[test]
+fn invalid_match_regex_literal() {
+    check_err(
+        r##"terminal `r#"foo"#` does not have a match mapping defined for it"##,
+        r#"grammar; match { r"(?i)begin" => "BEGIN" } X = r"foo";"#,
+        r#"                                               ~~~~~~ "#,
+    );
+}
+
+/// Test that, with a catch-all, the previous two examples work.
+#[test]
+fn match_catch_all() {
+    let grammar = r#"grammar; match { r"(?i)begin" => "BEGIN", _ } X = { "foo", r"foo" };"#;
+    assert!(validate_grammar(&grammar).is_ok())
+}
+
+#[test]
+fn complex_match() {
+    let grammar = r##"
+        grammar;
+        match {
+            "abc"        => "ABC",
+            r"(?i)begin" => BEGIN
+        }
+
+        pub Query: String = {
+            "ABC" BEGIN => String::from("Success")
+        };
+"##;
+    assert!(validate_grammar(&grammar).is_ok())
+}
+
+/// Test that overlapping regular expressions are still forbidden within one level
+/// of a match declaration.
+#[test]
+fn ambiguity_within_match() {
+    check_err(
+        r##"ambiguity detected between the terminal `r#"b"#` and the terminal `r#"\(\?i\)b"#`"##,
+        r#"grammar; match { r"(?i)b" => "B", r"b" => "b" }"#,
+        r#"                                  ~~~~~~~~~~~~ "#,
+    );
+}
+
+/// Test that using the **exact same regular expression** twice is
+/// forbidden, even across multiple levels of the match expression.
+/// No good reason to do that.
+#[test]
+fn same_literal_twice() {
+    check_err(
+        r##"multiple match entries for `r#"\(\?i\)b"#`"##,
+        r#"grammar; match { r"(?i)b" => "B" } else { r"(?i)b" => "b" }"#,
+        r#"                                          ~~~~~~~~~~~~~~~~ "#,
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/tyinfer/mod.rs
@@ -0,0 +1,356 @@
+use super::{NormError, NormResult};
+use super::norm_util::{self, AlternativeAction, Symbols};
+
+use std::collections::{HashMap, HashSet};
+use grammar::consts::{ERROR, INPUT_LIFETIME, LOCATION};
+use grammar::parse_tree::{ActionKind, Alternative, Grammar, NonterminalData, NonterminalString,
+                          Path, Span, SymbolKind, TypeParameter, TypeRef};
+use grammar::repr::{NominalTypeRepr, TypeRepr, Types};
+use string_cache::DefaultAtom as Atom;
+
+#[cfg(test)]
+mod test;
+
+pub fn infer_types(grammar: &Grammar) -> NormResult<Types> {
+    let inferencer = try!(TypeInferencer::new(&grammar));
+    inferencer.infer_types()
+}
+
+struct TypeInferencer<'grammar> {
+    stack: Vec<NonterminalString>,
+    nonterminals: HashMap<NonterminalString, NT<'grammar>>,
+    types: Types,
+    type_parameters: HashSet<Atom>,
+}
+
+#[derive(Copy, Clone)]
+struct NT<'grammar> {
+    span: Span,
+    type_decl: &'grammar Option<TypeRef>,
+    alternatives: &'grammar Vec<Alternative>,
+}
+
+impl<'grammar> TypeInferencer<'grammar> {
+    fn new(grammar: &'grammar Grammar) -> NormResult<TypeInferencer<'grammar>> {
+        let types = TypeInferencer::make_types(grammar);
+
+        let nonterminals = grammar
+            .items
+            .iter()
+            .filter_map(|item| item.as_nonterminal())
+            .map(|data| {
+                assert!(!data.is_macro_def()); // normalized away by now
+                (data.name.clone(), NT::new(data))
+            })
+            .collect();
+
+        let type_parameters = grammar
+            .type_parameters
+            .iter()
+            .filter_map(|p| match *p {
+                TypeParameter::Lifetime(_) => None,
+                TypeParameter::Id(ref ty) => Some(ty.clone()),
+            })
+            .collect();
+
+        Ok(TypeInferencer {
+            stack: vec![],
+            nonterminals: nonterminals,
+            types: types,
+            type_parameters: type_parameters,
+        })
+    }
+
+    fn make_types(grammar: &Grammar) -> Types {
+        let opt_extern_token = grammar.extern_token();
+
+        // Determine error type (if any).
+        let error_type = opt_extern_token.and_then(|extern_token| {
+            extern_token
+                .associated_type(Atom::from(ERROR))
+                .map(|tr| tr.type_ref.type_repr())
+        });
+
+        // Determine location type and enum type. If using an internal
+        // token, that's specified by us, not user.
+        if let Some(intern_token) = grammar.intern_token() {
+            let loc_type = // usize
+                TypeRepr::usize();
+            let input_str = // &'input str
+                TypeRepr::Ref {
+                    lifetime: Some(Atom::from(INPUT_LIFETIME)),
+                    mutable: false,
+                    referent: Box::new(TypeRepr::str())
+                };
+            let enum_type = // Token<'input>
+                TypeRepr::Nominal(NominalTypeRepr {
+                    path: Path {
+                        absolute: false,
+                        ids: vec![Atom::from("Token")],
+                    },
+                    types: vec![TypeRepr::Lifetime(Atom::from(INPUT_LIFETIME))]
+                });
+
+            let mut types = Types::new(&grammar.prefix, Some(loc_type), error_type, enum_type);
+
+            for match_entry in &intern_token.match_entries {
+                types.add_term_type(match_entry.user_name.clone(), input_str.clone());
+            }
+
+            types
+        } else {
+            let extern_token = opt_extern_token.unwrap();
+            let loc_type = extern_token
+                .associated_type(Atom::from(LOCATION))
+                .map(|tr| tr.type_ref.type_repr());
+            let enum_type = extern_token
+                .enum_token
+                .as_ref()
+                .unwrap()
+                .type_name
+                .type_repr();
+            let mut types = Types::new(&grammar.prefix, loc_type, error_type, enum_type);
+
+            // For each defined conversion, figure out the type of the
+            // terminal and enter it into `types` by hand if it is not the
+            // default. For terminals with custom types, the user should
+            // have one or more bindings in the pattern -- if more than
+            // one, make a tuple.
+            //
+            // e.g. "(" => Lparen(..) ==> no custom type
+            //      "Num" => Num(<u32>) ==> custom type is u32
+            //      "Fraction" => Real(<u32>,<u32>) ==> custom type is (u32, u32)
+            for conversion in grammar
+                .enum_token()
+                .into_iter()
+                .flat_map(|et| &et.conversions)
+            {
+                let mut tys = Vec::new();
+                conversion
+                    .to
+                    .for_each_binding(&mut |ty| tys.push(ty.type_repr()));
+                if tys.is_empty() {
+                    continue;
+                }
+                let ty = maybe_tuple(tys);
+                types.add_term_type(conversion.from.clone(), ty);
+            }
+
+            types
+        }
+    }
+
+    fn infer_types(mut self) -> NormResult<Types> {
+        let ids: Vec<NonterminalString> =
+            self.nonterminals.iter().map(|(id, _)| id.clone()).collect();
+
+        for id in ids {
+            try!(self.nonterminal_type(&id));
+            debug_assert!(self.types.lookup_nonterminal_type(&id).is_some());
+        }
+
+        Ok(self.types)
+    }
+
+    fn nonterminal_type(&mut self, id: &NonterminalString) -> NormResult<TypeRepr> {
+        if let Some(repr) = self.types.lookup_nonterminal_type(id) {
+            return Ok(repr.clone());
+        }
+
+        let nt = self.nonterminals[&id];
+        if self.stack.contains(&id) {
+            return_err!(
+                nt.span,
+                "cannot infer type of `{}` because it references itself",
+                id
+            );
+        }
+
+        let ty = try!(self.push(id, |this| {
+            if let &Some(ref type_decl) = nt.type_decl {
+                return this.type_ref(type_decl);
+            }
+
+            // Try to compute the types of all alternatives; note that
+            // some may result in an error. Don't report these errors
+            // (yet).
+            let mut alternative_types = vec![];
+            let mut alternative_errors = vec![];
+            for alt in nt.alternatives.iter() {
+                match this.alternative_type(alt) {
+                    Ok(t) => alternative_types.push(t),
+                    Err(e) => alternative_errors.push(e),
+                }
+            }
+
+            // if it never succeeded, report first error
+            if alternative_types.is_empty() {
+                match alternative_errors.into_iter().next() {
+                    Some(err) => {
+                        return Err(err);
+                    }
+                    None => {
+                        // if nothing succeeded, and nothing errored,
+                        // must have been nothing to start with
+                        return_err!(
+                            nt.span,
+                            "nonterminal `{}` has no alternatives and hence parse cannot succeed",
+                            id
+                        );
+                    }
+                }
+            }
+
+            // otherwise, check that all the cases where we had success agree
+            for ((ty, alt), i) in alternative_types[1..]
+                .iter()
+                .zip(&nt.alternatives[1..])
+                .zip(1..)
+            {
+                if &alternative_types[0] != ty {
+                    return_err!(
+                        alt.span,
+                        "type of alternative #{} is `{}`, \
+                         but type of first alternative is `{}`",
+                        i + 1,
+                        ty,
+                        alternative_types[0]
+                    );
+                }
+            }
+
+            // and use that type
+            Ok(alternative_types.pop().unwrap())
+        }));
+
+        self.types.add_type(id.clone(), ty.clone());
+        Ok(ty)
+    }
+
+    fn push<F, R>(&mut self, id: &NonterminalString, f: F) -> NormResult<R>
+    where
+        F: FnOnce(&mut TypeInferencer) -> NormResult<R>,
+    {
+        self.stack.push(id.clone());
+        let r = f(self);
+        assert_eq!(self.stack.pop().unwrap(), *id);
+        r
+    }
+
+    fn type_ref(&mut self, type_ref: &TypeRef) -> NormResult<TypeRepr> {
+        match *type_ref {
+            TypeRef::Tuple(ref types) => {
+                let types = try! {
+                    types.iter().map(|t| self.type_ref(t)).collect()
+                };
+                Ok(TypeRepr::Tuple(types))
+            }
+            TypeRef::Nominal {
+                ref path,
+                ref types,
+            } => {
+                if path.ids.len() == 2 && self.type_parameters.contains(&path.ids[0]) {
+                    return Ok(TypeRepr::Associated {
+                        type_parameter: path.ids[0].clone(),
+                        id: path.ids[1].clone(),
+                    });
+                }
+
+                let types = try! {
+                    types.iter().map(|t| self.type_ref(t)).collect()
+                };
+                Ok(TypeRepr::Nominal(NominalTypeRepr {
+                    path: path.clone(),
+                    types: types,
+                }))
+            }
+            TypeRef::Lifetime(ref id) => Ok(TypeRepr::Lifetime(id.clone())),
+            TypeRef::Id(ref id) => Ok(TypeRepr::Nominal(NominalTypeRepr {
+                path: Path::from_id(id.clone()),
+                types: vec![],
+            })),
+            TypeRef::Ref {
+                ref lifetime,
+                mutable,
+                ref referent,
+            } => Ok(TypeRepr::Ref {
+                lifetime: lifetime.clone(),
+                mutable: mutable,
+                referent: Box::new(try!(self.type_ref(referent))),
+            }),
+            TypeRef::OfSymbol(ref symbol) => self.symbol_type(symbol),
+        }
+    }
+
+    fn alternative_type(&mut self, alt: &Alternative) -> NormResult<TypeRepr> {
+        match norm_util::analyze_action(alt) {
+            AlternativeAction::User(&ActionKind::User(_))
+            | AlternativeAction::User(&ActionKind::Fallible(_)) => {
+                return_err!(
+                    alt.span,
+                    "cannot infer types if there is custom action code"
+                );
+            }
+
+            AlternativeAction::User(&ActionKind::Lookahead)
+            | AlternativeAction::User(&ActionKind::Lookbehind) => {
+                Ok(self.types.opt_terminal_loc_type().unwrap().clone())
+            }
+
+            AlternativeAction::Default(Symbols::Named(ref syms)) => {
+                return_err!(
+                    alt.span,
+                    "cannot infer types in the presence of named symbols like `{}:{}`",
+                    syms[0].1,
+                    syms[0].2
+                );
+            }
+
+            AlternativeAction::Default(Symbols::Anon(syms)) => {
+                let symbol_types: Vec<TypeRepr> = try! {
+                    syms.iter()
+                        .map(|&(_, sym)| self.symbol_type(&sym.kind))
+                        .collect()
+                };
+                Ok(maybe_tuple(symbol_types))
+            }
+        }
+    }
+
+    fn symbol_type(&mut self, symbol: &SymbolKind) -> NormResult<TypeRepr> {
+        match *symbol {
+            SymbolKind::Terminal(ref id) => Ok(self.types.terminal_type(id).clone()),
+            SymbolKind::Nonterminal(ref id) => self.nonterminal_type(id),
+            SymbolKind::Choose(ref s) => self.symbol_type(&s.kind),
+            SymbolKind::Name(_, ref s) => self.symbol_type(&s.kind),
+            SymbolKind::Error => Ok(self.types.error_recovery_type().clone()),
+
+            SymbolKind::Repeat(..)
+            | SymbolKind::Expr(..)
+            | SymbolKind::Macro(..)
+            | SymbolKind::AmbiguousId(..)
+            | SymbolKind::Lookahead
+            | SymbolKind::Lookbehind => {
+                unreachable!("symbol `{:?}` should have been expanded away", symbol)
+            }
+        }
+    }
+}
+
+impl<'grammar> NT<'grammar> {
+    fn new(data: &'grammar NonterminalData) -> NT<'grammar> {
+        NT {
+            span: data.span,
+            type_decl: &data.type_decl,
+            alternatives: &data.alternatives,
+        }
+    }
+}
+
+fn maybe_tuple(v: Vec<TypeRepr>) -> TypeRepr {
+    if v.len() == 1 {
+        v.into_iter().next().unwrap()
+    } else {
+        TypeRepr::Tuple(v)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/normalize/tyinfer/test.rs
@@ -0,0 +1,243 @@
+use string_cache::DefaultAtom as Atom;
+use parser;
+use normalize::macro_expand::expand_macros;
+use normalize::token_check;
+use normalize::tyinfer::infer_types;
+use grammar::parse_tree::NonterminalString;
+use grammar::repr::TypeRepr;
+
+fn type_repr(s: &str) -> TypeRepr {
+    let type_ref = parser::parse_type_ref(s).unwrap();
+    return type_ref.type_repr();
+}
+
+fn compare(g1: &str, expected: Vec<(&'static str, &'static str)>) {
+    let grammar = parser::parse_grammar(g1).unwrap();
+    let grammar = expand_macros(grammar).unwrap();
+    let grammar = token_check::validate(grammar).unwrap();
+    let types = infer_types(&grammar).unwrap();
+
+    println!("types table: {:?}", types);
+
+    for (nt_id, nt_type) in expected {
+        let id = NonterminalString(Atom::from(nt_id));
+        let ty = type_repr(nt_type);
+        println!("expected type of {:?} is {:?}", id, ty);
+        assert_eq!(types.nonterminal_type(&id), &ty);
+    }
+}
+
+#[test]
+fn test_pairs_and_tokens() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..), "Ho" => Ho(..) } }
+    X = Y Z;
+    Y: Foo = "Hi";
+    Z = "Ho";
+"#,
+        vec![("X", "(Foo, Tok)"), ("Y", "Foo"), ("Z", "Tok")],
+    )
+}
+
+#[test]
+fn test_cycle_direct() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..), "Ho" => Ho(..) } }
+    X = {
+        X Y,
+        <Y> => vec![<>]
+    };
+    Y = "Hi";
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn test_cycle_indirect() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { } }
+    A = B;
+    B = C;
+    C = D;
+    D = A;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn test_macro_expansion() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Id" => Id(..) } }
+    Two<X>: (X, X) = X X;
+    Ids = Two<"Id">;
+"#,
+        vec![("Ids", "(Tok, Tok)"), (r#"Two<"Id">"#, "(Tok, Tok)")],
+    )
+}
+
+#[test]
+fn test_macro_expansion_infer() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Id" => Id(..) } }
+    Two<X> = X X;
+    Ids = Two<"Id">;
+"#,
+        vec![("Ids", "(Tok, Tok)"), (r#"Two<"Id">"#, "(Tok, Tok)")],
+    )
+}
+
+#[test]
+fn test_type_question() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..) } }
+    X = Y?;
+    Y = "Hi";
+"#,
+        vec![("X", "::std::option::Option<Tok>"), ("Y", "Tok")],
+    )
+}
+
+#[test]
+fn test_star_plus_question() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "Hi" => Hi(..) } }
+    A = Z*;
+    X = "Hi"*;
+    Y = "Hi"+;
+    Z = "Hi"?;
+"#,
+        vec![
+            ("A", "::std::vec::Vec<::std::option::Option<Tok>>"),
+            ("X", "::std::vec::Vec<Tok>"),
+            ("Y", "::std::vec::Vec<Tok>"),
+            ("Z", "::std::option::Option<Tok>"),
+        ],
+    )
+}
+
+#[test]
+fn test_lookahead() {
+    compare(
+        r#"
+grammar;
+    extern { type Location = usize; enum Tok { } }
+    A = @L;
+"#,
+        vec![("A", "usize")],
+    )
+}
+
+#[test]
+fn test_spanned_macro() {
+    compare(
+        r#"
+        grammar;
+        extern { type Location = usize; enum Tok { "Foo" => Foo(..) } }
+        A = Spanned<"Foo">;
+        Spanned<T> = {
+            @L T @R
+        };
+"#,
+        vec![("A", "(usize, Tok, usize)")],
+    )
+}
+
+#[test]
+fn test_action() {
+    compare(
+        r#"
+grammar;
+    extern { enum Tok { "+" => .., "foo" => .. } }
+
+    X = {
+        Y,
+        <l:X> "+" <r:Y> => l + r
+    };
+
+    Y: i32 = "foo" => 22;
+"#,
+        vec![("X", "i32"), ("Y", "i32")],
+    )
+}
+
+#[test]
+fn test_inconsistent_action() {
+    let grammar = parser::parse_grammar(
+        r#"
+grammar;
+    extern { enum Tok { "+" => .., "foo" => .., "bar" => .. } }
+
+    X = {
+        Y,
+        Z,
+        <l:X> "+" <r:Y> => l + r
+    };
+
+    Y: i32 = "foo" => 22;
+
+    Z: u32 = "bar" => 22;
+"#,
+    ).unwrap();
+
+    let actual = expand_macros(grammar).unwrap();
+    assert!(infer_types(&actual).is_err());
+}
+
+#[test]
+fn custom_token() {
+    compare(
+        r#"
+grammar;
+extern { enum Tok { N => N(<u32>) } }
+A = N;
+"#,
+        vec![("A", "u32")],
+    )
+}
+
+#[test]
+fn intern_token() {
+    compare(
+        r#"
+grammar;
+    Z = @L "Ho" @R;
+"#,
+        vec![("Z", "(usize, &'input str, usize)")],
+    )
+}
+
+#[test]
+fn error() {
+    compare(
+        r#"
+grammar;
+    Z = !;
+"#,
+        vec![
+            (
+                "Z",
+                "__lalrpop_util::ErrorRecovery<usize, Token<'input>, &'static str>",
+            ),
+        ],
+    )
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/parser/lrgrammar.lalrpop
@@ -0,0 +1,468 @@
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::*;
+use grammar::pattern::*;
+use std::iter::once;
+use tok::{self, Tok};
+use util::strip;
+
+grammar<'input>(text: &'input str);
+
+pub Grammar: Grammar =
+    <module_attributes:ShebangAttribute*>
+    <uses:Use*>
+    <annotations:Annotation*>
+    <lo:@L> "grammar" <hi:@R>
+    <tps:GrammarTypeParameters?>
+    <parameters:GrammarParameters?>
+    <where_clauses:GrammarWhereClauses?>
+    ";"
+    <items:GrammarItem*> => {
+        Grammar { prefix: format!("__"), // adjusted by `parse_grammar`
+                  span: Span(lo, hi),
+                  type_parameters: tps.unwrap_or(vec![]),
+                  parameters: parameters.unwrap_or(vec![]),
+                  where_clauses: where_clauses.unwrap_or(vec![]),
+                  items: uses.into_iter().chain(items).collect(),
+                  annotations: annotations,
+                  module_attributes: module_attributes}
+    };
+
+GrammarTypeParameters: Vec<TypeParameter> =
+    "<" <Comma<TypeParameter>> ">";
+
+TypeParameter: TypeParameter = {
+    <l:Lifetime> => TypeParameter::Lifetime(l),
+    <l:Id> => TypeParameter::Id(l)
+};
+
+pub GrammarWhereClauses: Vec<WhereClause<TypeRef>> =
+    "where" <Comma<GrammarWhereClause>>;
+
+GrammarWhereClause: WhereClause<TypeRef> = {
+    <l:Lifetime> ":" <bounds:Plus<Lifetime>> =>
+        WhereClause::Lifetime { lifetime: l, bounds: bounds },
+    <f:ForAll?> <ty:TypeRef> ":" <bounds:TypeBounds> =>
+        WhereClause::Type { forall: f, ty: ty, bounds: bounds }
+};
+
+ForAll: Vec<Atom> =
+    "for" "<" <Comma<Lifetime>> ">";
+
+TypeBounds: Vec<TypeBound<TypeRef>> =
+    <Plus<TypeBound>>;
+
+TypeBound: TypeBound<TypeRef> = {
+    <l:Lifetime> =>
+        TypeBound::Lifetime(l),
+    <f:ForAll?> <p:Path> "(" <params:Comma<TypeRef>> ")" <ret:("->" <TypeRef>)?> =>
+        TypeBound::Fn { forall: f, path: p, parameters: params, ret: ret },
+    <f:ForAll?> <p:Path> <params:("<" <Comma<TypeBoundParameter>> ">")?> =>
+        TypeBound::Trait { forall: f, path: p, parameters: params.unwrap_or(vec![]) }
+};
+
+TypeBoundParameter: TypeBoundParameter<TypeRef> = {
+    <l:Lifetime> => TypeBoundParameter::Lifetime(l),
+    <ty:TypeRef> => TypeBoundParameter::TypeParameter(ty),
+    <id:Id> "=" <ty:TypeRef> => TypeBoundParameter::Associated(id, ty),
+};
+
+Plus<T>: Vec<T> = {
+    <v:(<T> "+")*> <e:T?> => match e {
+        None => v,
+        Some(e) => {
+            let mut v = v;
+            v.push(e);
+            v
+        }
+    }
+};
+
+GrammarParameters: Vec<Parameter> =
+    "(" <Comma<GrammarParameter>> ")";
+
+GrammarParameter: Parameter =
+    <id:Id> ":" <ty:TypeRef> => Parameter { name: id, ty: ty };
+
+GrammarItem: GrammarItem = {
+    Use,
+    MatchToken,
+    ExternToken,
+    Nonterminal
+};
+
+Use: GrammarItem =
+    <u:"use"> ";" => GrammarItem::Use(strip(u).to_string());
+
+Visibility: Visibility = {
+    "pub" "(" <p:Path> ")" => Visibility::Pub(Some(p)),
+    "pub" => Visibility::Pub(None),
+    () => Visibility::Priv,
+};
+
+Nonterminal: GrammarItem =
+    <annotations:Annotation*>
+    <v:Visibility> <lo:@L> <n:NonterminalName> <hi:@R>
+    <t:(":" <TypeRef>)?> "=" <a:Alternatives> => {
+        GrammarItem::Nonterminal(NonterminalData { visibility: v,
+                                                   span: Span(lo, hi),
+                                                   name: n.0,
+                                                   annotations: annotations,
+                                                   args: n.1,
+                                                   type_decl: t,
+                                                   alternatives: a })
+    };
+
+Annotation: Annotation =
+    "#" "[" <lo:@L> <id:Id> <hi:@R> "]" => {
+        Annotation { id_span: Span(lo, hi), id: id }
+    };
+
+NonterminalName: (NonterminalString, Vec<NonterminalString>) = {
+    <MacroId> "<" <Comma<NotMacroId>> ">",
+    <n:NotMacroId> => (n, vec![]),
+    <"Escape"> => (NonterminalString(Atom::from(<>)), vec![]),
+};
+
+Alternatives: Vec<Alternative> = {
+    <a:Alternative> ";" => vec![a],
+    "{" <Comma<Alternative>> "}" ";",
+};
+
+Alternative: Alternative = {
+    <lo:@L> <s:Symbol+> <c:("if" <Cond>)?> <a:Action?> <hi:@R> => {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: s },
+            condition: c,
+            action: a
+        }
+    },
+    <lo:@L> <c:("if" <Cond>)?> <a:Action> <hi:@R> => {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: vec![] },
+            condition: c,
+            action: Some(a)
+        }
+    },
+};
+
+Action: ActionKind = {
+    "=>@L" => ActionKind::Lookahead,
+    "=>@R" => ActionKind::Lookbehind,
+    <c:"=>"> => ActionKind::User(strip(c).to_string()),
+    <c:"=>?"> => ActionKind::Fallible(strip(c).to_string()),
+};
+
+Cond: Condition =
+    <lo:@L> <a:NotMacroId> <op:CondOp> <b:StringLiteral> <hi:@R> => {
+        Condition { span:Span(lo, hi), lhs:a, rhs:b, op:op }
+    };
+
+CondOp: ConditionOp = {
+    "==" => ConditionOp::Equals,
+    "!=" => ConditionOp::NotEquals,
+    "~~" => ConditionOp::Match,
+    "!~" => ConditionOp::NotMatch,
+};
+
+ExprSymbol: ExprSymbol =
+    Symbol* => ExprSymbol { symbols: <> };
+
+Symbol: Symbol = {
+    <lo:@L> "<" @L <l:Id> ":" <s:Symbol0> ">" <hi:@R> =>
+        Symbol::new(Span(lo, hi), SymbolKind::Name(l, Box::new(s))),
+
+    <lo:@L> "<" <s:Symbol0> ">" <hi:@R> =>
+        Symbol::new(Span(lo, hi), SymbolKind::Choose(Box::new(s))),
+
+    Symbol0,
+};
+
+Symbol0: Symbol = {
+    Symbol1,
+
+    <lhs:Symbol0> <op:RepeatOp> <hi:@R> =>
+        Symbol::new(Span(lhs.span.0, hi),
+                    SymbolKind::Repeat(Box::new(RepeatSymbol { symbol: lhs, op: op }))),
+};
+
+RepeatOp: RepeatOp = {
+    "+" => RepeatOp::Plus,
+    "*" => RepeatOp::Star,
+    "?" => RepeatOp::Question,
+};
+
+Symbol1: Symbol =
+    <lo:@L> <sk:SymbolKind1> <hi:@R> => Symbol::new(Span(lo, hi), sk);
+
+SymbolKind1: SymbolKind = {
+    <name:MacroId> "<" <args:Comma<Symbol>> ">" =>
+        SymbolKind::Macro(MacroSymbol { name: name, args: args }),
+
+    QuotedTerminal =>
+        SymbolKind::Terminal(<>),
+
+    "Id" =>
+        SymbolKind::AmbiguousId(Atom::from(<>)),
+
+    Escape =>
+        SymbolKind::Nonterminal(NonterminalString(<>)),
+
+    "(" <ExprSymbol> ")" =>
+        SymbolKind::Expr(<>),
+
+    "@L" =>
+        SymbolKind::Lookahead,
+
+    "@R" =>
+        SymbolKind::Lookbehind,
+
+    "!" =>
+        SymbolKind::Error,
+};
+
+pub TypeRef: TypeRef = {
+    "(" <Comma<TypeRef>> ")" =>
+        TypeRef::Tuple(<>),
+
+    "#" <Symbol> "#" => {
+        TypeRef::OfSymbol(<>.kind)
+    },
+
+    "&" <l:Lifetime?> <m:"mut"?> <t:TypeRef> =>
+        TypeRef::Ref { lifetime: l,
+                       mutable: m.is_some(),
+                       referent: Box::new(t) },
+
+    <p:Path> "<" <a:Comma<TypeRefOrLifetime>> ">" =>
+        TypeRef::Nominal { path: p, types: a },
+
+    <p:Path> =>
+        match p.as_id() {
+            Some(id) => TypeRef::Id(id),
+            None => TypeRef::Nominal { path: p, types: vec![] }
+        },
+};
+
+TypeRefOrLifetime: TypeRef = {
+    TypeRef,
+    Lifetime => TypeRef::Lifetime(<>),
+};
+
+Path: Path =
+    <a:"::"?> <h:(<Id> "::")*> <t:Id> => {
+        Path { absolute: a.is_some(),
+               ids: h.into_iter().chain(once(t)).collect() }
+    };
+
+ExternToken: GrammarItem = {
+    <lo:@L> "extern" <hi:@R> "{" <a0:AssociatedType*> <et:EnumToken> <a1:AssociatedType*> "}" => {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0.into_iter().chain(a1).collect(),
+            enum_token: Some(et),
+        })
+    },
+    <lo:@L> "extern" <hi:@R> "{" <a0:AssociatedType*> "}" => {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0,
+            enum_token: None,
+        })
+    },
+};
+
+MatchToken: GrammarItem =
+    <t:MatchTokenInt> => GrammarItem::MatchToken(t);
+
+MatchTokenInt: MatchToken = {
+    <t:MatchTokenInt> "else" "{" <c:MatchContents> "}" => t.add(c),
+    <lo:@L> "match" <hi:@R> "{" <c:MatchContents> "}"  => MatchToken::new(c, Span(lo, hi)),
+};
+
+MatchContents: MatchContents =
+    <items:Comma<MatchItem>> => MatchContents { items: items };
+
+MatchItem: MatchItem = {
+    <lo:@L> "_" <hi:@R>             => MatchItem::CatchAll(Span(lo, hi)),
+    <lo:@L> <s:MatchSymbol> <hi:@R> => MatchItem::Unmapped(s, Span(lo, hi)),
+    <lo:@L> <from:MatchSymbol> <start:@L> <p:"=>"> <hi:@R> =>? {
+        let to = try!(super::parse_match_mapping(p, start + 2));
+        Ok(MatchItem::Mapped(from, to, Span(lo, hi)))
+    }
+};
+
+MatchSymbol = QuotedLiteral;
+
+pub MatchMapping = Terminal;
+
+EnumToken: EnumToken =
+    "enum" <lo:@L> <t:TypeRef> <hi:@R> "{"
+      <c:Comma<Conversion>>
+    "}" => {
+        EnumToken {
+            type_name: t,
+            type_span: Span(lo, hi),
+            conversions: c,
+        }
+    };
+
+AssociatedType: AssociatedType =
+    "type" <lo:@L> <n:Id> <hi:@R> "=" <t:TypeRef> ";" => {
+        AssociatedType { type_span: Span(lo, hi),
+                         type_name: n,
+                         type_ref: t }
+    };
+
+Conversion: Conversion =
+    <lo:@L> <from:Terminal> <start:@L> <p:"=>"> <hi:@R> =>? {
+        let pattern = try!(super::parse_pattern(p, start + 2));
+        Ok(Conversion { span: Span(lo, hi),
+                        from: from,
+                        to: pattern })
+    };
+
+pub Pattern: Pattern<TypeRef> =
+    <lo:@L> <k:PatternKind> <hi:@R> => Pattern { span: Span(lo, hi), kind: k };
+
+PatternKind: PatternKind<TypeRef> = {
+    <Path> "(" <Comma<Pattern>> ")" =>
+        PatternKind::Enum(<>),
+
+    <p:Path> "{" <a0:(<FieldPattern> ",")*> <a1:FieldPattern?> "}" =>
+        PatternKind::Struct(p, a0.into_iter().chain(a1).collect(), false),
+
+    <p:Path> "{" <a0:(<FieldPattern> ",")*> ".." "}" =>
+        PatternKind::Struct(p, a0, true),
+
+    "_" =>
+        PatternKind::Underscore,
+
+    ".." =>
+        PatternKind::DotDot,
+
+    "<" <TypeRef> ">" =>
+        PatternKind::Choose(<>),
+
+    "(" <Comma<Pattern>> ")" =>
+        PatternKind::Tuple(<>),
+
+    <c:"CharLiteral"> =>
+        PatternKind::CharLiteral(Atom::from(c)),
+
+    <Path> =>
+        PatternKind::Path(<>),
+};
+
+FieldPattern: FieldPattern<TypeRef> =
+    <lo:@L> <id:Id> <hi:@R> ":" <pat:Pattern> => {
+        FieldPattern { field_span: Span(lo, hi),
+                       field_name: id,
+                       pattern: pat }
+    };
+
+MacroId: NonterminalString =
+    <i:"MacroId"> => NonterminalString(Atom::from(i));
+
+NotMacroId: NonterminalString =
+    <i:"Id"> => NonterminalString(Atom::from(i));
+
+Id: Atom = {
+    <i:"Id"> => Atom::from(i),
+    <i:"MacroId"> => Atom::from(i),
+};
+
+Escape: Atom =
+    <i:"Escape"> => Atom::from(i);
+
+Lifetime: Atom =
+    <i:"Lifetime"> => Atom::from(i);
+
+Terminal: TerminalString = {
+    QuotedTerminal,
+    <i:"Id"> => TerminalString::Bare(Atom::from(i)),
+};
+
+QuotedTerminal: TerminalString = {
+    QuotedLiteral => TerminalString::Literal(<>),
+};
+
+QuotedLiteral: TerminalLiteral = {
+    <s:StringLiteral> => TerminalLiteral::Quoted(s),
+    <s:RegexLiteral> => TerminalLiteral::Regex(s),
+};
+
+StringLiteral: Atom =
+    <s:"StringLiteral"> => Atom::from(s);
+
+RegexLiteral: Atom =
+    <s:"RegexLiteral"> => Atom::from(s);
+
+Comma<E>: Vec<E> =
+    <v0:(<E> ",")*> <e1:E?> =>
+        v0.into_iter().chain(e1).collect();
+
+ShebangAttribute: String =
+    <s:"#![...]"> => s.to_string();
+
+extern {
+    type Location = usize;
+    type Error = tok::Error;
+    enum Tok<'input> {
+        "enum" => Tok::Enum,
+        "extern" => Tok::Extern,
+        "grammar" => Tok::Grammar,
+        "match" => Tok::Match,
+        "else" => Tok::Else,
+        "if" => Tok::If,
+        "mut" => Tok::Mut,
+        "pub" => Tok::Pub,
+        "type" => Tok::Type,
+        "where" => Tok::Where,
+        "for" => Tok::For,
+        "!" => Tok::Bang,
+        "use" => Tok::Use(<&'input str>),
+
+        "Escape" => Tok::Escape(<&'input str>),
+        "Id" => Tok::Id(<&'input str>),
+        "MacroId" => Tok::MacroId(<&'input str>),
+        "Lifetime" => Tok::Lifetime(<&'input str>),
+        "StringLiteral" => Tok::StringLiteral(<&'input str>),
+        "CharLiteral" => Tok::CharLiteral(<&'input str>),
+        "RegexLiteral" => Tok::RegexLiteral(<&'input str>),
+
+        "&" => Tok::Ampersand,
+        "!=" => Tok::BangEquals,
+        "!~" => Tok::BangTilde,
+        ":" => Tok::Colon,
+        "::" => Tok::ColonColon,
+        "," => Tok::Comma,
+        ".." => Tok::DotDot,
+        "=" => Tok::Equals,
+        "==" => Tok::EqualsEquals,
+        "=>" => Tok::EqualsGreaterThanCode(<&'input str>),
+        "=>?" => Tok::EqualsGreaterThanQuestionCode(<&'input str>),
+        "=>@L" => Tok::EqualsGreaterThanLookahead,
+        "=>@R" => Tok::EqualsGreaterThanLookbehind,
+        ">" => Tok::GreaterThan,
+        "#" => Tok::Hash,
+        "#![...]" => Tok::ShebangAttribute(<&'input str>),
+        "{" => Tok::LeftBrace,
+        "[" => Tok::LeftBracket,
+        "(" => Tok::LeftParen,
+        "<" => Tok::LessThan,
+        "@L" => Tok::Lookahead,
+        "@R" => Tok::Lookbehind,
+        "->" => Tok::MinusGreaterThan,
+        "+" => Tok::Plus,
+        "?" => Tok::Question,
+        "}" => Tok::RightBrace,
+        "]" => Tok::RightBracket,
+        ")" => Tok::RightParen,
+        ";" => Tok::Semi,
+        "*" => Tok::Star,
+        "~~" => Tok::TildeTilde,
+        "_" => Tok::Underscore,
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/parser/lrgrammar.rs
@@ -0,0 +1,62118 @@
+// auto-generated: "lalrpop-snap 0.15.1"
+#![cfg_attr(rustfmt, rustfmt_skip)]
+use string_cache::DefaultAtom as Atom;
+use grammar::parse_tree::*;
+use grammar::pattern::*;
+use std::iter::once;
+use tok::{self, Tok};
+use util::strip;
+#[allow(unused_extern_crates)]
+extern crate lalrpop_util as ___lalrpop_util;
+
+mod ___parse___Grammar {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 9, 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, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 1
+        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, -124, -124, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0,
+        // State 2
+        0, 0, 0, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // State 4
+        0, 0, 0, -425, -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, -425, 0, 0, 0, 0, 0, -425, 0, 0, 0, 0,
+        // State 5
+        0, 0, 0, 9, 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, 18, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 6
+        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, -488, 0, 0, 0, 0, 0, -488, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 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, 21, 0, 0, 0, 0, 0, 12, 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, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 9
+        0, 0, 0, -422, -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, -422, 0, 0, 0, 0, 0, -422, 0, 0, 0, 0,
+        // State 10
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 12
+        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, -125, -125, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0,
+        // State 13
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 29, 0, 0, 0,
+        // State 14
+        0, 0, 0, 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, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 15
+        0, 0, 0, -426, -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, -426, 0, 0, 0, 0, 0, -426, 0, 0, 0, 0,
+        // State 16
+        0, 0, 0, 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, 37, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+        // State 17
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 41, 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, 29, 0, 0, 0,
+        // State 18
+        0, 0, 0, 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, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        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, -489, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 46, 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, 29, 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, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 23
+        0, 0, 0, 0, 0, 0, 26, 0, 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, 29, 0, 0, 0,
+        // State 24
+        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, 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, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 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, -172, 0, 0, 0, 0, 0, 48, 77, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        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, -485, -485, 0, -485, 0, 0, 0, 0, 0, 0, 0, -485, 0, -485, 0, -485, 0, -485, 0, -485, 0, 0, 0, 0,
+        // State 30
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 31
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 32
+        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,
+        // State 33
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 102, 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, 29, 0, 0, 0,
+        // State 35
+        0, 0, 0, 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, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 107, 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, 29, 0, 0, 0,
+        // State 37
+        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, 29, 0, 0, 0,
+        // State 38
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 39
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 40
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 41
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 118, 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, 29, 0, 0, 0,
+        // State 42
+        0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 43
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 44
+        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, 0, 0, 0, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 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, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        0, 0, 0, 0, 0, 0, -360, -360, 0, -360, -360, 0, 0, -360, -360, -360, -360, -360, 0, 0, 0, 0, 0, -360, 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, -360, 0, 0,
+        // State 48
+        0, 0, 0, 0, 0, 0, -361, -361, 0, -361, -361, 0, 0, -361, -361, -361, -361, -361, 0, 0, 0, 0, 0, -361, 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, -361, 0, 0,
+        // State 49
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 51
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 52
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 53
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 54
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 55
+        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, 48, 0, 49, 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, 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,
+        // State 57
+        0, 0, 0, 0, 0, 0, 0, -139, 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,
+        // State 58
+        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,
+        // State 59
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0,
+        // State 60
+        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, -337, -337, 0, -337, 0, 0, 0, 0, 0, 0, 0, -337, 0, 0, 0, -337, 0, -337, 0, -337, 0, 0, 0, 0,
+        // State 61
+        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, -341, -341, 0, -341, 0, 0, 0, 0, 0, 0, 0, -341, 0, 0, 0, -341, 0, -341, 0, -341, 0, 0, 0, 0,
+        // State 62
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 63
+        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, -336, -336, 0, -336, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, 0, -336, 0, -336, 0, -336, 0, 0, 0, 0,
+        // State 64
+        0, 0, 0, -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, -374, -374, 0, -374, 0, 0, 0, 0, 0, 140, 0, -374, 0, 0, 0, -374, 0, -374, 0, -374, 0, 0, 0, 0,
+        // State 65
+        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, -338, -338, 0, -338, 0, 0, 0, 0, 0, 0, 0, -338, 0, 0, 0, -338, 0, -338, 0, -338, 0, 0, 0, 0,
+        // State 66
+        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, -335, -335, 0, -335, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, -335, 0, -335, 0, -335, 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, 144, 145, 0, 146, 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, 147, 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, 148, 0, 0,
+        // State 70
+        0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, -491, 0, -491, 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, -174, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 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,
+        // State 74
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -467, 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, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 76
+        0, 0, 0, -362, 0, -362, -362, 0, 0, -362, -362, 0, 0, -362, -362, -362, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 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, 48, 0, 49, 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, -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,
+        // State 80
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 156, 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,
+        // State 82
+        0, 0, 0, 0, 0, 0, -389, -389, 0, -389, -389, 0, 0, -389, 157, -389, -389, -389, 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, -389, 0, 0,
+        // State 83
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 84
+        0, 0, 0, 0, 0, 0, 0, -478, 0, -478, -478, 0, 0, -478, 0, -478, 159, -478, 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, -478, 0, 0,
+        // State 85
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 86
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0,
+        // State 88
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        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,
+        // State 91
+        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,
+        // State 92
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 93
+        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, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 94
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 95
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 96
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 97
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 98
+        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, 29, 0, 0, 0,
+        // State 99
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 100
+        0, 0, 0, 0, 0, 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, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 206, 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, 29, 0, 0, 0,
+        // State 103
+        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, 29, 0, 0, 0,
+        // State 104
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 105
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 106
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 107
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 109
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 110
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 111
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 112
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 113
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 114
+        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, 29, 0, 0, 0,
+        // State 115
+        0, 0, 0, 0, 0, 0, 26, 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, 29, 0, 0, 0,
+        // State 116
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 117
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 118
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 119
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 120
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 121
+        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,
+        // State 122
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 123
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 124
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 125
+        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, -121, -121, 0, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121, 0, 0, 0, -121, 0, 0, 0, 0, 0, 0,
+        // State 126
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 127
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 128
+        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,
+        // State 129
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 130
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 131
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 132
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 133
+        0, 0, 0, 0, 0, 0, 0, -141, 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,
+        // State 134
+        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, -346, 0, 0, 0,
+        // State 135
+        0, 0, 0, 0, 0, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, -36, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 144, 145, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 138
+        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, -342, -342, 0, -342, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, -342, 0, -342, 0, -342, 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, 242, 0, 0,
+        // State 140
+        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,
+        // State 141
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 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,
+        // State 142
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, -383, 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,
+        // State 144
+        0, -384, -384, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, -384, 0, 0, 0, -384, -384, 0, 0, 0, 0, -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, -384,
+        // State 145
+        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,
+        // 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, 249, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 251, 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0,
+        // State 148
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 260, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 150
+        0, 0, 0, 0, 0, 0, -349, 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, -349, 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, -91, 0, 0, 0, 0, 0, -91, -91, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 152
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, -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,
+        // State 153
+        0, 0, 0, 0, 0, 0, -390, -390, 0, -390, -390, 0, 0, -390, 262, -390, -390, -390, 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, -390, 0, 0,
+        // State 154
+        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,
+        // State 155
+        0, 0, 0, -41, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, -41, 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, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 157
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, -408, 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,
+        // State 158
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 48, 77, 49, 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, -412, 0, 0, 0, 90, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 160
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, -443, -443, 0, 0, -443, -443, -443, -443, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 0, 0, 0, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, 0, -443, 0,
+        // State 161
+        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,
+        // State 162
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, -417, -417, 0, 0, -417, -417, -417, -417, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, -417, 0,
+        // State 163
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, -441, -441, 0, 0, -441, -441, -441, -441, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, -441, 0,
+        // State 164
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, -416, -416, 0, 0, -416, -416, -416, -416, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, -416, 0,
+        // State 165
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, -415, -415, 0, 0, -415, -415, -415, -415, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, -415, 0,
+        // State 166
+        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,
+        // State 167
+        -430, 0, 0, -430, 0, 0, -430, -430, 282, 283, -430, 0, 0, 0, 0, -430, -430, 0, 0, -430, -430, -430, -430, -430, 284, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, 0, -430, 0,
+        // State 168
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, -435, -435, 0, 0, -435, -435, -435, -435, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, -435, 0,
+        // State 169
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, -437, -437, 0, 0, -437, -437, -437, -437, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, 0, -437, 0,
+        // State 170
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, -447, -447, 0, 0, -447, -447, -447, -447, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, 0, -447, 0,
+        // State 171
+        171, 0, 0, 0, 0, 0, 172, -193, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 172
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 290, 0, 291, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 173
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, -445, -445, 0, 0, -445, -445, -445, -445, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, -445, 0,
+        // State 174
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, -446, -446, 0, 0, -446, -446, -446, -446, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, -446, 0,
+        // State 175
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, -192, -192, 0, 0, -192, -192, -192, -192, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, -192, 0,
+        // State 176
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, -442, -442, 0, 0, -442, -442, -442, -442, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 0, 0, 0, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, 0, -442, 0,
+        // State 177
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, -418, -418, 0, 0, -418, -418, -418, -418, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, 0, -418, 0,
+        // State 178
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, -427, -427, 0, 0, -427, -427, -427, -427, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, 0, -427, 0,
+        // State 179
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0,
+        // State 180
+        0, 0, 0, 0, 0, 0, 0, -476, 0, -476, -476, 0, 0, -476, 0, -476, 0, -476, 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, -476, 0, 0,
+        // State 181
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, -178, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 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,
+        // State 184
+        0, 0, 0, 0, 0, 0, 0, -175, 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,
+        // 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, 48, 0, 49, 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, -387, -387, 0, -387, -387, 0, 0, -387, 157, -387, -387, -387, 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, -387, 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, -148, 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,
+        // State 188
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 189
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 190
+        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,
+        // State 191
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 192
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 193
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 194
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 195
+        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,
+        // State 196
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 197
+        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, 29, 0, 0, 0,
+        // State 198
+        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,
+        // State 199
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 200
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 201
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 202
+        0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 203
+        0, 0, 0, 0, 0, 0, 26, 0, 0, 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, 29, 0, 0, 0,
+        // State 204
+        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,
+        // State 205
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 206
+        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,
+        // State 207
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 208
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+        // State 209
+        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,
+        // State 210
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 211
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 212
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 213
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 214
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 215
+        0, 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,
+        // State 216
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 217
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 218
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 219
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 220
+        0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 221
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 222
+        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, 29, 0, 0, 0,
+        // State 223
+        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,
+        // State 224
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 225
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 226
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 227
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 228
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 229
+        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,
+        // State 230
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 231
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 232
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 233
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 234
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 235
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 236
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 237
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 238
+        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, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 239
+        0, 0, 0, 0, 0, 0, 0, -343, 0, 0, -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,
+        // State 240
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 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,
+        // 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 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, -156, 0, 0, 0, 0, 0, 145, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 244
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 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, -129, 0, 0, 0, 0, 0, 0, 0, -129, 0, 0, 0, -129, 0,
+        // 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, 249, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 362, 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, 250, 0, 0, 0, 364, 0,
+        // State 248
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 48, 0, 49, 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, -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, -199, -199, 0, -199, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, -199, 0, -199, 0, -199, 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, 178, 179, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0,
+        // 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, -366, 0,
+        // 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, 368, 0,
+        // State 254
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0,
+        // State 255
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 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, -368, 0,
+        // State 256
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 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, -373, 0,
+        // State 257
+        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, -367, 0,
+        // State 258
+        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,
+        // 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, -92, 0, 0, 0, 0, 0, -92, -92, -92, 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, -42, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, -42, 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, -47, 0, -47, 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, -412, 0, 0, 0, 90, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 263
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, -410, 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,
+        // State 264
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 374, -407, 0, 0, 0, 0, -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,
+        // State 265
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -352, 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,
+        // State 266
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 268
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 269
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 270
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 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,
+        // State 271
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -414, 0, 0, 0, 90, -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 272
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -450, -450, 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,
+        // State 274
+        0, 0, 0, 0, 0, 0, 380, 0, 0, -458, -458, 0, 0, 0, 0, -458, 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,
+        // State 275
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -466, 0, 0, 0, 0, -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,
+        // State 276
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 382, -411, 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,
+        // State 277
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 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,
+        // State 278
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, -164, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 279
+        0, 0, 0, 0, 0, 0, 0, -472, 0, -472, -472, 0, 0, -472, 0, -472, 0, -472, 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, -472, 0, 0,
+        // State 280
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, -436, -436, 0, 0, -436, -436, -436, -436, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, -436, 0,
+        // State 281
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, -420, -420, 0, 0, -420, -420, -420, -420, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, -420, 0,
+        // State 282
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, -419, -419, 0, 0, -419, -419, -419, -419, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, 0, -419, 0,
+        // State 283
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, -421, -421, 0, 0, -421, -421, -421, -421, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, -421, 0,
+        // State 284
+        0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 285
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, -433, 0, 0, 0, 0, -433, -433, 0, 0, -433, -433, -433, -433, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, -433, 0,
+        // State 286
+        171, 0, 0, 0, 0, 0, 172, -194, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 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, 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,
+        // State 288
+        0, 0, 0, 0, 0, 0, 0, 0, 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 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,
+        // State 289
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 290
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 291
+        0, 0, 0, 0, 0, 0, 0, -475, 0, -475, -475, 0, 0, -475, 0, -475, 0, -475, 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, -475, 0, 0,
+        // State 292
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -474, 0, -474, -474, 0, 0, -474, 0, -474, 0, -474, 0, 0, 0, 0, 0, -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, -474, 0, 0,
+        // State 294
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 295
+        0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, 0, 0, -471, 0, -471, 0, -471, 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, -471, 0, 0,
+        // State 296
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 297
+        0, 0, 0, 0, 0, 0, -388, -388, 0, -388, -388, 0, 0, -388, 262, -388, -388, -388, 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, -388, 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, -150, 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,
+        // 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, 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,
+        // State 300
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 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,
+        // State 301
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 302
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 303
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 304
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 305
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 306
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 307
+        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,
+        // State 308
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 309
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 310
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 311
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 312
+        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,
+        // State 313
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 314
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 29, 0, 0, 0,
+        // State 315
+        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, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 316
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 317
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 318
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 319
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 320
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 321
+        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,
+        // State 322
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 323
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 324
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 325
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 326
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 327
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 328
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 329
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 330
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 331
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 332
+        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,
+        // State 333
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 334
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 335
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 336
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 337
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 338
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 339
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 340
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 341
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 342
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 343
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 0, 0,
+        // 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, 419, 0,
+        // 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, -158, 0, 0, 0, 0, 0, 145, 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, 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,
+        // State 347
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 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,
+        // State 348
+        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,
+        // State 349
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 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, -116, 0,
+        // State 350
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 351
+        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, -379, -379, 0, -379, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, -379, 0, -379, 0, -379, 0, 0, 0, 0,
+        // State 352
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, -114, 0, 0, 0, 0, -114, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, -114, 0,
+        // State 353
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107, 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, -107, 0,
+        // State 354
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 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, -108, 0,
+        // State 355
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105, 0, 0, 0, 0, -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, -105, 0,
+        // State 356
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106, 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, -106, 0,
+        // 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, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 358
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, -132, 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, -130, 0, 0, 0, 0, 0, 0, 0, -130, 0, 0, 0, -130, 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, 250, 0, 0, 0, 433, 0,
+        // State 361
+        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, -200, -200, 0, -200, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, -200, 0, -200, 0, -200, 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, 250, 0, 0, 0, 434, 0,
+        // State 363
+        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, -195, -195, 0, -195, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, 0, -195, 0, -195, 0, -195, 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, 435, 0, 0,
+        // State 365
+        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, 0, 0, 0, 0, 0, 0, 0, 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, 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, -153, 0,
+        // State 367
+        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, -376, -376, 0, -376, 0, 0, 0, 0, 0, -376, 0, -376, 0, 0, 0, -376, 0, -376, 0, -376, 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, -61, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0,
+        // State 369
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -369, 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, -490, -490, 0, -490, 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, -353, 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,
+        // State 372
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 438, -409, 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,
+        // State 373
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 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, 439, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 375
+        0, 0, 0, 0, 0, 0, 0, -477, 0, -477, -477, 0, 0, -477, 0, -477, 0, -477, 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, -477, 0, 0,
+        // State 376
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 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, 440, -413, 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,
+        // State 378
+        0, 0, 0, 0, 0, 0, 441, 0, 0, -457, -457, 0, 0, 0, 0, -457, 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,
+        // State 379
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 48, 77, 49, 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, -81, 0, 0, 0, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 382
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, -166, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 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, 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,
+        // State 384
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 385
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, -444, -444, 0, 0, -444, -444, -444, -444, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, -444, 0,
+        // State 386
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, -434, 0, 0, 0, 0, -434, -434, 0, 0, -434, -434, -434, -434, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, -434, 0,
+        // State 387
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 388
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, -429, -429, 0, 0, -429, -429, -429, -429, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 0, 0, 0, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, 0, -429, 0,
+        // State 389
+        0, 0, 0, 0, 0, 0, 0, -473, 0, -473, -473, 0, 0, -473, 0, -473, 0, -473, 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, -473, 0, 0,
+        // State 390
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 392
+        0, 0, 0, -204, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, 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, -56, 0, 0, 0, 0, 0, 0, -56, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 395
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 396
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 397
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 398
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 399
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 400
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 401
+        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, 0, 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, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 403
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 404
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 405
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 406
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 407
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 408
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 409
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 410
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 411
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 412
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 413
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 414
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 415
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 416
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 417
+        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, -380, -380, 0, -380, 0, 0, 0, 0, 0, 0, 0, -380, 0, 0, 0, -380, 0, -380, 0, -380, 0, 0, 0, 0,
+        // State 418
+        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, -375, -375, 0, -375, 0, 0, 0, 0, 0, -375, 0, -375, 0, 0, 0, -375, 0, -375, 0, -375, 0, 0, 0, 0,
+        // State 419
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 420
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -381, 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,
+        // 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, -66, 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,
+        // State 422
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 0, 0,
+        // State 423
+        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, -119, -119, 0, -119, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, -119, 0, -119, 0, -119, 0, 0, 0, 0,
+        // State 424
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, 0, 0, -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, -113, 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, 145, 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, 354, 355, 356, 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,
+        // State 427
+        0, 468, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 471,
+        // State 428
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 0, -134, 0,
+        // State 429
+        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, -131, 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, 474, 0,
+        // 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, 250, 0, 0, 0, 475, 0,
+        // State 432
+        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, -197, -197, 0, -197, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, -197, 0, -197, 0, -197, 0, 0, 0, 0,
+        // State 433
+        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, -196, -196, 0, -196, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, 0, -196, 0, -196, 0, -196, 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, 481, 0, 0, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136, 0,
+        // State 435
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 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, -62, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0,
+        // State 437
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, -82, 0, 0, 0, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 440
+        0, 0, 0, 87, 0, 88, 89, -176, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 443
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 48, 77, 49, 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, 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,
+        // State 445
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 157, 0, -389, 488, 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,
+        // State 446
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 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,
+        // State 447
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 448
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 449
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 450
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, -440, -440, 0, 0, -440, -440, -440, -440, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, -440, 0,
+        // State 451
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 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,
+        // 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, -57, 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,
+        // State 454
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 455
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 456
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 457
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 458
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 459
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 460
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 461
+        171, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 354, 355, 356, 357, 0, 0, 174, 175, 0, 176, 177, 0, 146, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, 359, 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, -67, 0, 0, 0, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 463
+        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, -377, -377, 0, -377, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, -377, 0, -377, 0, -377, 0, 0, 0, 0,
+        // State 464
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, -112, 0, 0, 0, 354, 355, 356, 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, -112, 0,
+        // State 465
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115, 0, 0, 0, 0, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115, 0,
+        // 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, 179, 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, -185, 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, -187, 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, -184, 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, -186, 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, 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, -133, 0,
+        // State 472
+        -21, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, -21, -21, -21, -21, 0, 0, -21, -21, 0, -21, -21, 0, -21, -21, -21, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, -21, 0,
+        // State 473
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 474
+        0, 0, 0, -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, -198, -198, 0, -198, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, -198, 0, -198, 0, -198, 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, 481, 0, 0, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 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, 499, 0,
+        // State 477
+        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, -135, 0,
+        // State 478
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 479
+        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,
+        // State 480
+        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, 0, 0, 0, 0, 0, 0, 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, 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,
+        // State 482
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // State 484
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -454, -454, 505, 0, 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, 0, 0, 0,
+        // State 485
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 486
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -456, -456, 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,
+        // State 487
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -86, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, -86, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 489
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 490
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, -428, -428, 0, 0, -428, -428, -428, -428, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, 0, -428, 0,
+        // State 491
+        0, 0, 0, 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, -492, -492, 0, -492, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 12, 0, 0, 0, 0,
+        // State 492
+        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, -378, -378, 0, -378, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, -378, 0, -378, 0, -378, 0, 0, 0, 0,
+        // State 493
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 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, -111, 0,
+        // State 494
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, -183, 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, 0, 0, 0, -183, 0,
+        // State 495
+        -22, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, -22, -22, -22, -22, 0, 0, -22, -22, 0, -22, -22, 0, -22, -22, -22, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, -22, 0,
+        // State 496
+        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, -120, -120, 0, -120, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, -120, 0, -120, 0, -120, 0, 0, 0, 0,
+        // State 497
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -137, 0,
+        // 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, -191, 0, 0, 0, -191, 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, -26, 0, 0, -26, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0,
+        // State 500
+        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, -188, 0,
+        // 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, -126, 0, 0, 0, 0, 0, 0, 0, -126, 0, 0, 0, -126, 0,
+        // State 502
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -453, -453, 509, 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,
+        // State 503
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -455, -455, 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,
+        // State 504
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -87, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, -87, -87, -87, 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, -463, 0, 0, 0, 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,
+        // 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, -27, 0, 0, -27, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27, 0,
+        // State 508
+        0, 0, 0, 87, 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 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, -452, -452, 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,
+        // State 510
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -451, 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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        -493,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        0,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        -235,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        -485,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        -299,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        -237,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        -236,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        -219,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        -227,
+        // State 54
+        -231,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        -337,
+        // State 61
+        -341,
+        // State 62
+        -267,
+        // State 63
+        -336,
+        // State 64
+        -374,
+        // State 65
+        -338,
+        // State 66
+        -335,
+        // State 67
+        0,
+        // State 68
+        0,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        -283,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        -291,
+        // State 96
+        -295,
+        // State 97
+        -331,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        -301,
+        // State 102
+        0,
+        // State 103
+        0,
+        // State 104
+        0,
+        // State 105
+        0,
+        // State 106
+        -238,
+        // State 107
+        0,
+        // State 108
+        -221,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        -229,
+        // State 112
+        -233,
+        // State 113
+        -269,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        -300,
+        // State 118
+        0,
+        // State 119
+        -220,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        -228,
+        // State 123
+        -232,
+        // State 124
+        -268,
+        // State 125
+        0,
+        // State 126
+        -215,
+        // State 127
+        -251,
+        // State 128
+        0,
+        // State 129
+        -211,
+        // State 130
+        -223,
+        // State 131
+        -259,
+        // State 132
+        -263,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        -342,
+        // State 139
+        0,
+        // State 140
+        0,
+        // State 141
+        0,
+        // State 142
+        0,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        0,
+        // State 148
+        0,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        0,
+        // State 154
+        0,
+        // State 155
+        0,
+        // State 156
+        0,
+        // State 157
+        0,
+        // State 158
+        0,
+        // State 159
+        0,
+        // State 160
+        0,
+        // State 161
+        0,
+        // State 162
+        0,
+        // State 163
+        0,
+        // State 164
+        0,
+        // State 165
+        0,
+        // State 166
+        0,
+        // State 167
+        0,
+        // State 168
+        0,
+        // State 169
+        0,
+        // State 170
+        0,
+        // State 171
+        0,
+        // State 172
+        0,
+        // State 173
+        0,
+        // State 174
+        0,
+        // State 175
+        0,
+        // State 176
+        0,
+        // State 177
+        0,
+        // State 178
+        0,
+        // State 179
+        0,
+        // State 180
+        0,
+        // State 181
+        0,
+        // State 182
+        0,
+        // State 183
+        0,
+        // State 184
+        0,
+        // State 185
+        0,
+        // State 186
+        0,
+        // State 187
+        0,
+        // State 188
+        -279,
+        // State 189
+        -315,
+        // State 190
+        0,
+        // State 191
+        -275,
+        // State 192
+        -287,
+        // State 193
+        -323,
+        // State 194
+        -327,
+        // State 195
+        0,
+        // State 196
+        -285,
+        // State 197
+        0,
+        // State 198
+        0,
+        // State 199
+        -293,
+        // State 200
+        -297,
+        // State 201
+        -333,
+        // State 202
+        0,
+        // State 203
+        0,
+        // State 204
+        0,
+        // State 205
+        -302,
+        // State 206
+        0,
+        // State 207
+        -222,
+        // State 208
+        0,
+        // State 209
+        0,
+        // State 210
+        -230,
+        // State 211
+        -234,
+        // State 212
+        -270,
+        // State 213
+        -217,
+        // State 214
+        -253,
+        // State 215
+        0,
+        // State 216
+        -213,
+        // State 217
+        -225,
+        // State 218
+        -261,
+        // State 219
+        -265,
+        // State 220
+        0,
+        // State 221
+        -284,
+        // State 222
+        0,
+        // State 223
+        0,
+        // State 224
+        -292,
+        // State 225
+        -296,
+        // State 226
+        -332,
+        // State 227
+        -216,
+        // State 228
+        -252,
+        // State 229
+        0,
+        // State 230
+        -212,
+        // State 231
+        -224,
+        // State 232
+        -260,
+        // State 233
+        -264,
+        // State 234
+        -247,
+        // State 235
+        -207,
+        // State 236
+        -243,
+        // State 237
+        -255,
+        // State 238
+        0,
+        // State 239
+        0,
+        // State 240
+        0,
+        // State 241
+        0,
+        // State 242
+        0,
+        // State 243
+        0,
+        // State 244
+        0,
+        // State 245
+        0,
+        // State 246
+        0,
+        // State 247
+        0,
+        // State 248
+        0,
+        // State 249
+        0,
+        // State 250
+        -199,
+        // State 251
+        0,
+        // State 252
+        0,
+        // State 253
+        0,
+        // State 254
+        0,
+        // State 255
+        0,
+        // State 256
+        0,
+        // State 257
+        0,
+        // State 258
+        0,
+        // State 259
+        0,
+        // State 260
+        0,
+        // State 261
+        0,
+        // State 262
+        0,
+        // State 263
+        0,
+        // State 264
+        0,
+        // State 265
+        0,
+        // State 266
+        0,
+        // State 267
+        0,
+        // State 268
+        0,
+        // State 269
+        0,
+        // State 270
+        0,
+        // State 271
+        0,
+        // State 272
+        0,
+        // State 273
+        0,
+        // State 274
+        0,
+        // State 275
+        0,
+        // State 276
+        0,
+        // State 277
+        0,
+        // State 278
+        0,
+        // State 279
+        0,
+        // State 280
+        0,
+        // State 281
+        0,
+        // State 282
+        0,
+        // State 283
+        0,
+        // State 284
+        0,
+        // State 285
+        0,
+        // State 286
+        0,
+        // State 287
+        0,
+        // State 288
+        0,
+        // State 289
+        0,
+        // State 290
+        0,
+        // State 291
+        0,
+        // State 292
+        0,
+        // State 293
+        0,
+        // State 294
+        0,
+        // State 295
+        0,
+        // State 296
+        0,
+        // State 297
+        0,
+        // State 298
+        0,
+        // State 299
+        0,
+        // State 300
+        0,
+        // State 301
+        -311,
+        // State 302
+        -271,
+        // State 303
+        -307,
+        // State 304
+        -319,
+        // State 305
+        -281,
+        // State 306
+        -317,
+        // State 307
+        0,
+        // State 308
+        -277,
+        // State 309
+        -289,
+        // State 310
+        -325,
+        // State 311
+        -329,
+        // State 312
+        0,
+        // State 313
+        -286,
+        // State 314
+        0,
+        // State 315
+        0,
+        // State 316
+        -294,
+        // State 317
+        -298,
+        // State 318
+        -334,
+        // State 319
+        -218,
+        // State 320
+        -254,
+        // State 321
+        0,
+        // State 322
+        -214,
+        // State 323
+        -226,
+        // State 324
+        -262,
+        // State 325
+        -266,
+        // State 326
+        -249,
+        // State 327
+        -209,
+        // State 328
+        -245,
+        // State 329
+        -257,
+        // State 330
+        -280,
+        // State 331
+        -316,
+        // State 332
+        0,
+        // State 333
+        -276,
+        // State 334
+        -288,
+        // State 335
+        -324,
+        // State 336
+        -328,
+        // State 337
+        -248,
+        // State 338
+        -208,
+        // State 339
+        -244,
+        // State 340
+        -256,
+        // State 341
+        -239,
+        // State 342
+        0,
+        // State 343
+        0,
+        // State 344
+        0,
+        // State 345
+        0,
+        // State 346
+        0,
+        // State 347
+        0,
+        // State 348
+        0,
+        // State 349
+        0,
+        // State 350
+        0,
+        // State 351
+        -379,
+        // State 352
+        0,
+        // State 353
+        0,
+        // State 354
+        0,
+        // State 355
+        0,
+        // State 356
+        0,
+        // State 357
+        0,
+        // State 358
+        0,
+        // State 359
+        0,
+        // State 360
+        0,
+        // State 361
+        -200,
+        // State 362
+        0,
+        // State 363
+        -195,
+        // State 364
+        0,
+        // State 365
+        0,
+        // State 366
+        0,
+        // State 367
+        -376,
+        // State 368
+        0,
+        // State 369
+        0,
+        // State 370
+        0,
+        // State 371
+        0,
+        // State 372
+        0,
+        // State 373
+        0,
+        // State 374
+        0,
+        // State 375
+        0,
+        // State 376
+        0,
+        // State 377
+        0,
+        // State 378
+        0,
+        // State 379
+        0,
+        // State 380
+        0,
+        // State 381
+        0,
+        // State 382
+        0,
+        // State 383
+        0,
+        // State 384
+        0,
+        // State 385
+        0,
+        // State 386
+        0,
+        // State 387
+        0,
+        // State 388
+        0,
+        // State 389
+        0,
+        // State 390
+        0,
+        // State 391
+        0,
+        // State 392
+        0,
+        // State 393
+        0,
+        // State 394
+        -303,
+        // State 395
+        -313,
+        // State 396
+        -273,
+        // State 397
+        -309,
+        // State 398
+        -321,
+        // State 399
+        -282,
+        // State 400
+        -318,
+        // State 401
+        0,
+        // State 402
+        -278,
+        // State 403
+        -290,
+        // State 404
+        -326,
+        // State 405
+        -330,
+        // State 406
+        -250,
+        // State 407
+        -210,
+        // State 408
+        -246,
+        // State 409
+        -258,
+        // State 410
+        -241,
+        // State 411
+        -312,
+        // State 412
+        -272,
+        // State 413
+        -308,
+        // State 414
+        -320,
+        // State 415
+        -240,
+        // State 416
+        0,
+        // State 417
+        -380,
+        // State 418
+        -375,
+        // State 419
+        0,
+        // State 420
+        0,
+        // State 421
+        0,
+        // State 422
+        0,
+        // State 423
+        -119,
+        // State 424
+        0,
+        // State 425
+        0,
+        // State 426
+        0,
+        // State 427
+        0,
+        // State 428
+        0,
+        // State 429
+        0,
+        // State 430
+        0,
+        // State 431
+        0,
+        // State 432
+        -197,
+        // State 433
+        -196,
+        // State 434
+        0,
+        // State 435
+        0,
+        // State 436
+        0,
+        // State 437
+        0,
+        // State 438
+        0,
+        // State 439
+        0,
+        // State 440
+        0,
+        // State 441
+        0,
+        // State 442
+        0,
+        // State 443
+        0,
+        // State 444
+        0,
+        // State 445
+        0,
+        // State 446
+        0,
+        // State 447
+        0,
+        // State 448
+        0,
+        // State 449
+        0,
+        // State 450
+        0,
+        // State 451
+        0,
+        // State 452
+        0,
+        // State 453
+        0,
+        // State 454
+        -305,
+        // State 455
+        -314,
+        // State 456
+        -274,
+        // State 457
+        -310,
+        // State 458
+        -322,
+        // State 459
+        -242,
+        // State 460
+        -304,
+        // State 461
+        0,
+        // State 462
+        0,
+        // State 463
+        -377,
+        // State 464
+        0,
+        // State 465
+        0,
+        // State 466
+        0,
+        // State 467
+        0,
+        // State 468
+        0,
+        // State 469
+        0,
+        // State 470
+        0,
+        // State 471
+        0,
+        // State 472
+        0,
+        // State 473
+        0,
+        // State 474
+        -198,
+        // State 475
+        0,
+        // State 476
+        0,
+        // State 477
+        0,
+        // State 478
+        0,
+        // State 479
+        0,
+        // State 480
+        0,
+        // State 481
+        0,
+        // State 482
+        0,
+        // State 483
+        0,
+        // State 484
+        0,
+        // State 485
+        0,
+        // State 486
+        0,
+        // State 487
+        0,
+        // State 488
+        0,
+        // State 489
+        0,
+        // State 490
+        0,
+        // State 491
+        -306,
+        // State 492
+        -378,
+        // State 493
+        0,
+        // State 494
+        0,
+        // State 495
+        0,
+        // State 496
+        -120,
+        // State 497
+        0,
+        // State 498
+        0,
+        // State 499
+        0,
+        // State 500
+        0,
+        // State 501
+        0,
+        // State 502
+        0,
+        // State 503
+        0,
+        // State 504
+        0,
+        // State 505
+        0,
+        // State 506
+        0,
+        // State 507
+        0,
+        // State 508
+        0,
+        // State 509
+        0,
+        // State 510
+        0,
+    ];
+    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, 2, 0, 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, 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, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 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,
+        // 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, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 2, 0, 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, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 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, 20, 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,
+        // 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,
+        // 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, 23, 0, 24, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 31, 0, 32, 0, 0, 0, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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, 2, 0, 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, 20, 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, 38, 0, 39, 0, 0, 0, 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,
+        // 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, 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,
+        // 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,
+        // 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, 43, 0, 44, 0, 0, 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, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 25
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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, 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, 74, 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, 76, 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, 78, 0, 0, 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, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 94, 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, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 99, 0, 100, 0, 0, 0, 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, 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, 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,
+        // 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, 104, 0, 105, 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,
+        // 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, 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,
+        // 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, 110, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 115, 0, 116, 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 121, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 138, 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 142, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 74, 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, 150, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 155, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 167, 0, 0, 168, 169, 0, 170, 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, 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, 83, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 181, 0, 0, 0, 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 198, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 204, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // State 127
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 141, 0, 0, 0, 0, 0, 0, 0, 0, 241, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 246, 0, 247, 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, 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, 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, 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, 254, 255, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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, 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, 83, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 265, 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,
+        // 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, 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, 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, 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, 83, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 270, 0, 271, 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, 79, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 161, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 287, 168, 169, 0, 170, 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, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 0, 0, 0, 289, 169, 0, 170, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 292, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 294, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 295, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // 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,
+        // 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, 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, 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, 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,
+        // State 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 62, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 315, 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,
+        // 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,
+        // State 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 62, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 345, 255, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 349, 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 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, 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,
+        // 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, 246, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 367, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 165, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 79, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 372, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // State 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, 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, 83, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 270, 0, 375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 274, 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, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 385, 0, 0, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 387, 0, 0, 168, 169, 0, 170, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 390, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 417, 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 387, 0, 0, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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,
+        // State 358
+        0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 430, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 246, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 79, 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 449, 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,
+        // 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 450, 0, 0, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 0, 0, 0, 453, 169, 0, 170, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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, 350, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // State 434
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 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, 163, 479, 165, 0, 0, 0, 0, 166, 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 482, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 185, 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, 79, 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 449, 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,
+        // 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, 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, 446, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 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, 449, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 0, 0, 0, 0, 0, 62, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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, 0, 0, 0, 0, 0, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 0, 0, 0, 0, 0,
+        // 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, 350, 0, 351, 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, 161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164, 165, 0, 0, 0, 0, 166, 286, 0, 353, 168, 169, 0, 170, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 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, 163, 479, 165, 0, 0, 0, 0, 166, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 507, 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,
+        // 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,
+        // 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,
+        // 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, 2, 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, 61, 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, 64, 65, 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, 67, 0, 0, 68, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 510, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 511, 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct GrammarParser {
+        _priv: (),
+    }
+
+    impl GrammarParser {
+        pub fn new() -> GrammarParser {
+            GrammarParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Grammar, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Grammar,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                // ___Grammar = Grammar => ActionFn(0);
+                let ___sym0 = ___pop_Variant63(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action0::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___Grammar::GrammarParser;
+
+mod ___parse___GrammarWhereClauses {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    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, 3, 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,
+        // State 2
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 3
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // State 6
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 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,
+        // State 8
+        0, 0, 0, 0, 0, 0, -389, -389, 0, -389, -389, 0, 0, -389, 25, 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,
+        // State 9
+        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,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, -478, 0, -478, -478, 0, 0, -478, 0, 0, 27, 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,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 12
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 13
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 17, 0, 19, 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, -360, -360, 0, -360, -360, 0, 0, -360, -360, 0, -360, -360, 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,
+        // State 17
+        0, 0, 0, -362, 0, -362, -362, 0, 0, -362, -362, 0, 0, -362, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 18
+        0, 0, 0, 0, 0, 0, -361, -361, 0, -361, -361, 0, 0, -361, -361, 0, -361, -361, 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,
+        // State 19
+        0, 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,
+        // State 20
+        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, 0, 0, 0, 0, 0, 0, 0,
+        // State 21
+        0, 0, 0, 0, 0, 0, -390, -390, 0, -390, -390, 0, 0, -390, 59, 0, -390, 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,
+        // State 22
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 23
+        0, 0, 0, -41, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, -46, 0, -46, 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, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 26
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 17, 18, 19, 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, -412, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        0, 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, 0, 0, 0, 0, 0, 0,
+        // State 30
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 31
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 32
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 33
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 34
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 35
+        -430, 0, 0, -430, 0, 0, -430, -430, 79, 80, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 81, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 37
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 38
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 39
+        39, 0, 0, 0, 0, 0, 40, -193, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 40
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 87, 0, 88, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 41
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 42
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 43
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 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, -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,
+        // State 46
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 48
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        0, 0, 0, 0, 0, 0, 0, -476, 0, -476, -476, 0, 0, -476, 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,
+        // State 50
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 13, 0, 14, 15, -178, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 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,
+        // State 53
+        0, 0, 0, 0, 0, 0, 0, -175, 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,
+        // 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, 17, 0, 19, 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, -387, -387, 0, -387, -387, 0, 0, -387, 25, 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,
+        // 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, -148, 0, 0, 0, 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,
+        // State 57
+        0, 0, 0, -42, 0, -42, -42, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, -42, -42, 0, 0, 0, 0, 0, 0, 0, 0, -42, 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, -47, 0, -47, 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, -412, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        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, 18, 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, 101, -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,
+        // State 62
+        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,
+        // State 63
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 66
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 67
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 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,
+        // State 68
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -414, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 20, 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, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -450, -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,
+        // State 71
+        0, 0, 0, 0, 0, 0, 107, 0, 0, -458, -458, 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,
+        // State 72
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 109, -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,
+        // State 74
+        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, 0, 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
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, -164, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, -472, 0, -472, -472, 0, 0, -472, 0, 0, 0, 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,
+        // State 77
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 78
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 79
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 80
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 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, 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,
+        // State 82
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        39, 0, 0, 0, 0, 0, 40, -194, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, 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,
+        // State 85
+        0, 0, 0, 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 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,
+        // State 86
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 87
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 88
+        0, 0, 0, 0, 0, 0, 0, -475, 0, -475, -475, 0, 0, -475, 0, 0, 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,
+        // State 89
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        0, 0, 0, 0, 0, 0, 0, -474, 0, -474, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 91
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 92
+        0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, 0, 0, -471, 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,
+        // State 93
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -388, -388, 0, -388, -388, 0, 0, -388, 59, 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,
+        // 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, -150, 0, 0, 0, 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,
+        // 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, 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,
+        // State 97
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 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,
+        // State 98
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 99
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 122, -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,
+        // State 100
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 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, 123, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 0, -477, 0, -477, -477, 0, 0, -477, 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,
+        // State 103
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 104
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 124, -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,
+        // State 105
+        0, 0, 0, 0, 0, 0, 125, 0, 0, -457, -457, 0, 0, 0, 0, 0, 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,
+        // State 106
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 107
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 109
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, -166, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 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, 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,
+        // State 111
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 112
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 113
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 114
+        39, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 115
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, -473, -473, 0, 0, -473, 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,
+        // State 117
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // State 119
+        0, 0, 0, -204, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, 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, -56, 0, 0, 0, 0, 0, 0, -56, 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, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, -82, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 124
+        0, 0, 0, 13, 0, 14, 15, -176, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 127
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 17, 18, 19, 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, 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,
+        // State 129
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, 0, 0, 25, 0, -389, 144, 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,
+        // State 130
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 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,
+        // State 131
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 132
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 133
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 134
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 135
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 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,
+        // 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, -57, 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,
+        // State 138
+        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,
+        // 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, 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,
+        // State 140
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -454, -454, 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 141
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 142
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -456, -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,
+        // State 143
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -86, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 0, 0, 0, -86, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 145
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 146
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 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, -453, -453, 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,
+        // State 148
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -455, -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,
+        // State 149
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 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, -87, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, -87, -87, -87, 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, -463, 0, 0, 0, 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,
+        // State 152
+        0, 0, 0, 13, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 153
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -452, -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,
+        // State 154
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        -494,
+        // State 2
+        -144,
+        // State 3
+        -146,
+        // State 4
+        0,
+        // State 5
+        -357,
+        // State 6
+        0,
+        // State 7
+        -143,
+        // State 8
+        -389,
+        // State 9
+        0,
+        // State 10
+        -478,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        -360,
+        // State 17
+        -362,
+        // State 18
+        -361,
+        // State 19
+        0,
+        // State 20
+        -145,
+        // State 21
+        -390,
+        // State 22
+        0,
+        // State 23
+        -41,
+        // State 24
+        0,
+        // State 25
+        -408,
+        // State 26
+        0,
+        // State 27
+        -412,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        -476,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        -387,
+        // State 56
+        0,
+        // State 57
+        -42,
+        // State 58
+        0,
+        // State 59
+        -412,
+        // State 60
+        -410,
+        // State 61
+        -407,
+        // State 62
+        -352,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        -414,
+        // State 69
+        0,
+        // State 70
+        -450,
+        // State 71
+        -458,
+        // State 72
+        -466,
+        // State 73
+        -411,
+        // State 74
+        -354,
+        // State 75
+        0,
+        // State 76
+        -472,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        -475,
+        // State 89
+        0,
+        // State 90
+        -474,
+        // State 91
+        0,
+        // State 92
+        -471,
+        // State 93
+        0,
+        // State 94
+        -388,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        -353,
+        // State 99
+        -409,
+        // State 100
+        -51,
+        // State 101
+        0,
+        // State 102
+        -477,
+        // State 103
+        0,
+        // State 104
+        -413,
+        // State 105
+        -457,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        -81,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        0,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        -473,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        -52,
+        // State 122
+        0,
+        // State 123
+        -82,
+        // State 124
+        0,
+        // State 125
+        0,
+        // State 126
+        0,
+        // State 127
+        0,
+        // State 128
+        0,
+        // State 129
+        0,
+        // State 130
+        0,
+        // State 131
+        0,
+        // State 132
+        0,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        0,
+        // State 139
+        0,
+        // State 140
+        -454,
+        // State 141
+        0,
+        // State 142
+        -456,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        -453,
+        // State 148
+        -455,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        -452,
+        // State 154
+        -451,
+    ];
+    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, 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,
+        // 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,
+        // 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, 4, 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, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 23, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 35, 0, 0, 36, 37, 0, 38, 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, 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, 9, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 50, 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, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 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, 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, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 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, 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, 9, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 67, 0, 68, 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 75, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 82, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 83, 0, 84, 36, 37, 0, 38, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 0, 0, 0, 86, 37, 0, 38, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 91, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 92, 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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, 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, 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, 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,
+        // 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,
+        // 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,
+        // 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 99, 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, 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,
+        // 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,
+        // 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,
+        // 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, 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, 9, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 67, 0, 102, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 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, 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, 9, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 112, 0, 0, 36, 37, 0, 38, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 114, 0, 0, 36, 37, 0, 38, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 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, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 134, 0, 0, 36, 37, 0, 38, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 29, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 0, 0, 34, 0, 0, 0, 137, 37, 0, 38, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 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, 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, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 133, 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,
+        // State 127
+        0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 133, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 152, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 154, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct GrammarWhereClausesParser {
+        _priv: (),
+    }
+
+    impl GrammarWhereClausesParser {
+        pub fn new() -> GrammarWhereClausesParser {
+            GrammarWhereClausesParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Vec<WhereClause<TypeRef>>, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Vec<WhereClause<TypeRef>>,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                let ___sym0 = ___pop_Variant48(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action1::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___GrammarWhereClauses::GrammarWhereClausesParser;
+
+mod ___parse___MatchMapping {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    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, 8, 0, 0, 9, 10, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        -495,
+        // State 2
+        -417,
+        // State 3
+        -448,
+        // State 4
+        -416,
+        // State 5
+        -415,
+        // State 6
+        -372,
+        // State 7
+        -449,
+        // State 8
+        -418,
+        // State 9
+        -427,
+    ];
+    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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct MatchMappingParser {
+        _priv: (),
+    }
+
+    impl MatchMappingParser {
+        pub fn new() -> MatchMappingParser {
+            MatchMappingParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<TerminalString, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<TerminalString,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                // ___MatchMapping = MatchMapping => ActionFn(3);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action3::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___MatchMapping::MatchMappingParser;
+
+mod ___parse___Pattern {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 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, 12, 0, 13, 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, -389, -389, 0, 0, -389, 0, 0, 0, 16, 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, -389, -389, 0,
+        // State 3
+        0, 0, 0, 0, 0, 0, 17, -406, 0, 0, -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, 18, -406, 0,
+        // 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,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, -391, 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, -391, 0,
+        // State 6
+        0, 0, 0, 0, 0, 0, 7, -160, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 0, 0, 0, 0, -402, 0, 0, -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, -402, 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, 12, 0, 13, 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, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, -405, 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, -405, 0,
+        // State 11
+        0, 0, 0, 0, 0, 0, -360, -360, 0, 0, -360, 0, 0, -360, -360, 0, -360, 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, -360, -360, 0,
+        // State 12
+        0, 0, 0, 0, 0, 0, -361, -361, 0, 0, -361, 0, 0, -361, -361, 0, -361, 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, -361, -361, 0,
+        // State 13
+        0, 0, 0, 0, 0, 0, 0, -401, 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, -401, 0,
+        // State 14
+        0, 0, 0, 0, 0, 0, -390, -390, 0, 0, -390, 0, 0, 0, 29, 0, -390, 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, -390, -390, 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, -46, 0, -46, 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, 7, -160, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 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, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
+        // State 18
+        0, 0, 0, 0, 0, 0, 7, -162, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        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, 0, 0, 0, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 0, 0, 0, 0, -159, 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, 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, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        0, 0, 0, 0, 0, 0, -387, -387, 0, 0, -387, 0, 0, 0, 16, 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, -387, -387, 0,
+        // State 23
+        0, 0, 0, 0, 0, 0, 0, -478, 0, 0, -478, 0, 0, 0, 0, 0, 40, 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,
+        // 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, 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,
+        // State 25
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 26
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 64, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        0, 0, 0, 26, 0, 27, 28, -176, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 30
+        0, 0, 0, 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, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0,
+        // State 31
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74, 0,
+        // State 32
+        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, 0, 0, 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, 76, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 0, -396, 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, -396, 0,
+        // State 35
+        0, 0, 0, 0, 0, 0, 0, -161, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 36
+        0, 0, 0, 0, 0, 0, 0, -404, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -404, 0,
+        // State 37
+        0, 0, 0, 0, 0, 0, -71, -71, 0, 0, 0, 0, -71, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, -71, 0, -71, 0, 0, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 38
+        0, 0, 0, 0, 0, 0, -388, -388, 0, 0, -388, 0, 0, 0, 29, 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, -388, -388, 0,
+        // State 39
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 12, 64, 13, 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, -403, 0, 0, -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, -403, 0,
+        // State 41
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 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, 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,
+        // State 43
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 45
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 46
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        0, 0, 0, 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,
+        // State 48
+        -430, 0, 0, -430, 0, 0, -430, -430, 86, 87, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 88, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 50
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 51
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 52
+        52, 0, 0, 0, 0, 0, 53, -193, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 53
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 94, 0, 95, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 54
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 55
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 56
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 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, -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,
+        // State 59
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 61
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0,
+        // State 62
+        0, 0, 0, 0, 0, 0, 0, -476, 0, 0, -476, 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,
+        // State 63
+        0, 0, 0, -362, 0, -362, -362, 0, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 64
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, 26, 0, 27, 28, -178, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 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, 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,
+        // State 67
+        0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 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,
+        // State 68
+        0, 0, 0, 0, 0, 0, 0, -394, 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, -394, 0,
+        // State 69
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 103, 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, 104, 0,
+        // State 71
+        0, 0, 0, 0, 0, 0, 0, -398, 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, -398, 0,
+        // State 72
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0,
+        // State 73
+        0, 0, 0, 0, 0, 0, 0, -395, 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, -395, 0,
+        // State 74
+        0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, 0, 0, 0, 0, 0, 0, -399, 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, -399, 0,
+        // State 76
+        0, 0, 0, 0, 0, 0, -72, -72, 0, 0, 0, 0, -72, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, -72, 0, -72, 0, 0, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 12, 64, 13, 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, 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,
+        // State 79
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 80
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 81
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 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,
+        // State 82
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, -164, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        0, 0, 0, 0, 0, 0, 0, -472, 0, 0, -472, 0, 0, 0, 0, 0, 0, 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,
+        // State 84
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 85
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 86
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 88
+        0, 0, 0, 0, 0, 0, 0, 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,
+        // State 89
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        52, 0, 0, 0, 0, 0, 53, -194, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 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, 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,
+        // State 92
+        0, 0, 0, 0, 0, 0, 0, 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 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,
+        // State 93
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 94
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 95
+        0, 0, 0, 0, 0, 0, 0, -475, 0, 0, -475, 0, 0, 0, 0, 0, 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,
+        // State 96
+        0, 0, 0, 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 97
+        0, 0, 0, 0, 0, 0, 0, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 98
+        0, 0, 0, 0, 0, 0, 0, -177, 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,
+        // State 99
+        0, 0, 0, 0, 0, 0, 0, -471, 0, 0, -471, 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,
+        // State 100
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, 0, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, 0,
+        // State 102
+        0, 0, 0, 0, 0, 0, 0, -397, 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, -397, 0,
+        // State 103
+        0, 0, 0, 0, 0, 0, 0, -400, 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, -400, 0,
+        // State 104
+        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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0,
+        // State 105
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 106
+        0, 0, 0, 0, 0, 0, 0, -477, 0, 0, -477, 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,
+        // State 107
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 108
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, -166, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 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, 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,
+        // State 110
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 111
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 112
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 113
+        52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 58, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 114
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, 0, -473, 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,
+        // State 116
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 117
+        0, 0, 0, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 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, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 119
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 120
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 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,
+        // State 122
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 123
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        -389,
+        // State 3
+        -406,
+        // State 4
+        -496,
+        // State 5
+        -391,
+        // State 6
+        0,
+        // State 7
+        -402,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        -405,
+        // State 11
+        -360,
+        // State 12
+        -361,
+        // State 13
+        -401,
+        // State 14
+        -390,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        -387,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        -396,
+        // State 35
+        0,
+        // State 36
+        -404,
+        // State 37
+        0,
+        // State 38
+        -388,
+        // State 39
+        0,
+        // State 40
+        -403,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        0,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        -394,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        -398,
+        // State 72
+        0,
+        // State 73
+        -395,
+        // State 74
+        0,
+        // State 75
+        -399,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        0,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        0,
+        // State 102
+        -397,
+        // State 103
+        -400,
+        // State 104
+        0,
+        // State 105
+        0,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        0,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        0,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        0,
+        // State 123
+        0,
+    ];
+    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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 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,
+        // 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,
+        // 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 25, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 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,
+        // State 17
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 36, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 48, 0, 0, 49, 50, 0, 51, 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, 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, 3, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 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, 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, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 3, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 81, 0, 82, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 42, 89, 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, 44, 45, 46, 0, 0, 0, 0, 47, 90, 0, 91, 49, 50, 0, 51, 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, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, 0, 0, 0, 0, 47, 0, 0, 0, 93, 50, 0, 51, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 98, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 99, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 105, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 81, 0, 106, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 111, 0, 0, 49, 50, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 113, 0, 0, 49, 50, 0, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 119, 0, 0, 49, 50, 0, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 42, 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, 44, 45, 46, 0, 0, 0, 0, 47, 0, 0, 0, 122, 50, 0, 51, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // State 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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, 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,
+        // 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,
+        // 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,
+    ];
+    fn ___expected_tokens(___state: usize) -> Vec<::std::string::String> {
+        const ___TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct PatternParser {
+        _priv: (),
+    }
+
+    impl PatternParser {
+        pub fn new() -> PatternParser {
+            PatternParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<Pattern<TypeRef>, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<Pattern<TypeRef>,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                // ___Pattern = Pattern => ActionFn(4);
+                let ___sym0 = ___pop_Variant26(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action4::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            497 => {
+                (|| {
+                    // ___TypeRef = TypeRef => ActionFn(2);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action2::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 170)
+                })()
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___Pattern::PatternParser;
+
+mod ___parse___TypeRef {
+    #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens)]
+
+    use string_cache::DefaultAtom as Atom;
+    use grammar::parse_tree::*;
+    use grammar::pattern::*;
+    use std::iter::once;
+    use tok::{self, Tok};
+    use util::strip;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as ___lalrpop_util;
+    use super::___ToTriple;
+    #[allow(dead_code)]
+    pub enum ___Symbol<'input>
+     {
+        Variant0(Tok<'input>),
+        Variant1(&'input str),
+        Variant2(::std::option::Option<Tok<'input>>),
+        Variant3(TypeRef),
+        Variant4(::std::option::Option<TypeRef>),
+        Variant5(Vec<TypeBoundParameter<TypeRef>>),
+        Variant6(::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>),
+        Variant7(Condition),
+        Variant8(::std::option::Option<Condition>),
+        Variant9(()),
+        Variant10(Alternative),
+        Variant11(::std::vec::Vec<Alternative>),
+        Variant12(Conversion),
+        Variant13(::std::vec::Vec<Conversion>),
+        Variant14(FieldPattern<TypeRef>),
+        Variant15(::std::vec::Vec<FieldPattern<TypeRef>>),
+        Variant16(Parameter),
+        Variant17(::std::vec::Vec<Parameter>),
+        Variant18(WhereClause<TypeRef>),
+        Variant19(::std::vec::Vec<WhereClause<TypeRef>>),
+        Variant20(Atom),
+        Variant21(::std::vec::Vec<Atom>),
+        Variant22(MatchItem),
+        Variant23(::std::vec::Vec<MatchItem>),
+        Variant24(NonterminalString),
+        Variant25(::std::vec::Vec<NonterminalString>),
+        Variant26(Pattern<TypeRef>),
+        Variant27(::std::vec::Vec<Pattern<TypeRef>>),
+        Variant28(Symbol),
+        Variant29(::std::vec::Vec<Symbol>),
+        Variant30(TypeBound<TypeRef>),
+        Variant31(::std::vec::Vec<TypeBound<TypeRef>>),
+        Variant32(TypeBoundParameter<TypeRef>),
+        Variant33(::std::vec::Vec<TypeBoundParameter<TypeRef>>),
+        Variant34(TypeParameter),
+        Variant35(::std::vec::Vec<TypeParameter>),
+        Variant36(::std::vec::Vec<TypeRef>),
+        Variant37(usize),
+        Variant38(ActionKind),
+        Variant39(::std::option::Option<ActionKind>),
+        Variant40(::std::option::Option<Alternative>),
+        Variant41(Vec<Alternative>),
+        Variant42(Annotation),
+        Variant43(::std::vec::Vec<Annotation>),
+        Variant44(AssociatedType),
+        Variant45(::std::vec::Vec<AssociatedType>),
+        Variant46(Vec<Conversion>),
+        Variant47(Vec<Parameter>),
+        Variant48(Vec<WhereClause<TypeRef>>),
+        Variant49(Vec<Atom>),
+        Variant50(Vec<MatchItem>),
+        Variant51(Vec<NonterminalString>),
+        Variant52(Vec<Pattern<TypeRef>>),
+        Variant53(Vec<Symbol>),
+        Variant54(Vec<TypeParameter>),
+        Variant55(Vec<TypeRef>),
+        Variant56(ConditionOp),
+        Variant57(::std::option::Option<Conversion>),
+        Variant58(EnumToken),
+        Variant59(ExprSymbol),
+        Variant60(GrammarItem),
+        Variant61(::std::option::Option<FieldPattern<TypeRef>>),
+        Variant62(::std::option::Option<Vec<Atom>>),
+        Variant63(Grammar),
+        Variant64(::std::vec::Vec<GrammarItem>),
+        Variant65(::std::option::Option<Parameter>),
+        Variant66(::std::option::Option<Vec<Parameter>>),
+        Variant67(::std::option::Option<Vec<TypeParameter>>),
+        Variant68(::std::option::Option<WhereClause<TypeRef>>),
+        Variant69(::std::option::Option<Vec<WhereClause<TypeRef>>>),
+        Variant70(::std::option::Option<Atom>),
+        Variant71(MatchContents),
+        Variant72(::std::option::Option<MatchItem>),
+        Variant73(TerminalString),
+        Variant74(TerminalLiteral),
+        Variant75(MatchToken),
+        Variant76((NonterminalString, Vec<NonterminalString>)),
+        Variant77(::std::option::Option<NonterminalString>),
+        Variant78(Path),
+        Variant79(::std::option::Option<Pattern<TypeRef>>),
+        Variant80(PatternKind<TypeRef>),
+        Variant81(Vec<TypeBound<TypeRef>>),
+        Variant82(RepeatOp),
+        Variant83(String),
+        Variant84(::std::vec::Vec<String>),
+        Variant85(::std::option::Option<Symbol>),
+        Variant86(SymbolKind),
+        Variant87(::std::option::Option<TypeBound<TypeRef>>),
+        Variant88(::std::option::Option<TypeBoundParameter<TypeRef>>),
+        Variant89(::std::option::Option<TypeParameter>),
+        Variant90(Visibility),
+    }
+    const ___ACTION: &'static [i16] = &[
+        // State 0
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 10, 0, 11, 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, -389, 0, 0, -389, 0, 0, 0, 13, 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,
+        // State 3
+        0, 0, 0, 0, 0, 0, 0, -478, 0, 0, -478, 0, 0, 0, 0, 0, 14, 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,
+        // 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,
+        // State 5
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 6
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 37, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        0, 0, 0, 6, 0, 7, 8, -176, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 10, 0, 11, 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, -360, 0, 0, -360, 0, 0, 0, -360, 0, -360, 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,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, -361, 0, 0, -361, 0, 0, 0, -361, 0, -361, 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,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, -390, 0, 0, -390, 0, 0, 0, 44, 0, -390, 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,
+        // 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, -46, 0, -46, 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, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 10, 37, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        -443, 0, 0, -443, 0, 0, -443, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, 0, -443, -443, -443, 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, 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,
+        // State 16
+        -417, 0, 0, -417, 0, 0, -417, -417, -417, -417, -417, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, -417, -417, -417, -417, 0, -417, -417, 0, -417, -417, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 17
+        -441, 0, 0, -441, 0, 0, -441, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, 0, -441, -441, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 18
+        -416, 0, 0, -416, 0, 0, -416, -416, -416, -416, -416, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, -416, -416, -416, -416, 0, -416, -416, 0, -416, -416, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        -415, 0, 0, -415, 0, 0, -415, -415, -415, -415, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, -415, -415, -415, 0, -415, -415, 0, -415, -415, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 20
+        0, 0, 0, 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,
+        // State 21
+        -430, 0, 0, -430, 0, 0, -430, -430, 53, 54, -430, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, -430, 55, -430, -430, 0, -430, -430, 0, -430, -430, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        -435, 0, 0, -435, 0, 0, -435, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, 0, -435, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 23
+        -437, 0, 0, -437, 0, 0, -437, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, 0, -437, -437, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 24
+        -447, 0, 0, -447, 0, 0, -447, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, 0, -447, -447, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 25
+        25, 0, 0, 0, 0, 0, 26, -193, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 26
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 61, 0, 62, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        -445, 0, 0, -445, 0, 0, -445, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, 0, -445, -445, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        -446, 0, 0, -446, 0, 0, -446, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, 0, -446, -446, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        -192, 0, 0, -192, 0, 0, -192, -192, -192, -192, -192, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192, 0, -192, -192, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 30
+        -442, 0, 0, -442, 0, 0, -442, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, 0, -442, -442, -442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 31
+        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,
+        // State 32
+        -418, 0, 0, -418, 0, 0, -418, -418, -418, -418, -418, 0, 0, 0, 0, 0, -418, 0, 0, 0, 0, 0, 0, -418, -418, -418, -418, 0, -418, -418, 0, -418, -418, -418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 33
+        -427, 0, 0, -427, 0, 0, -427, -427, -427, -427, -427, 0, 0, 0, 0, 0, -427, 0, 0, 0, 0, 0, 0, -427, -427, -427, -427, 0, -427, -427, 0, -427, -427, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 34
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
+        // State 35
+        0, 0, 0, 0, 0, 0, 0, -476, 0, 0, -476, 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,
+        // State 36
+        0, 0, 0, -362, 0, -362, -362, 0, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0,
+        // State 37
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 6, 0, 7, 8, -178, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, 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,
+        // State 40
+        0, 0, 0, 0, 0, 0, 0, -175, 0, 0, 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,
+        // 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, 10, 0, 11, 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, -387, 0, 0, -387, 0, 0, 0, 13, 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,
+        // 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, -47, 0, -47, 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, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 10, 37, 11, 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, 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,
+        // State 46
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 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,
+        // State 47
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 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,
+        // State 48
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 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,
+        // State 49
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, -164, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, -472, 0, 0, -472, 0, 0, 0, 0, 0, 0, 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,
+        // State 51
+        -436, 0, 0, -436, 0, 0, -436, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, 0, -436, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 52
+        -420, 0, 0, -420, 0, 0, -420, -420, -420, -420, -420, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, -420, -420, -420, -420, 0, -420, -420, 0, -420, -420, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 53
+        -419, 0, 0, -419, 0, 0, -419, -419, -419, -419, -419, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, -419, -419, -419, -419, 0, -419, -419, 0, -419, -419, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 54
+        -421, 0, 0, -421, 0, 0, -421, -421, -421, -421, -421, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, -421, -421, -421, -421, 0, -421, -421, 0, -421, -421, -421, 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, 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,
+        // State 56
+        -433, 0, 0, 0, 0, 0, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, -433, -433, 0, -433, -433, 0, -433, -433, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        25, 0, 0, 0, 0, 0, 26, -194, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, 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,
+        // State 59
+        0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 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,
+        // State 60
+        0, 0, 0, 0, 0, 0, 0, 0, -442, -442, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, -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,
+        // State 61
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 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,
+        // State 62
+        0, 0, 0, 0, 0, 0, 0, -475, 0, 0, -475, 0, 0, 0, 0, 0, 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,
+        // State 63
+        0, 0, 0, 6, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 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, -474, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 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,
+        // State 66
+        0, 0, 0, 0, 0, 0, 0, -471, 0, 0, -471, 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,
+        // State 67
+        0, 0, 0, -96, 0, -96, -96, -96, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, -96, 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, -388, 0, 0, -388, 0, 0, 0, 44, 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,
+        // State 69
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 70
+        0, 0, 0, 0, 0, 0, 0, -477, 0, 0, -477, 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,
+        // State 71
+        0, 0, 0, -101, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, 0, 0, 0, -101, 0, 0, 0, 0, 0, -101, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 72
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, -166, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 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, 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,
+        // State 74
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 75
+        -444, 0, 0, -444, 0, 0, -444, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, 0, -444, -444, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 76
+        -434, 0, 0, 0, 0, 0, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, -434, -434, 0, -434, -434, 0, -434, -434, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 30, 31, 0, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 78
+        -429, 0, 0, -429, 0, 0, -429, -429, 0, 0, -429, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, -429, 0, -429, -429, 0, -429, -429, 0, -429, -429, -429, 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, -473, 0, 0, -473, 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,
+        // State 80
+        0, 0, 0, -97, 0, -97, -97, -97, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, -97, 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, -102, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, 0, 0, 0, 0, -102, -102, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -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,
+        // State 83
+        -440, 0, 0, -440, 0, 0, -440, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, 0, -440, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 84
+        -76, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, 0, 0, 0, 0, 0, 0, -76, 0, -76, -76, 0, -76, -76, 0, -76, -76, -76, 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, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 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,
+        // State 86
+        -77, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, -77, 0, -77, -77, 0, -77, -77, 0, -77, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        -428, 0, 0, -428, 0, 0, -428, -428, 0, 0, -428, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, -428, 0, -428, -428, 0, -428, -428, 0, -428, -428, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    const ___EOF_ACTION: &'static [i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        -389,
+        // State 3
+        -478,
+        // State 4
+        -497,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        -360,
+        // State 10
+        -361,
+        // State 11
+        -390,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        -476,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        -387,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        -472,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        -475,
+        // State 63
+        0,
+        // State 64
+        -474,
+        // State 65
+        0,
+        // State 66
+        -471,
+        // State 67
+        0,
+        // State 68
+        -388,
+        // State 69
+        0,
+        // State 70
+        -477,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        -473,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+    ];
+    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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 5, 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 21, 0, 0, 22, 23, 0, 24, 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, 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, 3, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 36, 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, 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, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 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, 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 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, 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, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 0, 49, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 15, 56, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 57, 0, 58, 22, 23, 0, 24, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 0, 0, 0, 60, 23, 0, 24, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 65, 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 66, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 0, 70, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 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, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 75, 0, 0, 22, 23, 0, 24, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 77, 0, 0, 22, 23, 0, 24, 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,
+        // 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, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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,
+        // 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,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 17, 18, 19, 0, 0, 0, 0, 20, 83, 0, 0, 22, 23, 0, 24, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 15, 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, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 20, 0, 0, 0, 86, 23, 0, 24, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+        // 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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] = &[
+            r###""!""###,
+            r###""!=""###,
+            r###""!~""###,
+            r###""#""###,
+            r###""#![...]""###,
+            r###""&""###,
+            r###""(""###,
+            r###"")""###,
+            r###""*""###,
+            r###""+""###,
+            r###"",""###,
+            r###""->""###,
+            r###""..""###,
+            r###"":""###,
+            r###""::""###,
+            r###"";""###,
+            r###""<""###,
+            r###""=""###,
+            r###""==""###,
+            r###""=>""###,
+            r###""=>?""###,
+            r###""=>@L""###,
+            r###""=>@R""###,
+            r###"">""###,
+            r###""?""###,
+            r###""@L""###,
+            r###""@R""###,
+            r###""CharLiteral""###,
+            r###""Escape""###,
+            r###""Id""###,
+            r###""Lifetime""###,
+            r###""MacroId""###,
+            r###""RegexLiteral""###,
+            r###""StringLiteral""###,
+            r###""[""###,
+            r###""]""###,
+            r###""_""###,
+            r###""else""###,
+            r###""enum""###,
+            r###""extern""###,
+            r###""for""###,
+            r###""grammar""###,
+            r###""if""###,
+            r###""match""###,
+            r###""mut""###,
+            r###""pub""###,
+            r###""type""###,
+            r###""use""###,
+            r###""where""###,
+            r###""{""###,
+            r###""}""###,
+            r###""~~""###,
+        ];
+        ___ACTION[(___state * 52)..].iter().zip(___TERMINAL).filter_map(|(&state, terminal)| {
+            if state == 0 {
+                None
+            } else {
+                Some(terminal.to_string())
+            }
+        }).collect()
+    }
+    pub struct TypeRefParser {
+        _priv: (),
+    }
+
+    impl TypeRefParser {
+        pub fn new() -> TypeRefParser {
+            TypeRefParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+            ___TOKEN: ___ToTriple<'input, Error=tok::Error>,
+            ___TOKENS: IntoIterator<Item=___TOKEN>,
+        >(
+            &self,
+            text: &'input str,
+            ___tokens0: ___TOKENS,
+        ) -> Result<TypeRef, ___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>
+        {
+            let ___tokens = ___tokens0.into_iter();
+            let mut ___tokens = ___tokens.map(|t| ___ToTriple::to_triple(t));
+            let mut ___states = vec![0_i16];
+            let mut ___symbols = vec![];
+            let mut ___integer;
+            let mut ___lookahead;
+            let ___last_location = &mut Default::default();
+            '___shift: loop {
+                ___lookahead = match ___tokens.next() {
+                    Some(Ok(v)) => v,
+                    None => break '___shift,
+                    Some(Err(e)) => return Err(___lalrpop_util::ParseError::User { error: e }),
+                };
+                *___last_location = ___lookahead.2.clone();
+                ___integer = match ___lookahead.1 {
+                    Tok::Bang if true => 0,
+                    Tok::BangEquals if true => 1,
+                    Tok::BangTilde if true => 2,
+                    Tok::Hash if true => 3,
+                    Tok::ShebangAttribute(_) if true => 4,
+                    Tok::Ampersand if true => 5,
+                    Tok::LeftParen if true => 6,
+                    Tok::RightParen if true => 7,
+                    Tok::Star if true => 8,
+                    Tok::Plus if true => 9,
+                    Tok::Comma if true => 10,
+                    Tok::MinusGreaterThan if true => 11,
+                    Tok::DotDot if true => 12,
+                    Tok::Colon if true => 13,
+                    Tok::ColonColon if true => 14,
+                    Tok::Semi if true => 15,
+                    Tok::LessThan if true => 16,
+                    Tok::Equals if true => 17,
+                    Tok::EqualsEquals if true => 18,
+                    Tok::EqualsGreaterThanCode(_) if true => 19,
+                    Tok::EqualsGreaterThanQuestionCode(_) if true => 20,
+                    Tok::EqualsGreaterThanLookahead if true => 21,
+                    Tok::EqualsGreaterThanLookbehind if true => 22,
+                    Tok::GreaterThan if true => 23,
+                    Tok::Question if true => 24,
+                    Tok::Lookahead if true => 25,
+                    Tok::Lookbehind if true => 26,
+                    Tok::CharLiteral(_) if true => 27,
+                    Tok::Escape(_) if true => 28,
+                    Tok::Id(_) if true => 29,
+                    Tok::Lifetime(_) if true => 30,
+                    Tok::MacroId(_) if true => 31,
+                    Tok::RegexLiteral(_) if true => 32,
+                    Tok::StringLiteral(_) if true => 33,
+                    Tok::LeftBracket if true => 34,
+                    Tok::RightBracket if true => 35,
+                    Tok::Underscore if true => 36,
+                    Tok::Else if true => 37,
+                    Tok::Enum if true => 38,
+                    Tok::Extern if true => 39,
+                    Tok::For if true => 40,
+                    Tok::Grammar if true => 41,
+                    Tok::If if true => 42,
+                    Tok::Match if true => 43,
+                    Tok::Mut if true => 44,
+                    Tok::Pub if true => 45,
+                    Tok::Type if true => 46,
+                    Tok::Use(_) if true => 47,
+                    Tok::Where if true => 48,
+                    Tok::LeftBrace if true => 49,
+                    Tok::RightBrace if true => 50,
+                    Tok::TildeTilde if true => 51,
+                    _ => {
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: Some(___lookahead),
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error);
+                    }
+                };
+                '___inner: loop {
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___action = ___ACTION[___state * 52 + ___integer];
+                    if ___action > 0 {
+                        let ___symbol = match ___integer {
+                            0 => match ___lookahead.1 {
+                                ___tok @ Tok::Bang => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            1 => match ___lookahead.1 {
+                                ___tok @ Tok::BangEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            2 => match ___lookahead.1 {
+                                ___tok @ Tok::BangTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            3 => match ___lookahead.1 {
+                                ___tok @ Tok::Hash => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            4 => match ___lookahead.1 {
+                                Tok::ShebangAttribute(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            5 => match ___lookahead.1 {
+                                ___tok @ Tok::Ampersand => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            6 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            7 => match ___lookahead.1 {
+                                ___tok @ Tok::RightParen => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            8 => match ___lookahead.1 {
+                                ___tok @ Tok::Star => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            9 => match ___lookahead.1 {
+                                ___tok @ Tok::Plus => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            10 => match ___lookahead.1 {
+                                ___tok @ Tok::Comma => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            11 => match ___lookahead.1 {
+                                ___tok @ Tok::MinusGreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            12 => match ___lookahead.1 {
+                                ___tok @ Tok::DotDot => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            13 => match ___lookahead.1 {
+                                ___tok @ Tok::Colon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            14 => match ___lookahead.1 {
+                                ___tok @ Tok::ColonColon => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            15 => match ___lookahead.1 {
+                                ___tok @ Tok::Semi => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            16 => match ___lookahead.1 {
+                                ___tok @ Tok::LessThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            17 => match ___lookahead.1 {
+                                ___tok @ Tok::Equals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            18 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsEquals => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            19 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            20 => match ___lookahead.1 {
+                                Tok::EqualsGreaterThanQuestionCode(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            21 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            22 => match ___lookahead.1 {
+                                ___tok @ Tok::EqualsGreaterThanLookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            23 => match ___lookahead.1 {
+                                ___tok @ Tok::GreaterThan => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            24 => match ___lookahead.1 {
+                                ___tok @ Tok::Question => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            25 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookahead => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            26 => match ___lookahead.1 {
+                                ___tok @ Tok::Lookbehind => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            27 => match ___lookahead.1 {
+                                Tok::CharLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            28 => match ___lookahead.1 {
+                                Tok::Escape(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            29 => match ___lookahead.1 {
+                                Tok::Id(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            30 => match ___lookahead.1 {
+                                Tok::Lifetime(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            31 => match ___lookahead.1 {
+                                Tok::MacroId(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            32 => match ___lookahead.1 {
+                                Tok::RegexLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            33 => match ___lookahead.1 {
+                                Tok::StringLiteral(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            34 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            35 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBracket => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            36 => match ___lookahead.1 {
+                                ___tok @ Tok::Underscore => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            37 => match ___lookahead.1 {
+                                ___tok @ Tok::Else => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            38 => match ___lookahead.1 {
+                                ___tok @ Tok::Enum => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            39 => match ___lookahead.1 {
+                                ___tok @ Tok::Extern => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            40 => match ___lookahead.1 {
+                                ___tok @ Tok::For => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            41 => match ___lookahead.1 {
+                                ___tok @ Tok::Grammar => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            42 => match ___lookahead.1 {
+                                ___tok @ Tok::If => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            43 => match ___lookahead.1 {
+                                ___tok @ Tok::Match => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            44 => match ___lookahead.1 {
+                                ___tok @ Tok::Mut => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            45 => match ___lookahead.1 {
+                                ___tok @ Tok::Pub => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            46 => match ___lookahead.1 {
+                                ___tok @ Tok::Type => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            47 => match ___lookahead.1 {
+                                Tok::Use(___tok0) => ___Symbol::Variant1((___tok0)),
+                                _ => unreachable!(),
+                            },
+                            48 => match ___lookahead.1 {
+                                ___tok @ Tok::Where => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            49 => match ___lookahead.1 {
+                                ___tok @ Tok::LeftBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            50 => match ___lookahead.1 {
+                                ___tok @ Tok::RightBrace => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            51 => match ___lookahead.1 {
+                                ___tok @ Tok::TildeTilde => ___Symbol::Variant0((___tok)),
+                                _ => unreachable!(),
+                            },
+                            _ => unreachable!(),
+                        };
+                        ___states.push(___action - 1);
+                        ___symbols.push((___lookahead.0, ___symbol, ___lookahead.2));
+                        continue '___shift;
+                    } else if ___action < 0 {
+                        if let Some(r) = ___reduce(text, ___action, Some(&___lookahead.0), &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                            if r.is_err() {
+                                return r;
+                            }
+                            return Err(___lalrpop_util::ParseError::ExtraToken { token: ___lookahead });
+                        }
+                    } else {
+                        let mut ___err_lookahead = Some(___lookahead);
+                        let mut ___err_integer: Option<usize> = Some(___integer);
+                        let ___state = *___states.last().unwrap() as usize;
+                        let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                            token: ___err_lookahead,
+                            expected: ___expected_tokens(___state),
+                        };
+                        return Err(___error)
+                    }
+                }
+            }
+            loop {
+                let ___state = *___states.last().unwrap() as usize;
+                let ___action = ___EOF_ACTION[___state];
+                if ___action < 0 {
+                    if let Some(r) = ___reduce(text, ___action, None, &mut ___states, &mut ___symbols, ::std::marker::PhantomData::<()>) {
+                        return r;
+                    }
+                } else {
+                    let mut ___err_lookahead = None;
+                    let mut ___err_integer: Option<usize> = None;
+                    let ___state = *___states.last().unwrap() as usize;
+                    let ___error = ___lalrpop_util::ParseError::UnrecognizedToken {
+                        token: ___err_lookahead,
+                        expected: ___expected_tokens(___state),
+                    };
+                    return Err(___error)
+                }
+            }
+        }
+    }
+    pub(crate) fn ___reduce<
+        'input,
+    >(
+        text: &'input str,
+        ___action: i16,
+        ___lookahead_start: Option<&usize>,
+        ___states: &mut ::std::vec::Vec<i16>,
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>,
+        _: ::std::marker::PhantomData<()>,
+    ) -> Option<Result<TypeRef,___lalrpop_util::ParseError<usize, Tok<'input>, tok::Error>>>
+    {
+        let (___pop_states, ___symbol, ___nonterminal) = match -___action {
+            1 => {
+                (|| {
+                    // "::"? = "::" => ActionFn(126);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action126::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 0)
+                })()
+            }
+            2 => {
+                (|| {
+                    // "::"? =  => ActionFn(127);
+                    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::___action127::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 0)
+                })()
+            }
+            3 => {
+                (|| {
+                    // "mut"? = "mut" => ActionFn(129);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action129::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (1, ___symbol, 1)
+                })()
+            }
+            4 => {
+                (|| {
+                    // "mut"? =  => ActionFn(130);
+                    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::___action130::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant2(___nt), ___end);
+                    (0, ___symbol, 1)
+                })()
+            }
+            5 => {
+                (|| {
+                    // ("->" <TypeRef>) = "->", TypeRef => ActionFn(156);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action156::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 2)
+                })()
+            }
+            6 => {
+                (|| {
+                    // ("->" <TypeRef>)? = "->", TypeRef => ActionFn(300);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action300::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 3)
+                })()
+            }
+            7 => {
+                (|| {
+                    // ("->" <TypeRef>)? =  => ActionFn(155);
+                    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::___action155::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 3)
+                })()
+            }
+            8 => {
+                (|| {
+                    // (":" <TypeRef>) = ":", TypeRef => ActionFn(147);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action147::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 4)
+                })()
+            }
+            9 => {
+                (|| {
+                    // (":" <TypeRef>)? = ":", TypeRef => ActionFn(303);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action303::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (2, ___symbol, 5)
+                })()
+            }
+            10 => {
+                (|| {
+                    // (":" <TypeRef>)? =  => ActionFn(146);
+                    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::___action146::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 5)
+                })()
+            }
+            11 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">") = "<", Comma<TypeBoundParameter>, ">" => ActionFn(152);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action152::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (3, ___symbol, 6)
+                })()
+            }
+            12 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? = "<", Comma<TypeBoundParameter>, ">" => ActionFn(306);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant5(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action306::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (3, ___symbol, 7)
+                })()
+            }
+            13 => {
+                (|| {
+                    // ("<" <Comma<TypeBoundParameter>> ">")? =  => ActionFn(151);
+                    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::___action151::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant6(___nt), ___end);
+                    (0, ___symbol, 7)
+                })()
+            }
+            14 => {
+                (|| {
+                    // ("if" <Cond>) = "if", Cond => ActionFn(140);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action140::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (2, ___symbol, 8)
+                })()
+            }
+            15 => {
+                (|| {
+                    // ("if" <Cond>)? = "if", Cond => ActionFn(309);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action309::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (2, ___symbol, 9)
+                })()
+            }
+            16 => {
+                (|| {
+                    // ("if" <Cond>)? =  => ActionFn(139);
+                    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::___action139::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant8(___nt), ___end);
+                    (0, ___symbol, 9)
+                })()
+            }
+            17 => {
+                (|| {
+                    // () =  => ActionFn(148);
+                    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::___action148::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant9(___nt), ___end);
+                    (0, ___symbol, 10)
+                })()
+            }
+            18 => {
+                (|| {
+                    // (<Alternative> ",") = Alternative, "," => ActionFn(234);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action234::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 11)
+                })()
+            }
+            19 => {
+                (|| {
+                    // (<Alternative> ",")* =  => ActionFn(232);
+                    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::___action232::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (0, ___symbol, 12)
+                })()
+            }
+            20 => {
+                (|| {
+                    // (<Alternative> ",")* = (<Alternative> ",")+ => ActionFn(233);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action233::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (1, ___symbol, 12)
+                })()
+            }
+            21 => {
+                (|| {
+                    // (<Alternative> ",")+ = Alternative, "," => ActionFn(315);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action315::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (2, ___symbol, 13)
+                })()
+            }
+            22 => {
+                (|| {
+                    // (<Alternative> ",")+ = (<Alternative> ",")+, Alternative, "," => ActionFn(316);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action316::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant11(___nt), ___end);
+                    (3, ___symbol, 13)
+                })()
+            }
+            23 => {
+                (|| {
+                    // (<Conversion> ",") = Conversion, "," => ActionFn(258);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action258::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                    (2, ___symbol, 14)
+                })()
+            }
+            24 => {
+                (|| {
+                    // (<Conversion> ",")* =  => ActionFn(256);
+                    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::___action256::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (0, ___symbol, 15)
+                })()
+            }
+            25 => {
+                (|| {
+                    // (<Conversion> ",")* = (<Conversion> ",")+ => ActionFn(257);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action257::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (1, ___symbol, 15)
+                })()
+            }
+            26 => {
+                (|| {
+                    // (<Conversion> ",")+ = Conversion, "," => ActionFn(319);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action319::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (2, ___symbol, 16)
+                })()
+            }
+            27 => {
+                (|| {
+                    // (<Conversion> ",")+ = (<Conversion> ",")+, Conversion, "," => ActionFn(320);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action320::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant13(___nt), ___end);
+                    (3, ___symbol, 16)
+                })()
+            }
+            28 => {
+                (|| {
+                    // (<FieldPattern> ",") = FieldPattern, "," => ActionFn(117);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action117::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (2, ___symbol, 17)
+                })()
+            }
+            29 => {
+                (|| {
+                    // (<FieldPattern> ",")* =  => ActionFn(115);
+                    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::___action115::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (0, ___symbol, 18)
+                })()
+            }
+            30 => {
+                (|| {
+                    // (<FieldPattern> ",")* = (<FieldPattern> ",")+ => ActionFn(116);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action116::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (1, ___symbol, 18)
+                })()
+            }
+            31 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = FieldPattern, "," => ActionFn(323);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action323::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (2, ___symbol, 19)
+                })()
+            }
+            32 => {
+                (|| {
+                    // (<FieldPattern> ",")+ = (<FieldPattern> ",")+, FieldPattern, "," => ActionFn(324);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant14(___symbols);
+                    let ___sym0 = ___pop_Variant15(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action324::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant15(___nt), ___end);
+                    (3, ___symbol, 19)
+                })()
+            }
+            33 => {
+                (|| {
+                    // (<GrammarParameter> ",") = GrammarParameter, "," => ActionFn(224);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action224::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (2, ___symbol, 20)
+                })()
+            }
+            34 => {
+                (|| {
+                    // (<GrammarParameter> ",")* =  => 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::___action222::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (0, ___symbol, 21)
+                })()
+            }
+            35 => {
+                (|| {
+                    // (<GrammarParameter> ",")* = (<GrammarParameter> ",")+ => ActionFn(223);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action223::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (1, ___symbol, 21)
+                })()
+            }
+            36 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = GrammarParameter, "," => ActionFn(329);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action329::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (2, ___symbol, 22)
+                })()
+            }
+            37 => {
+                (|| {
+                    // (<GrammarParameter> ",")+ = (<GrammarParameter> ",")+, GrammarParameter, "," => ActionFn(330);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action330::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant17(___nt), ___end);
+                    (3, ___symbol, 22)
+                })()
+            }
+            38 => {
+                (|| {
+                    // (<GrammarWhereClause> ",") = GrammarWhereClause, "," => ActionFn(198);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action198::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (2, ___symbol, 23)
+                })()
+            }
+            39 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* =  => ActionFn(196);
+                    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::___action196::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (0, ___symbol, 24)
+                })()
+            }
+            40 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")* = (<GrammarWhereClause> ",")+ => ActionFn(197);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action197::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (1, ___symbol, 24)
+                })()
+            }
+            41 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = GrammarWhereClause, "," => ActionFn(333);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action333::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (2, ___symbol, 25)
+                })()
+            }
+            42 => {
+                (|| {
+                    // (<GrammarWhereClause> ",")+ = (<GrammarWhereClause> ",")+, GrammarWhereClause, "," => ActionFn(334);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action334::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant19(___nt), ___end);
+                    (3, ___symbol, 25)
+                })()
+            }
+            43 => {
+                (|| {
+                    // (<Id> "::") = Id, "::" => ActionFn(125);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action125::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 26)
+                })()
+            }
+            44 => {
+                (|| {
+                    // (<Id> "::")* =  => ActionFn(123);
+                    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::___action123::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 27)
+                })()
+            }
+            45 => {
+                (|| {
+                    // (<Id> "::")* = (<Id> "::")+ => ActionFn(124);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action124::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 27)
+                })()
+            }
+            46 => {
+                (|| {
+                    // (<Id> "::")+ = Id, "::" => ActionFn(337);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action337::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 28)
+                })()
+            }
+            47 => {
+                (|| {
+                    // (<Id> "::")+ = (<Id> "::")+, Id, "::" => ActionFn(338);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action338::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 28)
+                })()
+            }
+            48 => {
+                (|| {
+                    // (<Lifetime> "+") = Lifetime, "+" => ActionFn(201);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action201::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 29)
+                })()
+            }
+            49 => {
+                (|| {
+                    // (<Lifetime> "+")* =  => ActionFn(199);
+                    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::___action199::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 30)
+                })()
+            }
+            50 => {
+                (|| {
+                    // (<Lifetime> "+")* = (<Lifetime> "+")+ => ActionFn(200);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action200::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 30)
+                })()
+            }
+            51 => {
+                (|| {
+                    // (<Lifetime> "+")+ = Lifetime, "+" => ActionFn(343);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action343::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 31)
+                })()
+            }
+            52 => {
+                (|| {
+                    // (<Lifetime> "+")+ = (<Lifetime> "+")+, Lifetime, "+" => ActionFn(344);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action344::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 31)
+                })()
+            }
+            53 => {
+                (|| {
+                    // (<Lifetime> ",") = Lifetime, "," => ActionFn(204);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action204::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (2, ___symbol, 32)
+                })()
+            }
+            54 => {
+                (|| {
+                    // (<Lifetime> ",")* =  => ActionFn(202);
+                    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::___action202::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (0, ___symbol, 33)
+                })()
+            }
+            55 => {
+                (|| {
+                    // (<Lifetime> ",")* = (<Lifetime> ",")+ => ActionFn(203);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action203::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (1, ___symbol, 33)
+                })()
+            }
+            56 => {
+                (|| {
+                    // (<Lifetime> ",")+ = Lifetime, "," => ActionFn(347);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action347::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (2, ___symbol, 34)
+                })()
+            }
+            57 => {
+                (|| {
+                    // (<Lifetime> ",")+ = (<Lifetime> ",")+, Lifetime, "," => ActionFn(348);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action348::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant21(___nt), ___end);
+                    (3, ___symbol, 34)
+                })()
+            }
+            58 => {
+                (|| {
+                    // (<MatchItem> ",") = MatchItem, "," => ActionFn(253);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action253::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (2, ___symbol, 35)
+                })()
+            }
+            59 => {
+                (|| {
+                    // (<MatchItem> ",")* =  => ActionFn(251);
+                    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::___action251::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (0, ___symbol, 36)
+                })()
+            }
+            60 => {
+                (|| {
+                    // (<MatchItem> ",")* = (<MatchItem> ",")+ => ActionFn(252);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action252::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (1, ___symbol, 36)
+                })()
+            }
+            61 => {
+                (|| {
+                    // (<MatchItem> ",")+ = MatchItem, "," => ActionFn(351);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action351::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (2, ___symbol, 37)
+                })()
+            }
+            62 => {
+                (|| {
+                    // (<MatchItem> ",")+ = (<MatchItem> ",")+, MatchItem, "," => ActionFn(352);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action352::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant23(___nt), ___end);
+                    (3, ___symbol, 37)
+                })()
+            }
+            63 => {
+                (|| {
+                    // (<NotMacroId> ",") = NotMacroId, "," => ActionFn(229);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action229::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (2, ___symbol, 38)
+                })()
+            }
+            64 => {
+                (|| {
+                    // (<NotMacroId> ",")* =  => ActionFn(227);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (0, ___symbol, 39)
+                })()
+            }
+            65 => {
+                (|| {
+                    // (<NotMacroId> ",")* = (<NotMacroId> ",")+ => ActionFn(228);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action228::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (1, ___symbol, 39)
+                })()
+            }
+            66 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = NotMacroId, "," => ActionFn(355);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action355::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (2, ___symbol, 40)
+                })()
+            }
+            67 => {
+                (|| {
+                    // (<NotMacroId> ",")+ = (<NotMacroId> ",")+, NotMacroId, "," => ActionFn(356);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action356::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant25(___nt), ___end);
+                    (3, ___symbol, 40)
+                })()
+            }
+            68 => {
+                (|| {
+                    // (<Pattern> ",") = Pattern, "," => ActionFn(263);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action263::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (2, ___symbol, 41)
+                })()
+            }
+            69 => {
+                (|| {
+                    // (<Pattern> ",")* =  => 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::___action261::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (0, ___symbol, 42)
+                })()
+            }
+            70 => {
+                (|| {
+                    // (<Pattern> ",")* = (<Pattern> ",")+ => ActionFn(262);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action262::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (1, ___symbol, 42)
+                })()
+            }
+            71 => {
+                (|| {
+                    // (<Pattern> ",")+ = Pattern, "," => ActionFn(359);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action359::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (2, ___symbol, 43)
+                })()
+            }
+            72 => {
+                (|| {
+                    // (<Pattern> ",")+ = (<Pattern> ",")+, Pattern, "," => ActionFn(360);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action360::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant27(___nt), ___end);
+                    (3, ___symbol, 43)
+                })()
+            }
+            73 => {
+                (|| {
+                    // (<Symbol> ",") = Symbol, "," => ActionFn(239);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action239::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 44)
+                })()
+            }
+            74 => {
+                (|| {
+                    // (<Symbol> ",")* =  => ActionFn(237);
+                    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::___action237::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 45)
+                })()
+            }
+            75 => {
+                (|| {
+                    // (<Symbol> ",")* = (<Symbol> ",")+ => ActionFn(238);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action238::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 45)
+                })()
+            }
+            76 => {
+                (|| {
+                    // (<Symbol> ",")+ = Symbol, "," => ActionFn(363);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action363::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 46)
+                })()
+            }
+            77 => {
+                (|| {
+                    // (<Symbol> ",")+ = (<Symbol> ",")+, Symbol, "," => ActionFn(364);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action364::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (3, ___symbol, 46)
+                })()
+            }
+            78 => {
+                (|| {
+                    // (<TypeBound> "+") = TypeBound, "+" => ActionFn(209);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action209::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 47)
+                })()
+            }
+            79 => {
+                (|| {
+                    // (<TypeBound> "+")* =  => ActionFn(207);
+                    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::___action207::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (0, ___symbol, 48)
+                })()
+            }
+            80 => {
+                (|| {
+                    // (<TypeBound> "+")* = (<TypeBound> "+")+ => ActionFn(208);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action208::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (1, ___symbol, 48)
+                })()
+            }
+            81 => {
+                (|| {
+                    // (<TypeBound> "+")+ = TypeBound, "+" => ActionFn(367);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action367::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (2, ___symbol, 49)
+                })()
+            }
+            82 => {
+                (|| {
+                    // (<TypeBound> "+")+ = (<TypeBound> "+")+, TypeBound, "+" => ActionFn(368);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action368::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant31(___nt), ___end);
+                    (3, ___symbol, 49)
+                })()
+            }
+            83 => {
+                (|| {
+                    // (<TypeBoundParameter> ",") = TypeBoundParameter, "," => ActionFn(219);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action219::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (2, ___symbol, 50)
+                })()
+            }
+            84 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* =  => ActionFn(217);
+                    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::___action217::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (0, ___symbol, 51)
+                })()
+            }
+            85 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")* = (<TypeBoundParameter> ",")+ => ActionFn(218);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action218::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (1, ___symbol, 51)
+                })()
+            }
+            86 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = TypeBoundParameter, "," => ActionFn(371);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action371::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (2, ___symbol, 52)
+                })()
+            }
+            87 => {
+                (|| {
+                    // (<TypeBoundParameter> ",")+ = (<TypeBoundParameter> ",")+, TypeBoundParameter, "," => ActionFn(372);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action372::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant33(___nt), ___end);
+                    (3, ___symbol, 52)
+                })()
+            }
+            88 => {
+                (|| {
+                    // (<TypeParameter> ",") = TypeParameter, "," => ActionFn(193);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action193::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (2, ___symbol, 53)
+                })()
+            }
+            89 => {
+                (|| {
+                    // (<TypeParameter> ",")* =  => 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::___action191::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (0, ___symbol, 54)
+                })()
+            }
+            90 => {
+                (|| {
+                    // (<TypeParameter> ",")* = (<TypeParameter> ",")+ => ActionFn(192);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action192::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (1, ___symbol, 54)
+                })()
+            }
+            91 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = TypeParameter, "," => ActionFn(375);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action375::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (2, ___symbol, 55)
+                })()
+            }
+            92 => {
+                (|| {
+                    // (<TypeParameter> ",")+ = (<TypeParameter> ",")+, TypeParameter, "," => ActionFn(376);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action376::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant35(___nt), ___end);
+                    (3, ___symbol, 55)
+                })()
+            }
+            93 => {
+                (|| {
+                    // (<TypeRef> ",") = TypeRef, "," => ActionFn(214);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action214::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 56)
+                })()
+            }
+            94 => {
+                (|| {
+                    // (<TypeRef> ",")* =  => ActionFn(212);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 57)
+                })()
+            }
+            95 => {
+                (|| {
+                    // (<TypeRef> ",")* = (<TypeRef> ",")+ => ActionFn(213);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action213::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 57)
+                })()
+            }
+            96 => {
+                (|| {
+                    // (<TypeRef> ",")+ = TypeRef, "," => ActionFn(379);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action379::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 58)
+                })()
+            }
+            97 => {
+                (|| {
+                    // (<TypeRef> ",")+ = (<TypeRef> ",")+, TypeRef, "," => ActionFn(380);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action380::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 58)
+                })()
+            }
+            98 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",") = TypeRefOrLifetime, "," => ActionFn(244);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action244::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 59)
+                })()
+            }
+            99 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* =  => ActionFn(242);
+                    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::___action242::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (0, ___symbol, 60)
+                })()
+            }
+            100 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")* = (<TypeRefOrLifetime> ",")+ => ActionFn(243);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action243::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (1, ___symbol, 60)
+                })()
+            }
+            101 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = TypeRefOrLifetime, "," => ActionFn(383);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action383::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (2, ___symbol, 61)
+                })()
+            }
+            102 => {
+                (|| {
+                    // (<TypeRefOrLifetime> ",")+ = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime, "," => ActionFn(384);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action384::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant36(___nt), ___end);
+                    (3, ___symbol, 61)
+                })()
+            }
+            103 => {
+                (|| {
+                    // @L =  => ActionFn(174);
+                    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::___action174::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 62)
+                })()
+            }
+            104 => {
+                (|| {
+                    // @R =  => ActionFn(173);
+                    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::___action173::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant37(___nt), ___end);
+                    (0, ___symbol, 63)
+                })()
+            }
+            105 => {
+                (|| {
+                    // Action = "=>@L" => ActionFn(39);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action39::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            106 => {
+                (|| {
+                    // Action = "=>@R" => ActionFn(40);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action40::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            107 => {
+                (|| {
+                    // Action = "=>" => ActionFn(41);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action41::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            108 => {
+                (|| {
+                    // Action = "=>?" => ActionFn(42);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action42::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant38(___nt), ___end);
+                    (1, ___symbol, 64)
+                })()
+            }
+            109 => {
+                (|| {
+                    // Action? = Action => ActionFn(136);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action136::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (1, ___symbol, 65)
+                })()
+            }
+            110 => {
+                (|| {
+                    // Action? =  => ActionFn(137);
+                    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::___action137::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant39(___nt), ___end);
+                    (0, ___symbol, 65)
+                })()
+            }
+            111 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond, Action => ActionFn(434);
+                    let ___sym3 = ___pop_Variant38(___symbols);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action434::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (4, ___symbol, 66)
+                })()
+            }
+            112 => {
+                (|| {
+                    // Alternative = Symbol+, "if", Cond => ActionFn(435);
+                    let ___sym2 = ___pop_Variant7(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action435::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            113 => {
+                (|| {
+                    // Alternative = Symbol+, Action => ActionFn(436);
+                    let ___sym1 = ___pop_Variant38(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action436::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (2, ___symbol, 66)
+                })()
+            }
+            114 => {
+                (|| {
+                    // Alternative = Symbol+ => ActionFn(437);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action437::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            115 => {
+                (|| {
+                    // Alternative = "if", Cond, Action => ActionFn(412);
+                    let ___sym2 = ___pop_Variant38(___symbols);
+                    let ___sym1 = ___pop_Variant7(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action412::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (3, ___symbol, 66)
+                })()
+            }
+            116 => {
+                (|| {
+                    // Alternative = Action => ActionFn(413);
+                    let ___sym0 = ___pop_Variant38(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action413::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant10(___nt), ___end);
+                    (1, ___symbol, 66)
+                })()
+            }
+            117 => {
+                (|| {
+                    // Alternative? = Alternative => ActionFn(230);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action230::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (1, ___symbol, 67)
+                })()
+            }
+            118 => {
+                (|| {
+                    // Alternative? =  => 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::___action231::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant40(___nt), ___end);
+                    (0, ___symbol, 67)
+                })()
+            }
+            119 => {
+                (|| {
+                    // Alternatives = Alternative, ";" => ActionFn(35);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action35::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 68)
+                })()
+            }
+            120 => {
+                (|| {
+                    // Alternatives = "{", Comma<Alternative>, "}", ";" => ActionFn(36);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant41(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action36::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (4, ___symbol, 68)
+                })()
+            }
+            121 => {
+                (|| {
+                    // Annotation = "#", "[", Id, "]" => ActionFn(414);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action414::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant42(___nt), ___end);
+                    (4, ___symbol, 69)
+                })()
+            }
+            122 => {
+                (|| {
+                    // Annotation* =  => ActionFn(175);
+                    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::___action175::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (0, ___symbol, 70)
+                })()
+            }
+            123 => {
+                (|| {
+                    // Annotation* = Annotation+ => ActionFn(176);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action176::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 70)
+                })()
+            }
+            124 => {
+                (|| {
+                    // Annotation+ = Annotation => ActionFn(185);
+                    let ___sym0 = ___pop_Variant42(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action185::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (1, ___symbol, 71)
+                })()
+            }
+            125 => {
+                (|| {
+                    // Annotation+ = Annotation+, Annotation => ActionFn(186);
+                    let ___sym1 = ___pop_Variant42(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action186::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant43(___nt), ___end);
+                    (2, ___symbol, 71)
+                })()
+            }
+            126 => {
+                (|| {
+                    // AssociatedType = "type", Id, "=", TypeRef, ";" => ActionFn(415);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action415::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant44(___nt), ___end);
+                    (5, ___symbol, 72)
+                })()
+            }
+            127 => {
+                (|| {
+                    // AssociatedType* =  => ActionFn(121);
+                    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::___action121::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (0, ___symbol, 73)
+                })()
+            }
+            128 => {
+                (|| {
+                    // AssociatedType* = AssociatedType+ => ActionFn(122);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action122::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 73)
+                })()
+            }
+            129 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType => ActionFn(247);
+                    let ___sym0 = ___pop_Variant44(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action247::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (1, ___symbol, 74)
+                })()
+            }
+            130 => {
+                (|| {
+                    // AssociatedType+ = AssociatedType+, AssociatedType => ActionFn(248);
+                    let ___sym1 = ___pop_Variant44(___symbols);
+                    let ___sym0 = ___pop_Variant45(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action248::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant45(___nt), ___end);
+                    (2, ___symbol, 74)
+                })()
+            }
+            131 => {
+                (|| {
+                    // Comma<Alternative> = Alternative => ActionFn(438);
+                    let ___sym0 = ___pop_Variant10(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action438::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            132 => {
+                (|| {
+                    // Comma<Alternative> =  => ActionFn(439);
+                    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::___action439::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (0, ___symbol, 75)
+                })()
+            }
+            133 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+, Alternative => ActionFn(440);
+                    let ___sym1 = ___pop_Variant10(___symbols);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action440::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (2, ___symbol, 75)
+                })()
+            }
+            134 => {
+                (|| {
+                    // Comma<Alternative> = (<Alternative> ",")+ => ActionFn(441);
+                    let ___sym0 = ___pop_Variant11(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action441::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant41(___nt), ___end);
+                    (1, ___symbol, 75)
+                })()
+            }
+            135 => {
+                (|| {
+                    // Comma<Conversion> = Conversion => ActionFn(454);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action454::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            136 => {
+                (|| {
+                    // Comma<Conversion> =  => ActionFn(455);
+                    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::___action455::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (0, ___symbol, 76)
+                })()
+            }
+            137 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+, Conversion => ActionFn(456);
+                    let ___sym1 = ___pop_Variant12(___symbols);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action456::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (2, ___symbol, 76)
+                })()
+            }
+            138 => {
+                (|| {
+                    // Comma<Conversion> = (<Conversion> ",")+ => ActionFn(457);
+                    let ___sym0 = ___pop_Variant13(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action457::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant46(___nt), ___end);
+                    (1, ___symbol, 76)
+                })()
+            }
+            139 => {
+                (|| {
+                    // Comma<GrammarParameter> = GrammarParameter => ActionFn(476);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action476::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            140 => {
+                (|| {
+                    // Comma<GrammarParameter> =  => ActionFn(477);
+                    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::___action477::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (0, ___symbol, 77)
+                })()
+            }
+            141 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+, GrammarParameter => ActionFn(478);
+                    let ___sym1 = ___pop_Variant16(___symbols);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action478::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (2, ___symbol, 77)
+                })()
+            }
+            142 => {
+                (|| {
+                    // Comma<GrammarParameter> = (<GrammarParameter> ",")+ => ActionFn(479);
+                    let ___sym0 = ___pop_Variant17(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action479::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (1, ___symbol, 77)
+                })()
+            }
+            143 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = GrammarWhereClause => ActionFn(504);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action504::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            144 => {
+                (|| {
+                    // Comma<GrammarWhereClause> =  => ActionFn(505);
+                    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::___action505::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (0, ___symbol, 78)
+                })()
+            }
+            145 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+, GrammarWhereClause => ActionFn(506);
+                    let ___sym1 = ___pop_Variant18(___symbols);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action506::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 78)
+                })()
+            }
+            146 => {
+                (|| {
+                    // Comma<GrammarWhereClause> = (<GrammarWhereClause> ",")+ => ActionFn(507);
+                    let ___sym0 = ___pop_Variant19(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action507::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 78)
+                })()
+            }
+            147 => {
+                (|| {
+                    // Comma<Lifetime> = Lifetime => ActionFn(540);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action540::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            148 => {
+                (|| {
+                    // Comma<Lifetime> =  => ActionFn(541);
+                    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::___action541::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 79)
+                })()
+            }
+            149 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+, Lifetime => ActionFn(542);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action542::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 79)
+                })()
+            }
+            150 => {
+                (|| {
+                    // Comma<Lifetime> = (<Lifetime> ",")+ => ActionFn(543);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action543::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 79)
+                })()
+            }
+            151 => {
+                (|| {
+                    // Comma<MatchItem> = MatchItem => ActionFn(552);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action552::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            152 => {
+                (|| {
+                    // Comma<MatchItem> =  => ActionFn(553);
+                    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::___action553::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (0, ___symbol, 80)
+                })()
+            }
+            153 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+, MatchItem => ActionFn(554);
+                    let ___sym1 = ___pop_Variant22(___symbols);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action554::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (2, ___symbol, 80)
+                })()
+            }
+            154 => {
+                (|| {
+                    // Comma<MatchItem> = (<MatchItem> ",")+ => ActionFn(555);
+                    let ___sym0 = ___pop_Variant23(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action555::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant50(___nt), ___end);
+                    (1, ___symbol, 80)
+                })()
+            }
+            155 => {
+                (|| {
+                    // Comma<NotMacroId> = NotMacroId => ActionFn(556);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action556::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            156 => {
+                (|| {
+                    // Comma<NotMacroId> =  => ActionFn(557);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (0, ___symbol, 81)
+                })()
+            }
+            157 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+, NotMacroId => ActionFn(558);
+                    let ___sym1 = ___pop_Variant24(___symbols);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action558::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (2, ___symbol, 81)
+                })()
+            }
+            158 => {
+                (|| {
+                    // Comma<NotMacroId> = (<NotMacroId> ",")+ => ActionFn(559);
+                    let ___sym0 = ___pop_Variant25(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action559::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant51(___nt), ___end);
+                    (1, ___symbol, 81)
+                })()
+            }
+            159 => {
+                (|| {
+                    // Comma<Pattern> = Pattern => ActionFn(560);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action560::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            160 => {
+                (|| {
+                    // Comma<Pattern> =  => ActionFn(561);
+                    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::___action561::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (0, ___symbol, 82)
+                })()
+            }
+            161 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+, Pattern => ActionFn(562);
+                    let ___sym1 = ___pop_Variant26(___symbols);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action562::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (2, ___symbol, 82)
+                })()
+            }
+            162 => {
+                (|| {
+                    // Comma<Pattern> = (<Pattern> ",")+ => ActionFn(563);
+                    let ___sym0 = ___pop_Variant27(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action563::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant52(___nt), ___end);
+                    (1, ___symbol, 82)
+                })()
+            }
+            163 => {
+                (|| {
+                    // Comma<Symbol> = Symbol => ActionFn(630);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action630::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            164 => {
+                (|| {
+                    // Comma<Symbol> =  => ActionFn(631);
+                    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::___action631::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (0, ___symbol, 83)
+                })()
+            }
+            165 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+, Symbol => ActionFn(632);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action632::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (2, ___symbol, 83)
+                })()
+            }
+            166 => {
+                (|| {
+                    // Comma<Symbol> = (<Symbol> ",")+ => ActionFn(633);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action633::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant53(___nt), ___end);
+                    (1, ___symbol, 83)
+                })()
+            }
+            167 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = TypeBoundParameter => ActionFn(638);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action638::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            168 => {
+                (|| {
+                    // Comma<TypeBoundParameter> =  => ActionFn(639);
+                    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::___action639::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (0, ___symbol, 84)
+                })()
+            }
+            169 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+, TypeBoundParameter => ActionFn(640);
+                    let ___sym1 = ___pop_Variant32(___symbols);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action640::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (2, ___symbol, 84)
+                })()
+            }
+            170 => {
+                (|| {
+                    // Comma<TypeBoundParameter> = (<TypeBoundParameter> ",")+ => ActionFn(641);
+                    let ___sym0 = ___pop_Variant33(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action641::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant5(___nt), ___end);
+                    (1, ___symbol, 84)
+                })()
+            }
+            171 => {
+                (|| {
+                    // Comma<TypeParameter> = TypeParameter => ActionFn(642);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action642::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            172 => {
+                (|| {
+                    // Comma<TypeParameter> =  => ActionFn(643);
+                    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::___action643::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (0, ___symbol, 85)
+                })()
+            }
+            173 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+, TypeParameter => ActionFn(644);
+                    let ___sym1 = ___pop_Variant34(___symbols);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action644::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (2, ___symbol, 85)
+                })()
+            }
+            174 => {
+                (|| {
+                    // Comma<TypeParameter> = (<TypeParameter> ",")+ => ActionFn(645);
+                    let ___sym0 = ___pop_Variant35(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action645::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (1, ___symbol, 85)
+                })()
+            }
+            175 => {
+                (|| {
+                    // Comma<TypeRef> = TypeRef => ActionFn(646);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action646::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            176 => {
+                (|| {
+                    // Comma<TypeRef> =  => ActionFn(647);
+                    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::___action647::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 86)
+                })()
+            }
+            177 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+, TypeRef => ActionFn(648);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action648::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 86)
+                })()
+            }
+            178 => {
+                (|| {
+                    // Comma<TypeRef> = (<TypeRef> ",")+ => ActionFn(649);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action649::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 86)
+                })()
+            }
+            179 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = TypeRefOrLifetime => ActionFn(650);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action650::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            180 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> =  => ActionFn(651);
+                    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::___action651::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (0, ___symbol, 87)
+                })()
+            }
+            181 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+, TypeRefOrLifetime => ActionFn(652);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action652::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (2, ___symbol, 87)
+                })()
+            }
+            182 => {
+                (|| {
+                    // Comma<TypeRefOrLifetime> = (<TypeRefOrLifetime> ",")+ => ActionFn(653);
+                    let ___sym0 = ___pop_Variant36(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action653::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant55(___nt), ___end);
+                    (1, ___symbol, 87)
+                })()
+            }
+            183 => {
+                (|| {
+                    // Cond = NotMacroId, CondOp, StringLiteral => ActionFn(416);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant56(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action416::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant7(___nt), ___end);
+                    (3, ___symbol, 88)
+                })()
+            }
+            184 => {
+                (|| {
+                    // CondOp = "==" => ActionFn(44);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action44::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            185 => {
+                (|| {
+                    // CondOp = "!=" => ActionFn(45);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action45::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            186 => {
+                (|| {
+                    // CondOp = "~~" => ActionFn(46);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action46::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            187 => {
+                (|| {
+                    // CondOp = "!~" => ActionFn(47);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action47::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant56(___nt), ___end);
+                    (1, ___symbol, 89)
+                })()
+            }
+            188 => {
+                // Conversion = Terminal, "=>" => ActionFn(417);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant73(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action417::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant12(___nt), ___end);
+                (2, ___symbol, 90)
+            }
+            189 => {
+                (|| {
+                    // Conversion? = Conversion => ActionFn(254);
+                    let ___sym0 = ___pop_Variant12(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action254::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (1, ___symbol, 91)
+                })()
+            }
+            190 => {
+                (|| {
+                    // Conversion? =  => 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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant57(___nt), ___end);
+                    (0, ___symbol, 91)
+                })()
+            }
+            191 => {
+                (|| {
+                    // EnumToken = "enum", TypeRef, "{", Comma<Conversion>, "}" => ActionFn(418);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant46(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action418::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant58(___nt), ___end);
+                    (5, ___symbol, 92)
+                })()
+            }
+            192 => {
+                (|| {
+                    // Escape = "Escape" => ActionFn(103);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action103::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 93)
+                })()
+            }
+            193 => {
+                (|| {
+                    // ExprSymbol =  => ActionFn(628);
+                    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::___action628::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (0, ___symbol, 94)
+                })()
+            }
+            194 => {
+                (|| {
+                    // ExprSymbol = Symbol+ => ActionFn(629);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action629::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant59(___nt), ___end);
+                    (1, ___symbol, 94)
+                })()
+            }
+            195 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, "}" => ActionFn(448);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action448::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            196 => {
+                (|| {
+                    // ExternToken = "extern", "{", EnumToken, AssociatedType+, "}" => ActionFn(449);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant45(___symbols);
+                    let ___sym2 = ___pop_Variant58(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action449::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            197 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, "}" => ActionFn(450);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action450::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 95)
+                })()
+            }
+            198 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, EnumToken, AssociatedType+, "}" => ActionFn(451);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant45(___symbols);
+                    let ___sym3 = ___pop_Variant58(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action451::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 95)
+                })()
+            }
+            199 => {
+                (|| {
+                    // ExternToken = "extern", "{", "}" => ActionFn(452);
+                    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::___action452::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (3, ___symbol, 95)
+                })()
+            }
+            200 => {
+                (|| {
+                    // ExternToken = "extern", "{", AssociatedType+, "}" => ActionFn(453);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant45(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action453::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 95)
+                })()
+            }
+            201 => {
+                (|| {
+                    // FieldPattern = Id, ":", Pattern => ActionFn(421);
+                    let ___sym2 = ___pop_Variant26(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action421::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant14(___nt), ___end);
+                    (3, ___symbol, 96)
+                })()
+            }
+            202 => {
+                (|| {
+                    // FieldPattern? = FieldPattern => ActionFn(113);
+                    let ___sym0 = ___pop_Variant14(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action113::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (1, ___symbol, 97)
+                })()
+            }
+            203 => {
+                (|| {
+                    // FieldPattern? =  => ActionFn(114);
+                    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::___action114::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant61(___nt), ___end);
+                    (0, ___symbol, 97)
+                })()
+            }
+            204 => {
+                (|| {
+                    // ForAll = "for", "<", Comma<Lifetime>, ">" => ActionFn(12);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action12::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (4, ___symbol, 98)
+                })()
+            }
+            205 => {
+                (|| {
+                    // ForAll? = ForAll => ActionFn(160);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action160::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (1, ___symbol, 99)
+                })()
+            }
+            206 => {
+                (|| {
+                    // ForAll? =  => ActionFn(161);
+                    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::___action161::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant62(___nt), ___end);
+                    (0, ___symbol, 99)
+                })()
+            }
+            207 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(654);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action654::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            208 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(655);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action655::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            209 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(656);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action656::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            210 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(657);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action657::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            211 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(658);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action658::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            212 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(659);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action659::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            213 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(660);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action660::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            214 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(661);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action661::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            215 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(662);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action662::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            216 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(663);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action663::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            217 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(664);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action664::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            218 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(665);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action665::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            219 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";" => ActionFn(666);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action666::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            220 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";" => ActionFn(667);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action667::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            221 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";" => ActionFn(668);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action668::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            222 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";" => ActionFn(669);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action669::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            223 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(670);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action670::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            224 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(671);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action671::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            225 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(672);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action672::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            226 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(673);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action673::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            227 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";" => ActionFn(674);
+                    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::___action674::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            228 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(675);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action675::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            229 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";" => ActionFn(676);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action676::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            230 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";" => ActionFn(677);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action677::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            231 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";" => ActionFn(678);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action678::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            232 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(679);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action679::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            233 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";" => ActionFn(680);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action680::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            234 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";" => ActionFn(681);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action681::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            235 => {
+                (|| {
+                    // Grammar = "grammar", ";" => 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::___action682::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (2, ___symbol, 100)
+                })()
+            }
+            236 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";" => ActionFn(683);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action683::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            237 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";" => ActionFn(684);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action684::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            238 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";" => ActionFn(685);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action685::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            239 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(686);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action686::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            240 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(687);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action687::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            241 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(688);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action688::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            242 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(689);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action689::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            243 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(690);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action690::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            244 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(691);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action691::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            245 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(692);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action692::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            246 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(693);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action693::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            247 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(694);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action694::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            248 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(695);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action695::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            249 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(696);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action696::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            250 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(697);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action697::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            251 => {
+                (|| {
+                    // Grammar = "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(698);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action698::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            252 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(699);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action699::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            253 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(700);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action700::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            254 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(701);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action701::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            255 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(702);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action702::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            256 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(703);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action703::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            257 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(704);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action704::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            258 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(705);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action705::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            259 => {
+                (|| {
+                    // Grammar = "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(706);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant54(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action706::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            260 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(707);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action707::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            261 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(708);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action708::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            262 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(709);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action709::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            263 => {
+                (|| {
+                    // Grammar = "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(710);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action710::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            264 => {
+                (|| {
+                    // Grammar = Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(711);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action711::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            265 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(712);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action712::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            266 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(713);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action713::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            267 => {
+                (|| {
+                    // Grammar = "grammar", ";", GrammarItem+ => ActionFn(714);
+                    let ___sym2 = ___pop_Variant64(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action714::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            268 => {
+                (|| {
+                    // Grammar = Use+, "grammar", ";", GrammarItem+ => ActionFn(715);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action715::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            269 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, "grammar", ";", GrammarItem+ => ActionFn(716);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action716::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            270 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, "grammar", ";", GrammarItem+ => ActionFn(717);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action717::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            271 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(718);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action718::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            272 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(719);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action719::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            273 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(720);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action720::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            274 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";" => ActionFn(721);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action721::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            275 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(722);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action722::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            276 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(723);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action723::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            277 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(724);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action724::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            278 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";" => ActionFn(725);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action725::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            279 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(726);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action726::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            280 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(727);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action727::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            281 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(728);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action728::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            282 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";" => ActionFn(729);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action729::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            283 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";" => ActionFn(730);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action730::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            284 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(731);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action731::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            285 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(732);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action732::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            286 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";" => ActionFn(733);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action733::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            287 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(734);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action734::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            288 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(735);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action735::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            289 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(736);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action736::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            290 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";" => ActionFn(737);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action737::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            291 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(738);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action738::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            292 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(739);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action739::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            293 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(740);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action740::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            294 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";" => ActionFn(741);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action741::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            295 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(742);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action742::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            296 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(743);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action743::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            297 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(744);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action744::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            298 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";" => ActionFn(745);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action745::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            299 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";" => ActionFn(746);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action746::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (3, ___symbol, 100)
+                })()
+            }
+            300 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";" => ActionFn(747);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action747::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            301 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";" => ActionFn(748);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action748::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            302 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";" => ActionFn(749);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action749::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            303 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(750);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action750::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            304 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(751);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action751::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            305 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(752);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action752::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            306 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(753);
+                    let ___sym8 = ___pop_Variant64(___symbols);
+                    let ___sym7 = ___pop_Variant0(___symbols);
+                    let ___sym6 = ___pop_Variant48(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym8.2.clone();
+                    let ___nt = super::___action753::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7, ___sym8);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (9, ___symbol, 100)
+                })()
+            }
+            307 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(754);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action754::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            308 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(755);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action755::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            309 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(756);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action756::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            310 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarParameters, ";", GrammarItem+ => ActionFn(757);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant47(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action757::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            311 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(758);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action758::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            312 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(759);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action759::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            313 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(760);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action760::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            314 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(761);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action761::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            315 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(762);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant47(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action762::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            316 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(763);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action763::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            317 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(764);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant47(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action764::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            318 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarParameters, ";", GrammarItem+ => ActionFn(765);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant47(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action765::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            319 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(766);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action766::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            320 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(767);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action767::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            321 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(768);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action768::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            322 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, GrammarWhereClauses, ";", GrammarItem+ => ActionFn(769);
+                    let ___sym7 = ___pop_Variant64(___symbols);
+                    let ___sym6 = ___pop_Variant0(___symbols);
+                    let ___sym5 = ___pop_Variant48(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym7.2.clone();
+                    let ___nt = super::___action769::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6, ___sym7);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (8, ___symbol, 100)
+                })()
+            }
+            323 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(770);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant54(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action770::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            324 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(771);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action771::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            325 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(772);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant54(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action772::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            326 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarTypeParameters, ";", GrammarItem+ => ActionFn(773);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant54(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action773::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            327 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(774);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant48(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action774::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            328 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(775);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action775::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            329 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(776);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant48(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action776::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            330 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", GrammarWhereClauses, ";", GrammarItem+ => ActionFn(777);
+                    let ___sym6 = ___pop_Variant64(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant48(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action777::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (7, ___symbol, 100)
+                })()
+            }
+            331 => {
+                (|| {
+                    // Grammar = Annotation+, "grammar", ";", GrammarItem+ => ActionFn(778);
+                    let ___sym3 = ___pop_Variant64(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action778::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (4, ___symbol, 100)
+                })()
+            }
+            332 => {
+                (|| {
+                    // Grammar = Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(779);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action779::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            333 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(780);
+                    let ___sym4 = ___pop_Variant64(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant43(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action780::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (5, ___symbol, 100)
+                })()
+            }
+            334 => {
+                (|| {
+                    // Grammar = ShebangAttribute+, Use+, Annotation+, "grammar", ";", GrammarItem+ => ActionFn(781);
+                    let ___sym5 = ___pop_Variant64(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant43(___symbols);
+                    let ___sym1 = ___pop_Variant64(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action781::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (6, ___symbol, 100)
+                })()
+            }
+            335 => {
+                (|| {
+                    // GrammarItem = Use => ActionFn(22);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action22::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            336 => {
+                (|| {
+                    // GrammarItem = MatchToken => ActionFn(23);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action23::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            337 => {
+                (|| {
+                    // GrammarItem = ExternToken => ActionFn(24);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action24::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            338 => {
+                (|| {
+                    // GrammarItem = Nonterminal => ActionFn(25);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action25::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 101)
+                })()
+            }
+            339 => {
+                (|| {
+                    // GrammarItem* =  => ActionFn(165);
+                    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::___action165::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 102)
+                })()
+            }
+            340 => {
+                (|| {
+                    // GrammarItem* = GrammarItem+ => ActionFn(166);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action166::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 102)
+                })()
+            }
+            341 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem => ActionFn(187);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action187::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 103)
+                })()
+            }
+            342 => {
+                (|| {
+                    // GrammarItem+ = GrammarItem+, GrammarItem => ActionFn(188);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action188::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 103)
+                })()
+            }
+            343 => {
+                (|| {
+                    // GrammarParameter = Id, ":", TypeRef => ActionFn(21);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action21::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant16(___nt), ___end);
+                    (3, ___symbol, 104)
+                })()
+            }
+            344 => {
+                (|| {
+                    // GrammarParameter? = GrammarParameter => ActionFn(220);
+                    let ___sym0 = ___pop_Variant16(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action220::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (1, ___symbol, 105)
+                })()
+            }
+            345 => {
+                (|| {
+                    // GrammarParameter? =  => ActionFn(221);
+                    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::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant65(___nt), ___end);
+                    (0, ___symbol, 105)
+                })()
+            }
+            346 => {
+                (|| {
+                    // GrammarParameters = "(", Comma<GrammarParameter>, ")" => ActionFn(20);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant47(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action20::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant47(___nt), ___end);
+                    (3, ___symbol, 106)
+                })()
+            }
+            347 => {
+                (|| {
+                    // GrammarParameters? = GrammarParameters => ActionFn(169);
+                    let ___sym0 = ___pop_Variant47(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action169::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (1, ___symbol, 107)
+                })()
+            }
+            348 => {
+                (|| {
+                    // GrammarParameters? =  => ActionFn(170);
+                    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::___action170::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant66(___nt), ___end);
+                    (0, ___symbol, 107)
+                })()
+            }
+            349 => {
+                (|| {
+                    // GrammarTypeParameters = "<", Comma<TypeParameter>, ">" => ActionFn(6);
+                    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::___action6::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant54(___nt), ___end);
+                    (3, ___symbol, 108)
+                })()
+            }
+            350 => {
+                (|| {
+                    // GrammarTypeParameters? = GrammarTypeParameters => ActionFn(171);
+                    let ___sym0 = ___pop_Variant54(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action171::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (1, ___symbol, 109)
+                })()
+            }
+            351 => {
+                (|| {
+                    // GrammarTypeParameters? =  => ActionFn(172);
+                    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::___action172::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant67(___nt), ___end);
+                    (0, ___symbol, 109)
+                })()
+            }
+            352 => {
+                (|| {
+                    // GrammarWhereClause = Lifetime, ":", Plus<Lifetime> => ActionFn(10);
+                    let ___sym2 = ___pop_Variant49(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action10::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            353 => {
+                (|| {
+                    // GrammarWhereClause = ForAll, TypeRef, ":", TypeBounds => ActionFn(462);
+                    let ___sym3 = ___pop_Variant81(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action462::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (4, ___symbol, 110)
+                })()
+            }
+            354 => {
+                (|| {
+                    // GrammarWhereClause = TypeRef, ":", TypeBounds => ActionFn(463);
+                    let ___sym2 = ___pop_Variant81(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action463::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant18(___nt), ___end);
+                    (3, ___symbol, 110)
+                })()
+            }
+            355 => {
+                (|| {
+                    // GrammarWhereClause? = GrammarWhereClause => ActionFn(194);
+                    let ___sym0 = ___pop_Variant18(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action194::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (1, ___symbol, 111)
+                })()
+            }
+            356 => {
+                (|| {
+                    // GrammarWhereClause? =  => 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::___action195::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant68(___nt), ___end);
+                    (0, ___symbol, 111)
+                })()
+            }
+            357 => {
+                (|| {
+                    // GrammarWhereClauses = "where", Comma<GrammarWhereClause> => ActionFn(9);
+                    let ___sym1 = ___pop_Variant48(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action9::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (2, ___symbol, 112)
+                })()
+            }
+            358 => {
+                (|| {
+                    // GrammarWhereClauses? = GrammarWhereClauses => ActionFn(167);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action167::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (1, ___symbol, 113)
+                })()
+            }
+            359 => {
+                (|| {
+                    // GrammarWhereClauses? =  => ActionFn(168);
+                    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::___action168::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant69(___nt), ___end);
+                    (0, ___symbol, 113)
+                })()
+            }
+            360 => {
+                (|| {
+                    // Id = "Id" => ActionFn(101);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action101::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            361 => {
+                (|| {
+                    // Id = "MacroId" => ActionFn(102);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action102::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 114)
+                })()
+            }
+            362 => {
+                (|| {
+                    // Lifetime = "Lifetime" => ActionFn(104);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action104::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 115)
+                })()
+            }
+            363 => {
+                (|| {
+                    // Lifetime? = Lifetime => ActionFn(131);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action131::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (1, ___symbol, 116)
+                })()
+            }
+            364 => {
+                (|| {
+                    // Lifetime? =  => ActionFn(132);
+                    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::___action132::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant70(___nt), ___end);
+                    (0, ___symbol, 116)
+                })()
+            }
+            365 => {
+                (|| {
+                    // MacroId = "MacroId" => ActionFn(99);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action99::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 117)
+                })()
+            }
+            366 => {
+                (|| {
+                    // MatchContents = Comma<MatchItem> => ActionFn(79);
+                    let ___sym0 = ___pop_Variant50(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action79::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant71(___nt), ___end);
+                    (1, ___symbol, 118)
+                })()
+            }
+            367 => {
+                (|| {
+                    // MatchItem = "_" => ActionFn(423);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action423::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            368 => {
+                (|| {
+                    // MatchItem = MatchSymbol => ActionFn(424);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action424::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                    (1, ___symbol, 119)
+                })()
+            }
+            369 => {
+                // MatchItem = MatchSymbol, "=>" => ActionFn(425);
+                let ___sym1 = ___pop_Variant1(___symbols);
+                let ___sym0 = ___pop_Variant74(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym1.2.clone();
+                let ___nt = match super::___action425::<>(text, ___sym0, ___sym1) {
+                    Ok(v) => v,
+                    Err(e) => return Some(Err(e)),
+                };
+                let ___symbol = (___start, ___Symbol::Variant22(___nt), ___end);
+                (2, ___symbol, 119)
+            }
+            370 => {
+                (|| {
+                    // MatchItem? = MatchItem => ActionFn(249);
+                    let ___sym0 = ___pop_Variant22(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action249::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (1, ___symbol, 120)
+                })()
+            }
+            371 => {
+                (|| {
+                    // MatchItem? =  => ActionFn(250);
+                    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::___action250::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant72(___nt), ___end);
+                    (0, ___symbol, 120)
+                })()
+            }
+            372 => {
+                (|| {
+                    // MatchMapping = Terminal => ActionFn(84);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action84::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 121)
+                })()
+            }
+            373 => {
+                (|| {
+                    // MatchSymbol = QuotedLiteral => ActionFn(83);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action83::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 122)
+                })()
+            }
+            374 => {
+                (|| {
+                    // MatchToken = MatchTokenInt => ActionFn(76);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action76::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (1, ___symbol, 123)
+                })()
+            }
+            375 => {
+                (|| {
+                    // MatchTokenInt = MatchTokenInt, "else", "{", MatchContents, "}" => ActionFn(77);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant71(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant75(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action77::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (5, ___symbol, 124)
+                })()
+            }
+            376 => {
+                (|| {
+                    // MatchTokenInt = "match", "{", MatchContents, "}" => ActionFn(426);
+                    let ___sym3 = ___pop_Variant0(___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::___action426::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant75(___nt), ___end);
+                    (4, ___symbol, 124)
+                })()
+            }
+            377 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(444);
+                    let ___sym5 = ___pop_Variant41(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action444::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (6, ___symbol, 125)
+                })()
+            }
+            378 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, ":", TypeRef, "=", Alternatives => ActionFn(445);
+                    let ___sym6 = ___pop_Variant41(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant3(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action445::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (7, ___symbol, 125)
+                })()
+            }
+            379 => {
+                (|| {
+                    // Nonterminal = Visibility, NonterminalName, "=", Alternatives => ActionFn(446);
+                    let ___sym3 = ___pop_Variant41(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant76(___symbols);
+                    let ___sym0 = ___pop_Variant90(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action446::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (4, ___symbol, 125)
+                })()
+            }
+            380 => {
+                (|| {
+                    // Nonterminal = Annotation+, Visibility, NonterminalName, "=", Alternatives => ActionFn(447);
+                    let ___sym4 = ___pop_Variant41(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant76(___symbols);
+                    let ___sym1 = ___pop_Variant90(___symbols);
+                    let ___sym0 = ___pop_Variant43(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action447::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (5, ___symbol, 125)
+                })()
+            }
+            381 => {
+                (|| {
+                    // NonterminalName = MacroId, "<", Comma<NotMacroId>, ">" => ActionFn(32);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant51(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action32::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (4, ___symbol, 126)
+                })()
+            }
+            382 => {
+                (|| {
+                    // NonterminalName = NotMacroId => ActionFn(33);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action33::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            383 => {
+                (|| {
+                    // NonterminalName = "Escape" => ActionFn(34);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action34::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant76(___nt), ___end);
+                    (1, ___symbol, 126)
+                })()
+            }
+            384 => {
+                (|| {
+                    // NotMacroId = "Id" => ActionFn(100);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action100::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant24(___nt), ___end);
+                    (1, ___symbol, 127)
+                })()
+            }
+            385 => {
+                (|| {
+                    // NotMacroId? = NotMacroId => ActionFn(225);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action225::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (1, ___symbol, 128)
+                })()
+            }
+            386 => {
+                (|| {
+                    // NotMacroId? =  => ActionFn(226);
+                    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::___action226::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant77(___nt), ___end);
+                    (0, ___symbol, 128)
+                })()
+            }
+            387 => {
+                (|| {
+                    // Path = "::", Id => ActionFn(339);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action339::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            388 => {
+                (|| {
+                    // Path = "::", (<Id> "::")+, Id => ActionFn(340);
+                    let ___sym2 = ___pop_Variant20(___symbols);
+                    let ___sym1 = ___pop_Variant21(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action340::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (3, ___symbol, 129)
+                })()
+            }
+            389 => {
+                (|| {
+                    // Path = Id => ActionFn(341);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action341::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (1, ___symbol, 129)
+                })()
+            }
+            390 => {
+                (|| {
+                    // Path = (<Id> "::")+, Id => ActionFn(342);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action342::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant78(___nt), ___end);
+                    (2, ___symbol, 129)
+                })()
+            }
+            391 => {
+                (|| {
+                    // Pattern = PatternKind => ActionFn(429);
+                    let ___sym0 = ___pop_Variant80(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action429::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 130)
+                })()
+            }
+            392 => {
+                (|| {
+                    // Pattern? = Pattern => ActionFn(259);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action259::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (1, ___symbol, 131)
+                })()
+            }
+            393 => {
+                (|| {
+                    // Pattern? =  => ActionFn(260);
+                    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::___action260::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant79(___nt), ___end);
+                    (0, ___symbol, 131)
+                })()
+            }
+            394 => {
+                (|| {
+                    // PatternKind = Path, "(", Comma<Pattern>, ")" => ActionFn(89);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant52(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action89::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            395 => {
+                (|| {
+                    // PatternKind = Path, "{", FieldPattern, "}" => ActionFn(458);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant14(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action458::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            396 => {
+                (|| {
+                    // PatternKind = Path, "{", "}" => ActionFn(459);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action459::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            397 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, FieldPattern, "}" => ActionFn(460);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant14(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action460::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            398 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "}" => ActionFn(461);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action461::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            399 => {
+                (|| {
+                    // PatternKind = Path, "{", "..", "}" => ActionFn(327);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action327::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (4, ___symbol, 132)
+                })()
+            }
+            400 => {
+                (|| {
+                    // PatternKind = Path, "{", (<FieldPattern> ",")+, "..", "}" => ActionFn(328);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant15(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action328::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (5, ___symbol, 132)
+                })()
+            }
+            401 => {
+                (|| {
+                    // PatternKind = "_" => ActionFn(92);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action92::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            402 => {
+                (|| {
+                    // PatternKind = ".." => ActionFn(93);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action93::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            403 => {
+                (|| {
+                    // PatternKind = "<", TypeRef, ">" => ActionFn(94);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action94::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            404 => {
+                (|| {
+                    // PatternKind = "(", Comma<Pattern>, ")" => ActionFn(95);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant52(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action95::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (3, ___symbol, 132)
+                })()
+            }
+            405 => {
+                (|| {
+                    // PatternKind = "CharLiteral" => ActionFn(96);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action96::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            406 => {
+                (|| {
+                    // PatternKind = Path => ActionFn(97);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action97::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant80(___nt), ___end);
+                    (1, ___symbol, 132)
+                })()
+            }
+            407 => {
+                (|| {
+                    // Plus<Lifetime> = Lifetime => ActionFn(544);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action544::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            408 => {
+                (|| {
+                    // Plus<Lifetime> =  => ActionFn(545);
+                    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::___action545::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (0, ___symbol, 133)
+                })()
+            }
+            409 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+, Lifetime => ActionFn(546);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action546::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (2, ___symbol, 133)
+                })()
+            }
+            410 => {
+                (|| {
+                    // Plus<Lifetime> = (<Lifetime> "+")+ => ActionFn(547);
+                    let ___sym0 = ___pop_Variant21(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action547::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant49(___nt), ___end);
+                    (1, ___symbol, 133)
+                })()
+            }
+            411 => {
+                (|| {
+                    // Plus<TypeBound> = TypeBound => ActionFn(634);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action634::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            412 => {
+                (|| {
+                    // Plus<TypeBound> =  => ActionFn(635);
+                    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::___action635::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (0, ___symbol, 134)
+                })()
+            }
+            413 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+, TypeBound => ActionFn(636);
+                    let ___sym1 = ___pop_Variant30(___symbols);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action636::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (2, ___symbol, 134)
+                })()
+            }
+            414 => {
+                (|| {
+                    // Plus<TypeBound> = (<TypeBound> "+")+ => ActionFn(637);
+                    let ___sym0 = ___pop_Variant31(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action637::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 134)
+                })()
+            }
+            415 => {
+                (|| {
+                    // QuotedLiteral = StringLiteral => ActionFn(108);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action108::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            416 => {
+                (|| {
+                    // QuotedLiteral = RegexLiteral => ActionFn(109);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action109::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant74(___nt), ___end);
+                    (1, ___symbol, 135)
+                })()
+            }
+            417 => {
+                (|| {
+                    // QuotedTerminal = QuotedLiteral => ActionFn(107);
+                    let ___sym0 = ___pop_Variant74(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action107::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 136)
+                })()
+            }
+            418 => {
+                (|| {
+                    // RegexLiteral = "RegexLiteral" => ActionFn(111);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action111::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 137)
+                })()
+            }
+            419 => {
+                (|| {
+                    // RepeatOp = "+" => ActionFn(54);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action54::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            420 => {
+                (|| {
+                    // RepeatOp = "*" => ActionFn(55);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action55::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            421 => {
+                (|| {
+                    // RepeatOp = "?" => ActionFn(56);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action56::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant82(___nt), ___end);
+                    (1, ___symbol, 138)
+                })()
+            }
+            422 => {
+                (|| {
+                    // ShebangAttribute = "#![...]" => ActionFn(112);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action112::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant83(___nt), ___end);
+                    (1, ___symbol, 139)
+                })()
+            }
+            423 => {
+                (|| {
+                    // ShebangAttribute* =  => ActionFn(179);
+                    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::___action179::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (0, ___symbol, 140)
+                })()
+            }
+            424 => {
+                (|| {
+                    // ShebangAttribute* = ShebangAttribute+ => ActionFn(180);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action180::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 140)
+                })()
+            }
+            425 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute => ActionFn(181);
+                    let ___sym0 = ___pop_Variant83(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action181::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (1, ___symbol, 141)
+                })()
+            }
+            426 => {
+                (|| {
+                    // ShebangAttribute+ = ShebangAttribute+, ShebangAttribute => ActionFn(182);
+                    let ___sym1 = ___pop_Variant83(___symbols);
+                    let ___sym0 = ___pop_Variant84(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action182::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant84(___nt), ___end);
+                    (2, ___symbol, 141)
+                })()
+            }
+            427 => {
+                (|| {
+                    // StringLiteral = "StringLiteral" => ActionFn(110);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action110::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant20(___nt), ___end);
+                    (1, ___symbol, 142)
+                })()
+            }
+            428 => {
+                (|| {
+                    // Symbol = "<", Id, ":", Symbol0, ">" => ActionFn(430);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant28(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action430::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (5, ___symbol, 143)
+                })()
+            }
+            429 => {
+                (|| {
+                    // Symbol = "<", Symbol0, ">" => ActionFn(431);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action431::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (3, ___symbol, 143)
+                })()
+            }
+            430 => {
+                (|| {
+                    // Symbol = Symbol0 => ActionFn(51);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action51::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 143)
+                })()
+            }
+            431 => {
+                (|| {
+                    // Symbol* =  => ActionFn(134);
+                    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::___action134::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (0, ___symbol, 144)
+                })()
+            }
+            432 => {
+                (|| {
+                    // Symbol* = Symbol+ => ActionFn(135);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action135::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 144)
+                })()
+            }
+            433 => {
+                (|| {
+                    // Symbol+ = Symbol => ActionFn(141);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action141::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (1, ___symbol, 145)
+                })()
+            }
+            434 => {
+                (|| {
+                    // Symbol+ = Symbol+, Symbol => ActionFn(142);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant29(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action142::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant29(___nt), ___end);
+                    (2, ___symbol, 145)
+                })()
+            }
+            435 => {
+                (|| {
+                    // Symbol0 = Symbol1 => ActionFn(52);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action52::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 146)
+                })()
+            }
+            436 => {
+                (|| {
+                    // Symbol0 = Symbol0, RepeatOp => ActionFn(432);
+                    let ___sym1 = ___pop_Variant82(___symbols);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action432::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (2, ___symbol, 146)
+                })()
+            }
+            437 => {
+                (|| {
+                    // Symbol1 = SymbolKind1 => ActionFn(433);
+                    let ___sym0 = ___pop_Variant86(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action433::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant28(___nt), ___end);
+                    (1, ___symbol, 147)
+                })()
+            }
+            438 => {
+                (|| {
+                    // Symbol? = Symbol => ActionFn(235);
+                    let ___sym0 = ___pop_Variant28(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action235::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (1, ___symbol, 148)
+                })()
+            }
+            439 => {
+                (|| {
+                    // Symbol? =  => ActionFn(236);
+                    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::___action236::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant85(___nt), ___end);
+                    (0, ___symbol, 148)
+                })()
+            }
+            440 => {
+                (|| {
+                    // SymbolKind1 = MacroId, "<", Comma<Symbol>, ">" => ActionFn(58);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant53(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant24(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action58::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (4, ___symbol, 149)
+                })()
+            }
+            441 => {
+                (|| {
+                    // SymbolKind1 = QuotedTerminal => ActionFn(59);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action59::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            442 => {
+                (|| {
+                    // SymbolKind1 = "Id" => ActionFn(60);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action60::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            443 => {
+                (|| {
+                    // SymbolKind1 = Escape => ActionFn(61);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action61::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            444 => {
+                (|| {
+                    // SymbolKind1 = "(", ExprSymbol, ")" => ActionFn(62);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant59(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action62::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (3, ___symbol, 149)
+                })()
+            }
+            445 => {
+                (|| {
+                    // SymbolKind1 = "@L" => ActionFn(63);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action63::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            446 => {
+                (|| {
+                    // SymbolKind1 = "@R" => ActionFn(64);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action64::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            447 => {
+                (|| {
+                    // SymbolKind1 = "!" => ActionFn(65);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action65::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant86(___nt), ___end);
+                    (1, ___symbol, 149)
+                })()
+            }
+            448 => {
+                (|| {
+                    // Terminal = QuotedTerminal => ActionFn(105);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action105::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            449 => {
+                (|| {
+                    // Terminal = "Id" => ActionFn(106);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action106::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 150)
+                })()
+            }
+            450 => {
+                (|| {
+                    // TypeBound = Lifetime => ActionFn(14);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action14::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            451 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(464);
+                    let ___sym6 = ___pop_Variant3(___symbols);
+                    let ___sym5 = ___pop_Variant0(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym6.2.clone();
+                    let ___nt = super::___action464::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5, ___sym6);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (7, ___symbol, 151)
+                })()
+            }
+            452 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")", "->", TypeRef => ActionFn(465);
+                    let ___sym5 = ___pop_Variant3(___symbols);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym5.2.clone();
+                    let ___nt = super::___action465::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4, ___sym5);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (6, ___symbol, 151)
+                })()
+            }
+            453 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "(", Comma<TypeRef>, ")" => ActionFn(466);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant55(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action466::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            454 => {
+                (|| {
+                    // TypeBound = Path, "(", Comma<TypeRef>, ")" => ActionFn(467);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action467::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            455 => {
+                (|| {
+                    // TypeBound = ForAll, Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(468);
+                    let ___sym4 = ___pop_Variant0(___symbols);
+                    let ___sym3 = ___pop_Variant5(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym4.2.clone();
+                    let ___nt = super::___action468::<>(text, ___sym0, ___sym1, ___sym2, ___sym3, ___sym4);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (5, ___symbol, 151)
+                })()
+            }
+            456 => {
+                (|| {
+                    // TypeBound = Path, "<", Comma<TypeBoundParameter>, ">" => ActionFn(469);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant5(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action469::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (4, ___symbol, 151)
+                })()
+            }
+            457 => {
+                (|| {
+                    // TypeBound = ForAll, Path => ActionFn(470);
+                    let ___sym1 = ___pop_Variant78(___symbols);
+                    let ___sym0 = ___pop_Variant49(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action470::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (2, ___symbol, 151)
+                })()
+            }
+            458 => {
+                (|| {
+                    // TypeBound = Path => ActionFn(471);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action471::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant30(___nt), ___end);
+                    (1, ___symbol, 151)
+                })()
+            }
+            459 => {
+                (|| {
+                    // TypeBound? = TypeBound => ActionFn(205);
+                    let ___sym0 = ___pop_Variant30(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action205::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (1, ___symbol, 152)
+                })()
+            }
+            460 => {
+                (|| {
+                    // TypeBound? =  => 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::___action206::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant87(___nt), ___end);
+                    (0, ___symbol, 152)
+                })()
+            }
+            461 => {
+                (|| {
+                    // TypeBoundParameter = Lifetime => ActionFn(17);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action17::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            462 => {
+                (|| {
+                    // TypeBoundParameter = TypeRef => ActionFn(18);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action18::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (1, ___symbol, 153)
+                })()
+            }
+            463 => {
+                (|| {
+                    // TypeBoundParameter = Id, "=", TypeRef => ActionFn(19);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action19::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant32(___nt), ___end);
+                    (3, ___symbol, 153)
+                })()
+            }
+            464 => {
+                (|| {
+                    // TypeBoundParameter? = TypeBoundParameter => ActionFn(215);
+                    let ___sym0 = ___pop_Variant32(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action215::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (1, ___symbol, 154)
+                })()
+            }
+            465 => {
+                (|| {
+                    // TypeBoundParameter? =  => 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::___action216::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant88(___nt), ___end);
+                    (0, ___symbol, 154)
+                })()
+            }
+            466 => {
+                (|| {
+                    // TypeBounds = Plus<TypeBound> => ActionFn(13);
+                    let ___sym0 = ___pop_Variant81(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action13::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant81(___nt), ___end);
+                    (1, ___symbol, 155)
+                })()
+            }
+            467 => {
+                (|| {
+                    // TypeParameter = Lifetime => ActionFn(7);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action7::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            468 => {
+                (|| {
+                    // TypeParameter = Id => ActionFn(8);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action8::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant34(___nt), ___end);
+                    (1, ___symbol, 156)
+                })()
+            }
+            469 => {
+                (|| {
+                    // TypeParameter? = TypeParameter => ActionFn(189);
+                    let ___sym0 = ___pop_Variant34(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action189::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (1, ___symbol, 157)
+                })()
+            }
+            470 => {
+                (|| {
+                    // TypeParameter? =  => ActionFn(190);
+                    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::___action190::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant89(___nt), ___end);
+                    (0, ___symbol, 157)
+                })()
+            }
+            471 => {
+                (|| {
+                    // TypeRef = "(", Comma<TypeRef>, ")" => ActionFn(66);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant55(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action66::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            472 => {
+                (|| {
+                    // TypeRef = "#", Symbol, "#" => ActionFn(67);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant28(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action67::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            473 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, "mut", TypeRef => ActionFn(548);
+                    let ___sym3 = ___pop_Variant3(___symbols);
+                    let ___sym2 = ___pop_Variant0(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action548::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            474 => {
+                (|| {
+                    // TypeRef = "&", "mut", TypeRef => ActionFn(549);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action549::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            475 => {
+                (|| {
+                    // TypeRef = "&", Lifetime, TypeRef => ActionFn(550);
+                    let ___sym2 = ___pop_Variant3(___symbols);
+                    let ___sym1 = ___pop_Variant20(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym2.2.clone();
+                    let ___nt = super::___action550::<>(text, ___sym0, ___sym1, ___sym2);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (3, ___symbol, 158)
+                })()
+            }
+            476 => {
+                (|| {
+                    // TypeRef = "&", TypeRef => ActionFn(551);
+                    let ___sym1 = ___pop_Variant3(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action551::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (2, ___symbol, 158)
+                })()
+            }
+            477 => {
+                (|| {
+                    // TypeRef = Path, "<", Comma<TypeRefOrLifetime>, ">" => ActionFn(69);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant55(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action69::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (4, ___symbol, 158)
+                })()
+            }
+            478 => {
+                (|| {
+                    // TypeRef = Path => ActionFn(70);
+                    let ___sym0 = ___pop_Variant78(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action70::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 158)
+                })()
+            }
+            479 => {
+                (|| {
+                    // TypeRef? = TypeRef => ActionFn(210);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action210::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 159)
+                })()
+            }
+            480 => {
+                (|| {
+                    // TypeRef? =  => ActionFn(211);
+                    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::___action211::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 159)
+                })()
+            }
+            481 => {
+                (|| {
+                    // TypeRefOrLifetime = TypeRef => ActionFn(71);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action71::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            482 => {
+                (|| {
+                    // TypeRefOrLifetime = Lifetime => ActionFn(72);
+                    let ___sym0 = ___pop_Variant20(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action72::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant3(___nt), ___end);
+                    (1, ___symbol, 160)
+                })()
+            }
+            483 => {
+                (|| {
+                    // TypeRefOrLifetime? = TypeRefOrLifetime => ActionFn(240);
+                    let ___sym0 = ___pop_Variant3(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action240::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (1, ___symbol, 161)
+                })()
+            }
+            484 => {
+                (|| {
+                    // TypeRefOrLifetime? =  => ActionFn(241);
+                    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::___action241::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant4(___nt), ___end);
+                    (0, ___symbol, 161)
+                })()
+            }
+            485 => {
+                (|| {
+                    // Use = "use", ";" => ActionFn(26);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant1(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action26::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant60(___nt), ___end);
+                    (2, ___symbol, 162)
+                })()
+            }
+            486 => {
+                (|| {
+                    // Use* =  => ActionFn(177);
+                    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::___action177::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (0, ___symbol, 163)
+                })()
+            }
+            487 => {
+                (|| {
+                    // Use* = Use+ => ActionFn(178);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action178::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 163)
+                })()
+            }
+            488 => {
+                (|| {
+                    // Use+ = Use => ActionFn(183);
+                    let ___sym0 = ___pop_Variant60(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action183::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (1, ___symbol, 164)
+                })()
+            }
+            489 => {
+                (|| {
+                    // Use+ = Use+, Use => ActionFn(184);
+                    let ___sym1 = ___pop_Variant60(___symbols);
+                    let ___sym0 = ___pop_Variant64(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym1.2.clone();
+                    let ___nt = super::___action184::<>(text, ___sym0, ___sym1);
+                    let ___symbol = (___start, ___Symbol::Variant64(___nt), ___end);
+                    (2, ___symbol, 164)
+                })()
+            }
+            490 => {
+                (|| {
+                    // Visibility = "pub", "(", Path, ")" => ActionFn(27);
+                    let ___sym3 = ___pop_Variant0(___symbols);
+                    let ___sym2 = ___pop_Variant78(___symbols);
+                    let ___sym1 = ___pop_Variant0(___symbols);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym3.2.clone();
+                    let ___nt = super::___action27::<>(text, ___sym0, ___sym1, ___sym2, ___sym3);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (4, ___symbol, 165)
+                })()
+            }
+            491 => {
+                (|| {
+                    // Visibility = "pub" => ActionFn(28);
+                    let ___sym0 = ___pop_Variant0(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action28::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (1, ___symbol, 165)
+                })()
+            }
+            492 => {
+                (|| {
+                    // Visibility =  => ActionFn(314);
+                    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::___action314::<>(text, &___start, &___end);
+                    let ___symbol = (___start, ___Symbol::Variant90(___nt), ___end);
+                    (0, ___symbol, 165)
+                })()
+            }
+            493 => {
+                (|| {
+                    // ___Grammar = Grammar => ActionFn(0);
+                    let ___sym0 = ___pop_Variant63(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action0::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant63(___nt), ___end);
+                    (1, ___symbol, 166)
+                })()
+            }
+            494 => {
+                (|| {
+                    // ___GrammarWhereClauses = GrammarWhereClauses => ActionFn(1);
+                    let ___sym0 = ___pop_Variant48(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action1::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant48(___nt), ___end);
+                    (1, ___symbol, 167)
+                })()
+            }
+            495 => {
+                (|| {
+                    // ___MatchMapping = MatchMapping => ActionFn(3);
+                    let ___sym0 = ___pop_Variant73(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action3::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant73(___nt), ___end);
+                    (1, ___symbol, 168)
+                })()
+            }
+            496 => {
+                (|| {
+                    // ___Pattern = Pattern => ActionFn(4);
+                    let ___sym0 = ___pop_Variant26(___symbols);
+                    let ___start = ___sym0.0.clone();
+                    let ___end = ___sym0.2.clone();
+                    let ___nt = super::___action4::<>(text, ___sym0);
+                    let ___symbol = (___start, ___Symbol::Variant26(___nt), ___end);
+                    (1, ___symbol, 169)
+                })()
+            }
+            497 => {
+                // ___TypeRef = TypeRef => ActionFn(2);
+                let ___sym0 = ___pop_Variant3(___symbols);
+                let ___start = ___sym0.0.clone();
+                let ___end = ___sym0.2.clone();
+                let ___nt = super::___action2::<>(text, ___sym0);
+                return Some(Ok(___nt));
+            }
+            _ => 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 * 171 + ___nonterminal] - 1;
+        ___states.push(___next_state);
+        None
+    }
+    fn ___pop_Variant9<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant9(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant76<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, (NonterminalString, Vec<NonterminalString>), usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant76(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant38<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ActionKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant38(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant10<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Alternative, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant10(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant42<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Annotation, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant42(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant44<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, AssociatedType, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant44(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant20<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Atom, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant20(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant7<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Condition, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant7(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant56<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ConditionOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant56(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant12<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Conversion, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant12(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant58<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, EnumToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant58(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant59<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ExprSymbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant59(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant14<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, FieldPattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant14(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant63<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Grammar, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant63(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant60<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, GrammarItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant60(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant71<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchContents, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant71(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant22<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchItem, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant22(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant75<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, MatchToken, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant75(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant24<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, NonterminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant24(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant16<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Parameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant16(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant78<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Path, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant78(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant26<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Pattern<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant26(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant80<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, PatternKind<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant80(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant82<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, RepeatOp, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant82(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant83<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant83(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant28<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant28(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant86<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, SymbolKind, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant86(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant74<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalLiteral, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant74(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant73<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TerminalString, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant73(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant0<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Tok<'input>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant0(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant30<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBound<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant30(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant32<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeBoundParameter<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant32(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant34<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeParameter, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant34(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant3<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, TypeRef, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant3(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant41<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant41(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant49<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant49(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant46<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant46(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant50<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant50(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant51<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant51(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant47<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant47(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant52<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant52(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant53<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant53(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant81<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant81(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant5<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant5(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant54<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant54(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant55<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant55(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant48<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant48(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant90<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, Visibility, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant90(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant18<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, WhereClause<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant18(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant37<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant37(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant39<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<ActionKind>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant39(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant40<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant40(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant70<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant70(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant8<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Condition>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant8(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant57<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant57(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant61<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant61(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant72<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant72(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant77<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant77(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant65<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant65(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant79<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant79(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant85<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant85(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant2<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Tok<'input>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant2(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant87<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant87(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant88<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant88(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant89<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant89(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant4<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant4(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant62<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Atom>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant62(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant66<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<Parameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant66(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant6<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant6(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant67<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<TypeParameter>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant67(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant69<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant69(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant68<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::option::Option<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant68(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant11<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Alternative>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant11(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant43<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Annotation>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant43(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant45<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<AssociatedType>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant45(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant21<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Atom>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant21(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant13<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Conversion>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant13(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant15<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant15(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant64<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<GrammarItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant64(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant23<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<MatchItem>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant23(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant25<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<NonterminalString>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant25(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant17<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Parameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant17(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant27<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant27(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant84<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<String>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant84(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant29<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<Symbol>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant29(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant31<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant31(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant33<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant33(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant35<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeParameter>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant35(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant36<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<TypeRef>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant36(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant19<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant19(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+    fn ___pop_Variant1<
+      'input,
+    >(
+        ___symbols: &mut ::std::vec::Vec<(usize,___Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match ___symbols.pop().unwrap() {
+            (___l, ___Symbol::Variant1(___v), ___r) => (___l, ___v, ___r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
+}
+pub use self::___parse___TypeRef::TypeRefParser;
+
+#[allow(unused_variables)]
+fn ___action0<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Grammar, usize),
+) -> Grammar
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action1<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action2<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action3<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action4<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> Pattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action5<
+    'input,
+>(
+    text: &'input str,
+    (_, module_attributes, _): (usize, ::std::vec::Vec<String>, usize),
+    (_, uses, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, annotations, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, tps, _): (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    (_, parameters, _): (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    (_, where_clauses, _): (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, items, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    {
+        Grammar { prefix: format!("__"), // adjusted by `parse_grammar`
+                  span: Span(lo, hi),
+                  type_parameters: tps.unwrap_or(vec![]),
+                  parameters: parameters.unwrap_or(vec![]),
+                  where_clauses: where_clauses.unwrap_or(vec![]),
+                  items: uses.into_iter().chain(items).collect(),
+                  annotations: annotations,
+                  module_attributes: module_attributes}
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action6<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeParameter>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<TypeParameter>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action7<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeParameter
+{
+    TypeParameter::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action8<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeParameter
+{
+    TypeParameter::Id(l)
+}
+
+#[allow(unused_variables)]
+fn ___action9<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action10<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, bounds, _): (usize, Vec<Atom>, usize),
+) -> WhereClause<TypeRef>
+{
+    WhereClause::Lifetime { lifetime: l, bounds: bounds }
+}
+
+#[allow(unused_variables)]
+fn ___action11<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, bounds, _): (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    WhereClause::Type { forall: f, ty: ty, bounds: bounds }
+}
+
+#[allow(unused_variables)]
+fn ___action12<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Atom>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Atom>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action13<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action14<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action15<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, params, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ret, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Fn { forall: f, path: p, parameters: params, ret: ret }
+}
+
+#[allow(unused_variables)]
+fn ___action16<
+    'input,
+>(
+    text: &'input str,
+    (_, f, _): (usize, ::std::option::Option<Vec<Atom>>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, params, _): (usize, ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>, usize),
+) -> TypeBound<TypeRef>
+{
+    TypeBound::Trait { forall: f, path: p, parameters: params.unwrap_or(vec![]) }
+}
+
+#[allow(unused_variables)]
+fn ___action17<
+    'input,
+>(
+    text: &'input str,
+    (_, l, _): (usize, Atom, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::Lifetime(l)
+}
+
+#[allow(unused_variables)]
+fn ___action18<
+    'input,
+>(
+    text: &'input str,
+    (_, ty, _): (usize, TypeRef, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::TypeParameter(ty)
+}
+
+#[allow(unused_variables)]
+fn ___action19<
+    'input,
+>(
+    text: &'input str,
+    (_, id, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    TypeBoundParameter::Associated(id, ty)
+}
+
+#[allow(unused_variables)]
+fn ___action20<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Parameter>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Parameter>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action21<
+    'input,
+>(
+    text: &'input str,
+    (_, id, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ty, _): (usize, TypeRef, usize),
+) -> Parameter
+{
+    Parameter { name: id, ty: ty }
+}
+
+#[allow(unused_variables)]
+fn ___action22<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action23<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action24<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action25<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> GrammarItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action26<
+    'input,
+>(
+    text: &'input str,
+    (_, u, _): (usize, &'input str, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    GrammarItem::Use(strip(u).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action27<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Visibility
+{
+    Visibility::Pub(Some(p))
+}
+
+#[allow(unused_variables)]
+fn ___action28<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> Visibility
+{
+    Visibility::Pub(None)
+}
+
+#[allow(unused_variables)]
+fn ___action29<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, (), usize),
+) -> Visibility
+{
+    Visibility::Priv
+}
+
+#[allow(unused_variables)]
+fn ___action30<
+    'input,
+>(
+    text: &'input str,
+    (_, annotations, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, v, _): (usize, Visibility, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, n, _): (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, t, _): (usize, ::std::option::Option<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a, _): (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::Nonterminal(NonterminalData { visibility: v,
+                                                   span: Span(lo, hi),
+                                                   name: n.0,
+                                                   annotations: annotations,
+                                                   args: n.1,
+                                                   type_decl: t,
+                                                   alternatives: a })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action31<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, id, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    {
+        Annotation { id_span: Span(lo, hi), id: id }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action32<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___1, _): (usize, Vec<NonterminalString>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (___0, ___1)
+}
+
+#[allow(unused_variables)]
+fn ___action33<
+    'input,
+>(
+    text: &'input str,
+    (_, n, _): (usize, NonterminalString, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (n, vec![])
+}
+
+#[allow(unused_variables)]
+fn ___action34<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, &'input str, usize),
+) -> (NonterminalString, Vec<NonterminalString>)
+{
+    (NonterminalString(Atom::from(___0)), vec![])
+}
+
+#[allow(unused_variables)]
+fn ___action35<
+    'input,
+>(
+    text: &'input str,
+    (_, a, _): (usize, Alternative, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Alternative>
+{
+    vec![a]
+}
+
+#[allow(unused_variables)]
+fn ___action36<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Alternative>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<Alternative>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action37<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, s, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, c, _): (usize, ::std::option::Option<Condition>, usize),
+    (_, a, _): (usize, ::std::option::Option<ActionKind>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Alternative
+{
+    {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: s },
+            condition: c,
+            action: a
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action38<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, c, _): (usize, ::std::option::Option<Condition>, usize),
+    (_, a, _): (usize, ActionKind, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Alternative
+{
+    {
+        Alternative {
+            span: Span(lo, hi),
+            expr: ExprSymbol { symbols: vec![] },
+            condition: c,
+            action: Some(a)
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action39<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ActionKind
+{
+    ActionKind::Lookahead
+}
+
+#[allow(unused_variables)]
+fn ___action40<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ActionKind
+{
+    ActionKind::Lookbehind
+}
+
+#[allow(unused_variables)]
+fn ___action41<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> ActionKind
+{
+    ActionKind::User(strip(c).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action42<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> ActionKind
+{
+    ActionKind::Fallible(strip(c).to_string())
+}
+
+#[allow(unused_variables)]
+fn ___action43<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, a, _): (usize, NonterminalString, usize),
+    (_, op, _): (usize, ConditionOp, usize),
+    (_, b, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Condition
+{
+    {
+        Condition { span:Span(lo, hi), lhs:a, rhs:b, op:op }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action44<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::Equals
+}
+
+#[allow(unused_variables)]
+fn ___action45<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::NotEquals
+}
+
+#[allow(unused_variables)]
+fn ___action46<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::Match
+}
+
+#[allow(unused_variables)]
+fn ___action47<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ConditionOp
+{
+    ConditionOp::NotMatch
+}
+
+#[allow(unused_variables)]
+fn ___action48<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ExprSymbol
+{
+    ExprSymbol { symbols: ___0 }
+}
+
+#[allow(unused_variables)]
+fn ___action49<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, usize, usize),
+    (_, l, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, s, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), SymbolKind::Name(l, Box::new(s)))
+}
+
+#[allow(unused_variables)]
+fn ___action50<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, s, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), SymbolKind::Choose(Box::new(s)))
+}
+
+#[allow(unused_variables)]
+fn ___action51<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action52<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action53<
+    'input,
+>(
+    text: &'input str,
+    (_, lhs, _): (usize, Symbol, usize),
+    (_, op, _): (usize, RepeatOp, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lhs.span.0, hi),
+                    SymbolKind::Repeat(Box::new(RepeatSymbol { symbol: lhs, op: op })))
+}
+
+#[allow(unused_variables)]
+fn ___action54<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Plus
+}
+
+#[allow(unused_variables)]
+fn ___action55<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Star
+}
+
+#[allow(unused_variables)]
+fn ___action56<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> RepeatOp
+{
+    RepeatOp::Question
+}
+
+#[allow(unused_variables)]
+fn ___action57<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, sk, _): (usize, SymbolKind, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Symbol
+{
+    Symbol::new(Span(lo, hi), sk)
+}
+
+#[allow(unused_variables)]
+fn ___action58<
+    'input,
+>(
+    text: &'input str,
+    (_, name, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, args, _): (usize, Vec<Symbol>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Macro(MacroSymbol { name: name, args: args })
+}
+
+#[allow(unused_variables)]
+fn ___action59<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> SymbolKind
+{
+    SymbolKind::Terminal(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action60<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, &'input str, usize),
+) -> SymbolKind
+{
+    SymbolKind::AmbiguousId(Atom::from(___0))
+}
+
+#[allow(unused_variables)]
+fn ___action61<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> SymbolKind
+{
+    SymbolKind::Nonterminal(NonterminalString(___0))
+}
+
+#[allow(unused_variables)]
+fn ___action62<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, ExprSymbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Expr(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action63<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Lookahead
+}
+
+#[allow(unused_variables)]
+fn ___action64<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Lookbehind
+}
+
+#[allow(unused_variables)]
+fn ___action65<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> SymbolKind
+{
+    SymbolKind::Error
+}
+
+#[allow(unused_variables)]
+fn ___action66<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    TypeRef::Tuple(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action67<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    {
+        TypeRef::OfSymbol(___0.kind)
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action68<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, l, _): (usize, ::std::option::Option<Atom>, usize),
+    (_, m, _): (usize, ::std::option::Option<Tok<'input>>, usize),
+    (_, t, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    TypeRef::Ref { lifetime: l,
+                       mutable: m.is_some(),
+                       referent: Box::new(t) }
+}
+
+#[allow(unused_variables)]
+fn ___action69<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a, _): (usize, Vec<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    TypeRef::Nominal { path: p, types: a }
+}
+
+#[allow(unused_variables)]
+fn ___action70<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+) -> TypeRef
+{
+    match p.as_id() {
+            Some(id) => TypeRef::Id(id),
+            None => TypeRef::Nominal { path: p, types: vec![] }
+        }
+}
+
+#[allow(unused_variables)]
+fn ___action71<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action72<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> TypeRef
+{
+    TypeRef::Lifetime(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action73<
+    'input,
+>(
+    text: &'input str,
+    (_, a, _): (usize, ::std::option::Option<Tok<'input>>, usize),
+    (_, h, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, t, _): (usize, Atom, usize),
+) -> Path
+{
+    {
+        Path { absolute: a.is_some(),
+               ids: h.into_iter().chain(once(t)).collect() }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action74<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, et, _): (usize, EnumToken, usize),
+    (_, a1, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0.into_iter().chain(a1).collect(),
+            enum_token: Some(et),
+        })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action75<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    {
+        GrammarItem::ExternToken(ExternToken {
+            span: Span(lo, hi),
+            associated_types: a0,
+            enum_token: None,
+        })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action76<
+    'input,
+>(
+    text: &'input str,
+    (_, t, _): (usize, MatchToken, usize),
+) -> GrammarItem
+{
+    GrammarItem::MatchToken(t)
+}
+
+#[allow(unused_variables)]
+fn ___action77<
+    'input,
+>(
+    text: &'input str,
+    (_, t, _): (usize, MatchToken, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, MatchContents, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    t.add(c)
+}
+
+#[allow(unused_variables)]
+fn ___action78<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, MatchContents, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    MatchToken::new(c, Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action79<
+    'input,
+>(
+    text: &'input str,
+    (_, items, _): (usize, Vec<MatchItem>, usize),
+) -> MatchContents
+{
+    MatchContents { items: items }
+}
+
+#[allow(unused_variables)]
+fn ___action80<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> MatchItem
+{
+    MatchItem::CatchAll(Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action81<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, s, _): (usize, TerminalLiteral, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> MatchItem
+{
+    MatchItem::Unmapped(s, Span(lo, hi))
+}
+
+#[allow(unused_variables)]
+fn ___action82<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, from, _): (usize, TerminalLiteral, usize),
+    (_, start, _): (usize, usize, usize),
+    (_, p, _): (usize, &'input str, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    {
+        let to = try!(super::parse_match_mapping(p, start + 2));
+        Ok(MatchItem::Mapped(from, to, Span(lo, hi)))
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action83<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalLiteral, usize),
+) -> TerminalLiteral
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action84<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action85<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, t, _): (usize, TypeRef, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, c, _): (usize, Vec<Conversion>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    {
+        EnumToken {
+            type_name: t,
+            type_span: Span(lo, hi),
+            conversions: c,
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action86<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, lo, _): (usize, usize, usize),
+    (_, n, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, t, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    {
+        AssociatedType { type_span: Span(lo, hi),
+                         type_name: n,
+                         type_ref: t }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action87<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, from, _): (usize, TerminalString, usize),
+    (_, start, _): (usize, usize, usize),
+    (_, p, _): (usize, &'input str, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    {
+        let pattern = try!(super::parse_pattern(p, start + 2));
+        Ok(Conversion { span: Span(lo, hi),
+                        from: from,
+                        to: pattern })
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action88<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, k, _): (usize, PatternKind<TypeRef>, usize),
+    (_, hi, _): (usize, usize, usize),
+) -> Pattern<TypeRef>
+{
+    Pattern { span: Span(lo, hi), kind: k }
+}
+
+#[allow(unused_variables)]
+fn ___action89<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___1, _): (usize, Vec<Pattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Enum(___0, ___1)
+}
+
+#[allow(unused_variables)]
+fn ___action90<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, a1, _): (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Struct(p, a0.into_iter().chain(a1).collect(), false)
+}
+
+#[allow(unused_variables)]
+fn ___action91<
+    'input,
+>(
+    text: &'input str,
+    (_, p, _): (usize, Path, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, a0, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Struct(p, a0, true)
+}
+
+#[allow(unused_variables)]
+fn ___action92<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Underscore
+}
+
+#[allow(unused_variables)]
+fn ___action93<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::DotDot
+}
+
+#[allow(unused_variables)]
+fn ___action94<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Choose(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action95<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<Pattern<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Tuple(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action96<
+    'input,
+>(
+    text: &'input str,
+    (_, c, _): (usize, &'input str, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::CharLiteral(Atom::from(c))
+}
+
+#[allow(unused_variables)]
+fn ___action97<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Path, usize),
+) -> PatternKind<TypeRef>
+{
+    PatternKind::Path(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action98<
+    'input,
+>(
+    text: &'input str,
+    (_, lo, _): (usize, usize, usize),
+    (_, id, _): (usize, Atom, usize),
+    (_, hi, _): (usize, usize, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, pat, _): (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    {
+        FieldPattern { field_span: Span(lo, hi),
+                       field_name: id,
+                       pattern: pat }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action99<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> NonterminalString
+{
+    NonterminalString(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action100<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> NonterminalString
+{
+    NonterminalString(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action101<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action102<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action103<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action104<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(i)
+}
+
+#[allow(unused_variables)]
+fn ___action105<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalString, usize),
+) -> TerminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action106<
+    'input,
+>(
+    text: &'input str,
+    (_, i, _): (usize, &'input str, usize),
+) -> TerminalString
+{
+    TerminalString::Bare(Atom::from(i))
+}
+
+#[allow(unused_variables)]
+fn ___action107<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TerminalLiteral, usize),
+) -> TerminalString
+{
+    TerminalString::Literal(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action108<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, Atom, usize),
+) -> TerminalLiteral
+{
+    TerminalLiteral::Quoted(s)
+}
+
+#[allow(unused_variables)]
+fn ___action109<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, Atom, usize),
+) -> TerminalLiteral
+{
+    TerminalLiteral::Regex(s)
+}
+
+#[allow(unused_variables)]
+fn ___action110<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(s)
+}
+
+#[allow(unused_variables)]
+fn ___action111<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> Atom
+{
+    Atom::from(s)
+}
+
+#[allow(unused_variables)]
+fn ___action112<
+    'input,
+>(
+    text: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> String
+{
+    s.to_string()
+}
+
+#[allow(unused_variables)]
+fn ___action113<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::option::Option<FieldPattern<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action114<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<FieldPattern<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action115<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action116<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action117<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> FieldPattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action118<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action119<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Conversion>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action120<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+    (_, e1, _): (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action121<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<AssociatedType>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action122<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action123<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action124<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action125<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action126<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Tok<'input>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action127<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Tok<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action128<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action129<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Tok<'input>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action130<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Tok<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action131<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::option::Option<Atom>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action132<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Atom>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action133<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action134<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action135<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action136<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, ActionKind, usize),
+) -> ::std::option::Option<ActionKind>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action137<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<ActionKind>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action138<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Condition, usize),
+) -> ::std::option::Option<Condition>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action139<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Condition>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action140<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Condition, usize),
+) -> Condition
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action141<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action142<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action143<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Alternative>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action144<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+    (_, e1, _): (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action145<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action146<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action147<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action148<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ()
+{
+    ()
+}
+
+#[allow(unused_variables)]
+fn ___action149<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Parameter>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action150<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action151<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action152<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action153<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action154<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action155<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action156<
+    'input,
+>(
+    text: &'input str,
+    (_, _, _): (usize, Tok<'input>, usize),
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action157<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action158<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    (_, e, _): (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    match e {
+        None => v,
+        Some(e) => {
+            let mut v = v;
+            v.push(e);
+            v
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action159<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e1, _): (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action160<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<Atom>, usize),
+) -> ::std::option::Option<Vec<Atom>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action161<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<Atom>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action162<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    match e {
+        None => v,
+        Some(e) => {
+            let mut v = v;
+            v.push(e);
+            v
+        }
+    }
+}
+
+#[allow(unused_variables)]
+fn ___action163<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    (_, e1, _): (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action164<
+    'input,
+>(
+    text: &'input str,
+    (_, v0, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+    (_, e1, _): (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    v0.into_iter().chain(e1).collect()
+}
+
+#[allow(unused_variables)]
+fn ___action165<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action166<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action167<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<WhereClause<TypeRef>>, usize),
+) -> ::std::option::Option<Vec<WhereClause<TypeRef>>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action168<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<WhereClause<TypeRef>>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action169<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<Parameter>, usize),
+) -> ::std::option::Option<Vec<Parameter>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action170<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<Parameter>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action171<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Vec<TypeParameter>, usize),
+) -> ::std::option::Option<Vec<TypeParameter>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action172<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Vec<TypeParameter>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action173<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> usize
+{
+    ___lookbehind.clone()
+}
+
+#[allow(unused_variables)]
+fn ___action174<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> usize
+{
+    ___lookahead.clone()
+}
+
+#[allow(unused_variables)]
+fn ___action175<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Annotation>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action176<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Annotation>, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action177<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action178<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action179<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<String>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action180<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<String>, usize),
+) -> ::std::vec::Vec<String>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action181<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, String, usize),
+) -> ::std::vec::Vec<String>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action182<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<String>, usize),
+    (_, e, _): (usize, String, usize),
+) -> ::std::vec::Vec<String>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action183<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action184<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, e, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action185<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Annotation, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action186<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Annotation>, usize),
+    (_, e, _): (usize, Annotation, usize),
+) -> ::std::vec::Vec<Annotation>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action187<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action188<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<GrammarItem>, usize),
+    (_, e, _): (usize, GrammarItem, usize),
+) -> ::std::vec::Vec<GrammarItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action189<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+) -> ::std::option::Option<TypeParameter>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action190<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeParameter>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action191<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeParameter>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action192<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action193<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeParameter
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action194<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::option::Option<WhereClause<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action195<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<WhereClause<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action196<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action197<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action198<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> WhereClause<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action199<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action200<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action201<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action202<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Atom>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action203<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action204<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Atom
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action205<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::option::Option<TypeBound<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action206<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeBound<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action207<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action208<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action209<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action210<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action211<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action212<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action213<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action214<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action215<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::option::Option<TypeBoundParameter<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action216<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeBoundParameter<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action217<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action218<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action219<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeBoundParameter<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action220<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+) -> ::std::option::Option<Parameter>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action221<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Parameter>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action222<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Parameter>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action223<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Parameter>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action224<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Parameter
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action225<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+) -> ::std::option::Option<NonterminalString>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action226<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<NonterminalString>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action227<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<NonterminalString>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action228<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action229<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> NonterminalString
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action230<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+) -> ::std::option::Option<Alternative>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action231<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Alternative>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action232<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Alternative>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action233<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Alternative>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action234<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Alternative
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action235<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::option::Option<Symbol>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action236<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Symbol>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action237<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action238<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action239<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action240<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action241<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<TypeRef>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action242<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action243<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action244<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> TypeRef
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action245<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action246<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action247<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, AssociatedType, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action248<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<AssociatedType>, usize),
+    (_, e, _): (usize, AssociatedType, usize),
+) -> ::std::vec::Vec<AssociatedType>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action249<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+) -> ::std::option::Option<MatchItem>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action250<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<MatchItem>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action251<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<MatchItem>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action252<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action253<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> MatchItem
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action254<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+) -> ::std::option::Option<Conversion>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action255<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Conversion>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action256<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Conversion>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action257<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Conversion>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action258<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Conversion
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action259<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::option::Option<Pattern<TypeRef>>
+{
+    Some(___0)
+}
+
+#[allow(unused_variables)]
+fn ___action260<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::option::Option<Pattern<TypeRef>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn ___action261<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    vec![]
+}
+
+#[allow(unused_variables)]
+fn ___action262<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+fn ___action263<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+    (_, _, _): (usize, Tok<'input>, usize),
+) -> Pattern<TypeRef>
+{
+    (___0)
+}
+
+#[allow(unused_variables)]
+fn ___action264<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action265<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    (_, e, _): (usize, FieldPattern<TypeRef>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action266<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action267<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    (_, e, _): (usize, Pattern<TypeRef>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action268<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Conversion, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action269<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Conversion>, usize),
+    (_, e, _): (usize, Conversion, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action270<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, MatchItem, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action271<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<MatchItem>, usize),
+    (_, e, _): (usize, MatchItem, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action272<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action273<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action274<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action275<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action276<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Alternative, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action277<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Alternative>, usize),
+    (_, e, _): (usize, Alternative, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action278<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, NonterminalString, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action279<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<NonterminalString>, usize),
+    (_, e, _): (usize, NonterminalString, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action280<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Parameter, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action281<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Parameter>, usize),
+    (_, e, _): (usize, Parameter, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action282<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action283<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    (_, e, _): (usize, TypeBoundParameter<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action284<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action285<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeRef>, usize),
+    (_, e, _): (usize, TypeRef, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action286<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action287<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    (_, e, _): (usize, TypeBound<TypeRef>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action288<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action289<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action290<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action291<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<Atom>, usize),
+    (_, e, _): (usize, Atom, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action292<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action293<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    (_, e, _): (usize, WhereClause<TypeRef>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action294<
+    'input,
+>(
+    text: &'input str,
+    (_, ___0, _): (usize, TypeParameter, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    vec![___0]
+}
+
+#[allow(unused_variables)]
+fn ___action295<
+    'input,
+>(
+    text: &'input str,
+    (_, v, _): (usize, ::std::vec::Vec<TypeParameter>, usize),
+    (_, e, _): (usize, TypeParameter, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+fn ___action296<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::vec::Vec<Atom>, usize),
+    ___2: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action126(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action73(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action297<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action127(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action73(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action298<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action129(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action68(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action299<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action130(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action68(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action300<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action156(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action154(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action301<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action300(
+        text,
+        ___5,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action15(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action302<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action155(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action15(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action303<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> ::std::option::Option<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action147(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action145(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action304<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action303(
+        text,
+        ___5,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action30(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action305<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action146(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action30(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action306<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::option::Option<Vec<TypeBoundParameter<TypeRef>>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action152(
+        text,
+        ___0,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action150(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action307<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action306(
+        text,
+        ___2,
+        ___3,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action16(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action308<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Vec<Atom>>, usize),
+    ___1: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action151(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action16(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action309<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+) -> ::std::option::Option<Condition>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action140(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action138(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action310<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Condition, usize),
+    ___4: (usize, ::std::option::Option<ActionKind>, usize),
+    ___5: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action309(
+        text,
+        ___2,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action37(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action311<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___2: (usize, ::std::option::Option<ActionKind>, usize),
+    ___3: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action139(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action37(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action312<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ActionKind, usize),
+    ___4: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action309(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action38(
+        text,
+        ___0,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action313<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, usize, usize),
+    ___1: (usize, ActionKind, usize),
+    ___2: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action139(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action38(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action314<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Visibility
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action148(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action29(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action315<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Alternative, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action234(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action276(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action316<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, Alternative, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Alternative>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action234(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action277(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action317<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action232(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action143(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action318<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, ::std::option::Option<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action233(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action143(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action319<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Conversion, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action258(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action268(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action320<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, Conversion, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Conversion>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action258(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action269(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action321<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action256(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action119(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action322<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, ::std::option::Option<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action257(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action119(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action323<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, FieldPattern<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action117(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action264(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action324<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___1: (usize, FieldPattern<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<FieldPattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action117(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action265(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action325<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action115(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action90(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action326<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, ::std::option::Option<FieldPattern<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action116(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action90(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action327<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action115(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action91(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action328<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action116(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action91(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action329<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Parameter, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action224(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action280(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action330<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, Parameter, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Parameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action224(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action281(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action331<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action222(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action149(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action332<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, ::std::option::Option<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action223(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action149(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action333<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, WhereClause<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action198(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action292(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action334<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, WhereClause<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action198(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action293(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action335<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action196(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action163(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action336<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action197(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action163(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action337<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action125(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action245(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action338<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action125(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action246(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action339<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action123(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action296(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action340<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, ::std::vec::Vec<Atom>, usize),
+    ___2: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action124(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action296(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action341<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action123(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action297(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action342<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Path
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action124(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action297(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action343<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action201(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action290(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action344<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action201(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action291(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action345<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action199(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action162(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action346<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action200(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action162(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action347<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action204(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action288(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action348<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action204(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action289(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action349<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action202(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action159(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action350<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, ::std::option::Option<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action203(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action159(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action351<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, MatchItem, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action253(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action270(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action352<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, MatchItem, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<MatchItem>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action253(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action271(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action353<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action251(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action120(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action354<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, ::std::option::Option<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action252(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action120(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action355<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action229(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action278(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action356<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, NonterminalString, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<NonterminalString>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action229(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action279(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action357<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action227(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action144(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action358<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, ::std::option::Option<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action228(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action144(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action359<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Pattern<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action263(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action266(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action360<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, Pattern<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action263(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action267(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action361<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action261(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action118(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action362<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action262(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action118(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action363<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action239(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action274(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action364<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<Symbol>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action239(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action275(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action365<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action237(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action133(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action366<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action238(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action133(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action367<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBound<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action209(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action286(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action368<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, TypeBound<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action209(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action287(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action369<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action207(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action158(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action370<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action208(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action158(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action371<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBoundParameter<TypeRef>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action219(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action282(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action372<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, TypeBoundParameter<TypeRef>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action219(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action283(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action373<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action217(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action153(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action374<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, ::std::option::Option<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action218(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action153(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action375<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeParameter, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action193(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action294(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action376<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, TypeParameter, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeParameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action193(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action295(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action377<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action191(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action164(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action378<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, ::std::option::Option<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action192(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action164(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action379<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action214(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action284(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action380<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action214(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action285(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action381<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action212(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action157(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action382<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action213(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action157(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action383<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action244(
+        text,
+        ___0,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action272(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action384<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> ::std::vec::Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action244(
+        text,
+        ___1,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action273(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action385<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action242(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action128(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action386<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, ::std::option::Option<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action243(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action128(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action387<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ::std::option::Option<ActionKind>, usize),
+    ___4: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action310(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action388<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<ActionKind>, usize),
+    ___2: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action311(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action389<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+    ___2: (usize, ActionKind, usize),
+    ___3: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action312(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action390<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ActionKind, usize),
+    ___1: (usize, usize, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action313(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action391<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action31(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action392<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action86(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action393<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, ConditionOp, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, usize, usize),
+) -> Condition
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action43(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action394<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalString, usize),
+    ___1: (usize, &'input str, usize),
+    ___2: (usize, usize, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action87(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action395<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, usize, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Conversion>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action85(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action396<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, EnumToken, usize),
+    ___5: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action74(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action397<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action75(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action398<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action98(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action399<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, usize, usize),
+    ___5: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___7: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___8: (usize, Tok<'input>, usize),
+    ___9: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action5(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+        ___9,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action400<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action80(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action401<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, usize, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action81(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action402<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, &'input str, usize),
+    ___2: (usize, usize, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action82(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action403<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, usize, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, MatchContents, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action78(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action404<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, TypeRef, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action304(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action405<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, usize, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action305(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action406<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, PatternKind<TypeRef>, usize),
+    ___1: (usize, usize, usize),
+) -> Pattern<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action88(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action407<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Symbol, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___start1 = ___0.2.clone();
+    let ___end1 = ___1.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action174(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action49(
+        text,
+        ___temp0,
+        ___0,
+        ___temp1,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action408<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action50(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action409<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, SymbolKind, usize),
+    ___1: (usize, usize, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action174(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action57(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action410<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ::std::option::Option<ActionKind>, usize),
+) -> Alternative
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action387(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action411<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ::std::option::Option<ActionKind>, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action388(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action412<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Condition, usize),
+    ___2: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action389(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action413<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action390(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action414<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Atom, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Annotation
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action391(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action415<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> AssociatedType
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action392(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action416<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+    ___1: (usize, ConditionOp, usize),
+    ___2: (usize, Atom, usize),
+) -> Condition
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action393(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action417<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalString, usize),
+    ___1: (usize, &'input str, usize),
+) -> Result<Conversion,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action394(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action418<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Conversion>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> EnumToken
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action395(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action419<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action396(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action420<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action397(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action421<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Pattern<TypeRef>, usize),
+) -> FieldPattern<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action398(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action422<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action399(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action423<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action400(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action424<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+) -> MatchItem
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action401(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action425<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TerminalLiteral, usize),
+    ___1: (usize, &'input str, usize),
+) -> Result<MatchItem,___lalrpop_util::ParseError<usize,Tok<'input>,tok::Error>>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action402(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action426<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, MatchContents, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> MatchToken
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action403(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action427<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action404(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action428<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action405(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action429<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, PatternKind<TypeRef>, usize),
+) -> Pattern<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action406(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action430<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Symbol, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action407(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action431<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Symbol, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Symbol
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action408(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action432<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+    ___1: (usize, RepeatOp, usize),
+) -> Symbol
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action53(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action433<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, SymbolKind, usize),
+) -> Symbol
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action173(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action409(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action434<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+    ___3: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action136(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action410(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action435<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Condition, usize),
+) -> Alternative
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action137(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action410(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action436<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, ActionKind, usize),
+) -> Alternative
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action136(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action411(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action437<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> Alternative
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action137(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action411(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action438<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Alternative, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action230(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action317(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action439<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Alternative>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action231(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action317(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action440<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+    ___1: (usize, Alternative, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action230(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action318(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action441<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Alternative>, usize),
+) -> Vec<Alternative>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action231(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action318(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action442<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action422(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action443<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action422(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action444<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Visibility, usize),
+    ___1: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action427(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action445<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, TypeRef, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action427(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action446<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Visibility, usize),
+    ___1: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action175(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action428(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action447<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Visibility, usize),
+    ___2: (usize, (NonterminalString, Vec<NonterminalString>), usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Alternative>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action176(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action428(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action448<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, EnumToken, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___start1 = ___2.2.clone();
+    let ___end1 = ___3.0.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action121(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___temp1,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action449<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, EnumToken, usize),
+    ___3: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___start1 = ___3.0.clone();
+    let ___end1 = ___3.2.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action122(
+        text,
+        ___3,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+        ___temp1,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action450<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___start1 = ___3.2.clone();
+    let ___end1 = ___4.0.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action121(
+        text,
+        &___start1,
+        &___end1,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___temp1,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action451<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, EnumToken, usize),
+    ___4: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___start1 = ___4.0.clone();
+    let ___end1 = ___4.2.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    let ___temp1 = ___action122(
+        text,
+        ___4,
+    );
+    let ___temp1 = (___start1, ___temp1, ___end1);
+    ___action419(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+        ___temp1,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action452<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action121(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action420(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action453<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<AssociatedType>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> GrammarItem
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action122(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action420(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action454<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Conversion, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action254(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action321(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action455<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Conversion>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action255(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action321(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action456<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+    ___1: (usize, Conversion, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action254(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action322(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action457<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Conversion>, usize),
+) -> Vec<Conversion>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action255(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action322(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action458<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, FieldPattern<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.0.clone();
+    let ___end0 = ___2.2.clone();
+    let ___temp0 = ___action113(
+        text,
+        ___2,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action325(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action459<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___1.2.clone();
+    let ___end0 = ___2.0.clone();
+    let ___temp0 = ___action114(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action325(
+        text,
+        ___0,
+        ___1,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action460<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, FieldPattern<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action113(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action326(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action461<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<FieldPattern<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> PatternKind<TypeRef>
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action114(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action326(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action462<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, TypeRef, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action11(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action463<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeBound<TypeRef>>, usize),
+) -> WhereClause<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action11(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action464<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action301(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action465<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, TypeRef, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action301(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action466<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeRef>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action302(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action467<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeRef>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action302(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action468<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action307(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action469<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action307(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action470<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Vec<Atom>, usize),
+    ___1: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action160(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action308(
+        text,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action471<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Path, usize),
+) -> TypeBound<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action161(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action308(
+        text,
+        ___temp0,
+        ___0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action472<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.2.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action165(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action442(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action473<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___7.0.clone();
+    let ___end0 = ___7.2.clone();
+    let ___temp0 = ___action166(
+        text,
+        ___7,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action442(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action474<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___7.2.clone();
+    let ___end0 = ___7.2.clone();
+    let ___temp0 = ___action165(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action443(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action475<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<Parameter>>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___8.0.clone();
+    let ___end0 = ___8.2.clone();
+    let ___temp0 = ___action166(
+        text,
+        ___8,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action443(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action476<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Parameter, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action220(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action331(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action477<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Parameter>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action221(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action331(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action478<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+    ___1: (usize, Parameter, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action220(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action332(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action479<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Parameter>, usize),
+) -> Vec<Parameter>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action221(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action332(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action480<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action472(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action481<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action472(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action482<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action473(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action483<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action473(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action484<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action474(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action485<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action474(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action486<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action169(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action475(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action487<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<TypeParameter>>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action170(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action475(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action488<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action480(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action489<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action480(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action490<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action481(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action491<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action481(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action492<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action482(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action493<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action482(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action494<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action483(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action495<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action483(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action496<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action484(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action497<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action484(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action498<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action485(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action499<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action485(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action500<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action486(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action501<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action486(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action502<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action171(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action487(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action503<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::option::Option<Vec<WhereClause<TypeRef>>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action172(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action487(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action504<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, WhereClause<TypeRef>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action194(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action335(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action505<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action195(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action335(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action506<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+    ___1: (usize, WhereClause<TypeRef>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action194(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action336(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action507<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<WhereClause<TypeRef>>, usize),
+) -> Vec<WhereClause<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action195(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action336(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action508<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action488(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action509<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action488(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action510<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action489(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action511<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action489(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action512<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action490(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action513<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action490(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action514<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action491(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action515<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action491(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action516<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action492(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action517<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action492(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action518<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action493(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action519<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action493(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action520<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action494(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action521<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action494(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action522<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.0.clone();
+    let ___end0 = ___3.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___3,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action495(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action523<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___2.2.clone();
+    let ___end0 = ___3.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action495(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___temp0,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action524<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action496(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action525<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.2.clone();
+    let ___end0 = ___6.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action496(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action526<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action497(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action527<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action497(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action528<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action498(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action529<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action498(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action530<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action499(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action531<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action499(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action532<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___6.0.clone();
+    let ___end0 = ___6.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___6,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action500(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action533<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.2.clone();
+    let ___end0 = ___6.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action500(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action534<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action501(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action535<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action501(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action536<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___5.0.clone();
+    let ___end0 = ___5.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___5,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action502(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action537<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.2.clone();
+    let ___end0 = ___5.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action502(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action538<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___4.0.clone();
+    let ___end0 = ___4.2.clone();
+    let ___temp0 = ___action167(
+        text,
+        ___4,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action503(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action539<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___3.2.clone();
+    let ___end0 = ___4.0.clone();
+    let ___temp0 = ___action168(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action503(
+        text,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___temp0,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action540<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action349(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action541<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Atom>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action349(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action542<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action350(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action543<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action350(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action544<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action345(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action545<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Atom>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action345(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action546<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+    ___1: (usize, Atom, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action346(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action547<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Atom>, usize),
+) -> Vec<Atom>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action346(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action548<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action298(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action549<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action298(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action550<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Atom, usize),
+    ___2: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action131(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action299(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action551<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> TypeRef
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action132(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action299(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action552<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, MatchItem, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action249(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action353(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action553<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action250(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action353(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action554<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+    ___1: (usize, MatchItem, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action249(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action354(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action555<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<MatchItem>, usize),
+) -> Vec<MatchItem>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action250(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action354(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action556<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, NonterminalString, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action225(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action357(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action557<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action226(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action357(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action558<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+    ___1: (usize, NonterminalString, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action225(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action358(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action559<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<NonterminalString>, usize),
+) -> Vec<NonterminalString>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action226(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action358(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action560<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Pattern<TypeRef>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action259(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action361(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action561<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action260(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action361(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action562<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+    ___1: (usize, Pattern<TypeRef>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action259(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action362(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action563<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Pattern<TypeRef>>, usize),
+) -> Vec<Pattern<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action260(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action362(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action564<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action508(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action565<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action508(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action566<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action509(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action567<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action509(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action568<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action510(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action569<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action510(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action570<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action511(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action571<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action511(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action572<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action512(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action573<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action512(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action574<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action513(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action575<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action513(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action576<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action514(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action577<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action514(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action578<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action515(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action579<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action515(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action580<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action516(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action581<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action516(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action582<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action517(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action583<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action517(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action584<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action518(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action585<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action518(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action586<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action519(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action587<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action519(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action588<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action520(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action589<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action520(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action590<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action521(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action591<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action521(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action592<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action522(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action593<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action522(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action594<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action523(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action595<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action523(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action596<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action524(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action597<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action524(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action598<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action525(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action599<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action525(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action600<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action526(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action601<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action526(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action602<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action527(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action603<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action527(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action604<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action528(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action605<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action528(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action606<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action529(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action607<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action529(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action608<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action530(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action609<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action530(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action610<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action531(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action611<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action531(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action612<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action532(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action613<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action532(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action614<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action533(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action615<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action533(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action616<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action534(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action617<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action534(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action618<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action535(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action619<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action535(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action620<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action536(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action621<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action536(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action622<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action537(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action623<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action537(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action624<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action538(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action625<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action538(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action626<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action179(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action539(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action627<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action180(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action539(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action628<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> ExprSymbol
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action134(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action48(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action629<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> ExprSymbol
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action135(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action48(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action630<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Symbol, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action235(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action365(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action631<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<Symbol>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action236(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action365(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action632<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+    ___1: (usize, Symbol, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action235(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action366(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action633<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Symbol>, usize),
+) -> Vec<Symbol>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action236(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action366(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action634<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBound<TypeRef>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action205(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action369(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action635<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action206(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action369(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action636<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+    ___1: (usize, TypeBound<TypeRef>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action205(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action370(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action637<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBound<TypeRef>>, usize),
+) -> Vec<TypeBound<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action206(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action370(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action638<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeBoundParameter<TypeRef>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action215(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action373(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action639<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action216(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action373(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action640<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+    ___1: (usize, TypeBoundParameter<TypeRef>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action215(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action374(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action641<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeBoundParameter<TypeRef>>, usize),
+) -> Vec<TypeBoundParameter<TypeRef>>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action216(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action374(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action642<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeParameter, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action189(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action377(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action643<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action190(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action377(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action644<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+    ___1: (usize, TypeParameter, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action189(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action378(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action645<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeParameter>, usize),
+) -> Vec<TypeParameter>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action190(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action378(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action646<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action210(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action381(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action647<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action211(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action381(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action648<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action210(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action382(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action649<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action211(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action382(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action650<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action240(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action385(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action651<
+    'input,
+>(
+    text: &'input str,
+    ___lookbehind: &usize,
+    ___lookahead: &usize,
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___lookbehind.clone();
+    let ___end0 = ___lookahead.clone();
+    let ___temp0 = ___action241(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action385(
+        text,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action652<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+    ___1: (usize, TypeRef, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action240(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action386(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action653<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<TypeRef>, usize),
+) -> Vec<TypeRef>
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action241(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action386(
+        text,
+        ___0,
+        ___temp0,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action654<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action564(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action655<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action564(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action656<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action565(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action657<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action565(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action658<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action566(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action659<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action566(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action660<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action567(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action661<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action567(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action662<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action568(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action663<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action568(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action664<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action569(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action665<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action569(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action666<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action570(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action667<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action570(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action668<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action571(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action669<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action571(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action670<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action572(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action671<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action572(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action672<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action573(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action673<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action573(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action674<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action574(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action675<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action574(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action676<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action575(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action677<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action575(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action678<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action576(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action679<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action576(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action680<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action577(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action681<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action577(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action682<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action578(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action683<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action578(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action684<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action579(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action685<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action579(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action686<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action580(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action687<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action580(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action688<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action581(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action689<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action581(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action690<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action582(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action691<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action582(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action692<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action583(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action693<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action583(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action694<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action584(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action695<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action584(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action696<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action585(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action697<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action585(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action698<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<Parameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action586(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action699<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action586(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action700<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action587(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action701<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action587(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action702<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action588(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action703<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action588(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action704<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action589(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action705<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action589(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action706<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<TypeParameter>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action590(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action707<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action590(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action708<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action591(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action709<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action591(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action710<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action592(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action711<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action592(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action712<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action593(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action713<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action593(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action714<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, Tok<'input>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action594(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action715<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action594(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action716<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action595(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action717<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action595(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action718<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action596(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action719<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action596(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action720<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action597(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action721<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action597(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action722<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action598(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action723<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action598(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action724<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action599(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action725<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action599(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action726<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action600(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action727<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action600(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action728<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action601(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action729<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action601(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action730<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action602(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action731<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action602(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action732<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action603(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action733<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action603(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action734<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action604(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action735<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action604(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action736<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action605(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action737<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action605(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action738<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action606(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action739<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action606(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action740<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action607(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action741<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action607(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action742<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action608(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action743<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action608(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action744<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action609(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action745<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action609(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action746<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action610(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action747<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action610(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action748<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action611(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action749<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action611(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action750<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action612(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action751<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action612(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action752<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action613(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action753<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___7: (usize, Tok<'input>, usize),
+    ___8: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action613(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+        ___8,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action754<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action614(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action755<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action614(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action756<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action615(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action757<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<Parameter>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action615(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action758<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action616(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action759<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action616(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action760<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action617(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action761<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action617(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action762<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<Parameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action618(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action763<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action618(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action764<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<Parameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action619(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action765<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<Parameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action619(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action766<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action620(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action767<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action620(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action768<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action621(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action769<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___6: (usize, Tok<'input>, usize),
+    ___7: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action621(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+        ___7,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action770<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<TypeParameter>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action622(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action771<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action622(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action772<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<TypeParameter>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action623(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action773<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<TypeParameter>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action623(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action774<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action624(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action775<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action624(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action776<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action625(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action777<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Vec<WhereClause<TypeRef>>, usize),
+    ___5: (usize, Tok<'input>, usize),
+    ___6: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action625(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+        ___6,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action778<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___1: (usize, Tok<'input>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action626(
+        text,
+        ___temp0,
+        ___0,
+        ___1,
+        ___2,
+        ___3,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action779<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.0.clone();
+    let ___end0 = ___0.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action626(
+        text,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action780<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___2: (usize, Tok<'input>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___0.2.clone();
+    let ___end0 = ___1.0.clone();
+    let ___temp0 = ___action177(
+        text,
+        &___start0,
+        &___end0,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action627(
+        text,
+        ___0,
+        ___temp0,
+        ___1,
+        ___2,
+        ___3,
+        ___4,
+    )
+}
+
+#[allow(unused_variables)]
+fn ___action781<
+    'input,
+>(
+    text: &'input str,
+    ___0: (usize, ::std::vec::Vec<String>, usize),
+    ___1: (usize, ::std::vec::Vec<GrammarItem>, usize),
+    ___2: (usize, ::std::vec::Vec<Annotation>, usize),
+    ___3: (usize, Tok<'input>, usize),
+    ___4: (usize, Tok<'input>, usize),
+    ___5: (usize, ::std::vec::Vec<GrammarItem>, usize),
+) -> Grammar
+{
+    let ___start0 = ___1.0.clone();
+    let ___end0 = ___1.2.clone();
+    let ___temp0 = ___action178(
+        text,
+        ___1,
+    );
+    let ___temp0 = (___start0, ___temp0, ___end0);
+    ___action627(
+        text,
+        ___0,
+        ___temp0,
+        ___2,
+        ___3,
+        ___4,
+        ___5,
+    )
+}
+
+pub trait ___ToTriple<'input, > {
+    type Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),Self::Error>;
+}
+
+impl<'input, > ___ToTriple<'input, > for (usize, Tok<'input>, usize) {
+    type Error = tok::Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),tok::Error> {
+        Ok(value)
+    }
+}
+impl<'input, > ___ToTriple<'input, > for Result<(usize, Tok<'input>, usize),tok::Error> {
+    type Error = tok::Error;
+    fn to_triple(value: Self) -> Result<(usize,Tok<'input>,usize),tok::Error> {
+        value
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/parser/mod.rs
@@ -0,0 +1,54 @@
+use grammar::parse_tree::*;
+use grammar::pattern::*;
+use lalrpop_util;
+use tok;
+
+#[allow(dead_code)]
+mod lrgrammar;
+
+#[cfg(test)]
+mod test;
+
+pub type ParseError<'input> = lalrpop_util::ParseError<usize, tok::Tok<'input>, tok::Error>;
+
+pub fn parse_grammar<'input>(input: &'input str) -> Result<Grammar, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    let mut grammar = try!(lrgrammar::GrammarParser::new().parse(input, tokenizer));
+
+    // find a unique prefix that does not appear anywhere in the input
+    while input.contains(&grammar.prefix) {
+        grammar.prefix.push('_');
+    }
+
+    Ok(grammar)
+}
+
+fn parse_pattern<'input>(
+    input: &'input str,
+    offset: usize,
+) -> Result<Pattern<TypeRef>, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, offset);
+    lrgrammar::PatternParser::new().parse(input, tokenizer)
+}
+
+fn parse_match_mapping<'input>(
+    input: &'input str,
+    offset: usize,
+) -> Result<MatchMapping, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, offset);
+    lrgrammar::MatchMappingParser::new().parse(input, tokenizer)
+}
+
+#[cfg(test)]
+pub fn parse_type_ref<'input>(input: &'input str) -> Result<TypeRef, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    lrgrammar::TypeRefParser::new().parse(input, tokenizer)
+}
+
+#[cfg(test)]
+pub fn parse_where_clauses<'input>(
+    input: &'input str,
+) -> Result<Vec<WhereClause<TypeRef>>, ParseError<'input>> {
+    let tokenizer = tok::Tokenizer::new(input, 0);
+    lrgrammar::GrammarWhereClausesParser::new().parse(input, tokenizer)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/parser/test.rs
@@ -0,0 +1,151 @@
+use parser;
+use grammar::parse_tree::{GrammarItem, MatchItem};
+
+#[test]
+fn match_block() {
+    let blocks = vec![
+        r#"grammar; match { _ }"#, // Minimal
+        r#"grammar; match { _ } else { _ }"#, // Doesn't really make sense, but should be allowed
+        r#"grammar; match { "abc" }"#, // Single token
+        r#"grammar; match { "abc" => "QUOTED" }"#, // Single token with quoted alias
+        r#"grammar; match { "abc" => UNQUOTED }"#, // Single token with unquoted alias
+        r#"grammar; match { r"(?i)begin" => BEGIN }"#, // Regex
+        r#"grammar; match { "abc", "def" => "DEF", _ } else { "foo" => BAR, r"(?i)begin" => BEGIN, _ }"#, // Complex
+        r#"grammar; match { "abc" } else { "def" } else { _ }"#, // Multi-chain
+    ];
+
+    for block in blocks {
+        let parsed = parser::parse_grammar(&block)
+            .expect(format!("Invalid grammar; grammar={}", block).as_str());
+        let first_item = parsed.items.first().expect("has item");
+        match *first_item {
+            GrammarItem::MatchToken(_) => (), // OK
+            _ => panic!("expected MatchToken, but was {:?}", first_item),
+        }
+    }
+}
+
+#[test]
+fn match_complex() {
+    let parsed = parser::parse_grammar(
+        r#"
+        grammar;
+        match {
+            r"(?i)begin" => "BEGIN",
+            r"(?i)end" => "END",
+        } else {
+            r"[a-zA-Z_][a-zA-Z0-9_]*" => IDENTIFIER,
+        } else {
+            "other",
+            _
+        }
+"#,
+    ).unwrap();
+
+    // We could probably make some nice system for testing this
+    let first_item = parsed.items.first().expect("has item");
+    match *first_item {
+        GrammarItem::MatchToken(ref data) => {
+            // match { ... }
+            let contents0 = data.contents.get(0).unwrap();
+            // r"(?i)begin" => "BEGIN"
+            let item00 = contents0.items.get(0).unwrap();
+            match *item00 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"(?i)begin\"#");
+                    assert_eq!(format!("{}", mapping), "\"BEGIN\"");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item00),
+            };
+            // r"(?i)end" => "END",
+            let item01 = contents0.items.get(1).unwrap();
+            match *item01 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"(?i)end\"#");
+                    assert_eq!(format!("{}", mapping), "\"END\"");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item00),
+            };
+            // else { ... }
+            let contents1 = data.contents.get(1).unwrap();
+            // r"[a-zA-Z_][a-zA-Z0-9_]*" => IDENTIFIER,
+            let item10 = contents1.items.get(0).unwrap();
+            match *item10 {
+                MatchItem::Mapped(ref sym, ref mapping, _) => {
+                    assert_eq!(format!("{:?}", sym), "r#\"[a-zA-Z_][a-zA-Z0-9_]*\"#");
+                    assert_eq!(format!("{}", mapping), "IDENTIFIER");
+                }
+                _ => panic!("expected MatchItem::Mapped, but was: {:?}", item10),
+            };
+            // else { ... }
+            let contents2 = data.contents.get(2).unwrap();
+            // "other",
+            let item20 = contents2.items.get(0).unwrap();
+            match *item20 {
+                MatchItem::Unmapped(ref sym, _) => {
+                    assert_eq!(format!("{:?}", sym), "\"other\"");
+                }
+                _ => panic!("expected MatchItem::Unmapped, but was: {:?}", item20),
+            };
+            // _
+            let item21 = contents2.items.get(1).unwrap();
+            match *item21 {
+                MatchItem::CatchAll(_) => (),
+                _ => panic!("expected MatchItem::CatchAll, but was: {:?}", item20),
+            };
+        }
+        _ => panic!("expected MatchToken, but was: {:?}", first_item),
+    }
+}
+
+#[test]
+fn where_clauses() {
+    let clauses = vec![
+        "where T: Debug",
+        "where T: Debug + Display",
+        "where T: std::ops::Add<usize>",
+        "where T: IntoIterator<Item = usize>",
+        "where T: 'a",
+        "where 'a: 'b",
+        "where for<'a> &'a T: Debug",
+        "where T: for<'a> Flobbles<'a>",
+        "where T: FnMut(usize)",
+        "where T: FnMut(usize, bool)",
+        "where T: FnMut() -> bool",
+        "where T: for<'a> FnMut(&'a usize)",
+        "where T: Debug, U: Display",
+    ];
+
+    for santa in clauses {
+        assert!(
+            parser::parse_where_clauses(santa).is_ok(),
+            "should parse where clauses: {}",
+            santa
+        );
+    }
+}
+
+#[test]
+fn grammars_with_where_clauses() {
+    let grammars = vec![
+        r###"
+grammar<T> where T: StaticMethods;
+"###,
+        r###"
+grammar<T>(methods: &mut T) where T: MutMethods;
+"###,
+        r###"
+grammar<'input, T>(methods: &mut T) where T: 'input + Debug + MutMethods;
+"###,
+        r###"
+grammar<F>(methods: &mut F) where F: for<'a> FnMut(&'a usize) -> bool;
+"###,
+        r###"
+grammar<F>(logger: &mut F) where F: for<'a> FnMut(&'a str);
+"###,
+    ];
+
+    for g in grammars {
+        assert!(parser::parse_grammar(g).is_ok());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/rust/mod.rs
@@ -0,0 +1,191 @@
+//! Simple Rust AST. This is what the various code generators create,
+//! which then gets serialized.
+
+use grammar::repr::Grammar;
+use grammar::parse_tree::Visibility;
+use tls::Tls;
+use std::fmt;
+use std::io::{self, Write};
+
+macro_rules! rust {
+    ($w:expr, $($args:tt)*) => {
+        try!(($w).writeln(&::std::fmt::format(format_args!($($args)*))))
+    }
+}
+
+/// A wrapper around a Write instance that handles indentation for
+/// Rust code. It expects Rust code to be written in a stylized way,
+/// with lots of braces and newlines (example shown here with no
+/// indentation). Over time maybe we can extend this to make things
+/// look prettier, but seems like...meh, just run it through some
+/// rustfmt tool.
+///
+/// ```ignore
+/// fn foo(
+/// arg1: Type1,
+/// arg2: Type2,
+/// arg3: Type3)
+/// -> ReturnType
+/// {
+/// match foo {
+/// Variant => {
+/// }
+/// }
+/// }
+/// ```
+pub struct RustWrite<W: Write> {
+    write: W,
+    indent: usize,
+}
+
+const TAB: usize = 4;
+
+impl<W: Write> RustWrite<W> {
+    pub fn new(w: W) -> RustWrite<W> {
+        RustWrite {
+            write: w,
+            indent: 0,
+        }
+    }
+
+    pub fn into_inner(self) -> W {
+        self.write
+    }
+
+    fn write_indentation(&mut self) -> io::Result<()> {
+        write!(self.write, "{0:1$}", "", self.indent)
+    }
+
+    fn write_indented(&mut self, out: &str) -> io::Result<()> {
+        writeln!(self.write, "{0:1$}{2}", "", self.indent, out)
+    }
+
+    pub fn write_table_row<I, C>(&mut self, iterable: I) -> io::Result<()>
+    where
+        I: IntoIterator<Item = (i32, C)>,
+        C: fmt::Display,
+    {
+        if Tls::session().emit_comments {
+            for (i, comment) in iterable {
+                try!(self.write_indentation());
+                try!(writeln!(self.write, "{}, {}", i, comment));
+            }
+        } else {
+            try!(self.write_indentation());
+            let mut first = true;
+            for (i, _comment) in iterable {
+                if !first {
+                    try!(write!(self.write, " "));
+                }
+                try!(write!(self.write, "{},", i));
+                first = false;
+            }
+        }
+        writeln!(self.write, "")
+    }
+
+    pub fn writeln(&mut self, out: &str) -> io::Result<()> {
+        let buf = out.as_bytes();
+
+        // pass empty lines through with no indentation
+        if buf.is_empty() {
+            return self.write.write_all("\n".as_bytes());
+        }
+
+        let n = buf.len() - 1;
+
+        // If the line begins with a `}`, `]`, or `)`, first decrement the indentation.
+        if buf[0] == ('}' as u8) || buf[0] == (']' as u8) || buf[0] == (')' as u8) {
+            self.indent -= TAB;
+        }
+
+        try!(self.write_indented(out));
+
+        // Detect a line that ends in a `{` or `(` and increase indentation for future lines.
+        if buf[n] == ('{' as u8) || buf[n] == ('[' as u8) || buf[n] == ('(' as u8) {
+            self.indent += TAB;
+        }
+
+        Ok(())
+    }
+
+    pub fn write_fn_header(
+        &mut self,
+        grammar: &Grammar,
+        visibility: &Visibility,
+        name: String,
+        type_parameters: Vec<String>,
+        first_parameter: Option<String>,
+        parameters: Vec<String>,
+        return_type: String,
+        where_clauses: Vec<String>,
+    ) -> io::Result<()> {
+        rust!(self, "{}fn {}<", visibility, name);
+
+        for type_parameter in &grammar.type_parameters {
+            rust!(self, "{0:1$}{2},", "", TAB, type_parameter);
+        }
+
+        for type_parameter in type_parameters {
+            rust!(self, "{0:1$}{2},", "", TAB, type_parameter);
+        }
+
+        rust!(self, ">(");
+
+        if let Some(param) = first_parameter {
+            rust!(self, "{},", param);
+        }
+        for parameter in &grammar.parameters {
+            rust!(self, "{}: {},", parameter.name, parameter.ty);
+        }
+
+        for parameter in &parameters {
+            rust!(self, "{},", parameter);
+        }
+
+        if !grammar.where_clauses.is_empty() || !where_clauses.is_empty() {
+            rust!(self, ") -> {} where", return_type);
+
+            for where_clause in &grammar.where_clauses {
+                rust!(self, "  {},", where_clause);
+            }
+
+            for where_clause in &where_clauses {
+                rust!(self, "  {},", where_clause);
+            }
+        } else {
+            rust!(self, ") -> {}", return_type);
+        }
+
+        Ok(())
+    }
+
+    pub fn write_module_attributes(&mut self, grammar: &Grammar) -> io::Result<()> {
+        for attribute in grammar.module_attributes.iter() {
+            rust!(self, "{}", attribute);
+        }
+        Ok(())
+    }
+
+    pub fn write_uses(&mut self, super_prefix: &str, grammar: &Grammar) -> io::Result<()> {
+        // things the user wrote
+        for u in &grammar.uses {
+            if u.starts_with("super::") {
+                rust!(self, "use {}{};", super_prefix, u);
+            } else {
+                rust!(self, "use {};", u);
+            }
+        }
+
+        self.write_standard_uses(&grammar.prefix)
+    }
+
+    pub fn write_standard_uses(&mut self, prefix: &str) -> io::Result<()> {
+        // Stuff that we plan to use.
+        // Occasionally we happen to not use it after all, hence the allow.
+        rust!(self, "#[allow(unused_extern_crates)]");
+        rust!(self, "extern crate lalrpop_util as {}lalrpop_util;", prefix);
+
+        Ok(())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/session.rs
@@ -0,0 +1,154 @@
+//! Internal configuration and session-specific settings. This is similar
+//! to `configuration::Configuration`, but it is not exported outside the
+//! crate. Note that all fields are public and so forth for convenience.
+
+use std::default::Default;
+use std::path;
+use style::{self, Style};
+use log::{Level, Log};
+
+// These two, ubiquitous types are defined here so that their fields can be private
+// across crate, but visible within the crate:
+
+#[derive(Copy, Clone)]
+pub enum ColorConfig {
+    /// Use ANSI colors.
+    Yes,
+
+    /// Do NOT use ANSI colors.
+    No,
+
+    /// Use them if we detect a TTY output (default).
+    IfTty,
+}
+
+/// Various options to control debug output. Although this struct is
+/// technically part of LALRPOP's exported interface, it is not
+/// considered part of the semver guarantees as end-users are not
+/// expected to use it.
+#[derive(Clone)]
+pub struct Session {
+    pub log: Log,
+
+    pub force_build: bool,
+
+    pub in_dir: Option<path::PathBuf>,
+
+    pub out_dir: Option<path::PathBuf>,
+
+    /// Emit comments in generated code explaining the states and so
+    /// forth.
+    pub emit_comments: bool,
+
+    /// Emit report file about generated code
+    pub emit_report: bool,
+
+    pub color_config: ColorConfig,
+
+    /// Stop after you find `max_errors` errors. If this value is 0,
+    /// report *all* errors. Note that we MAY always report more than
+    /// this value if we so choose.
+    pub max_errors: usize,
+
+    // Styles to use when formatting error reports
+    /// Applied to the heading in a message.
+    pub heading: Style,
+
+    /// Applied to symbols in an ambiguity report (where there is no cursor)
+    pub ambig_symbols: Style,
+
+    /// Applied to symbols before the cursor in a local ambiguity report
+    pub observed_symbols: Style,
+
+    /// Applied to symbols at the cursor in a local ambiguity report,
+    /// if it is a non-terminal
+    pub cursor_symbol: Style,
+
+    /// Applied to symbols after the cursor in a local ambiguity report
+    pub unobserved_symbols: Style,
+
+    /// Applied to terminal symbols, in addition to the above styles
+    pub terminal_symbol: Style,
+
+    /// Applied to nonterminal symbols, in addition to the above styles
+    pub nonterminal_symbol: Style,
+
+    /// Style to use when printing "Hint:"
+    pub hint_text: Style,
+
+    /// Unit testing (lalrpop-test) configuration
+    pub unit_test: bool,
+}
+
+impl Session {
+    pub fn new() -> Session {
+        Session {
+            log: Log::new(Level::Informative),
+            in_dir: None,
+            out_dir: None,
+            force_build: false,
+            emit_comments: false,
+            emit_report: false,
+            color_config: ColorConfig::default(),
+            max_errors: 1,
+            heading: style::FG_WHITE.with(style::BOLD),
+            ambig_symbols: style::FG_WHITE,
+            observed_symbols: style::FG_BRIGHT_GREEN,
+            cursor_symbol: style::FG_BRIGHT_WHITE,
+            unobserved_symbols: style::FG_BRIGHT_RED,
+            terminal_symbol: style::BOLD,
+            nonterminal_symbol: style::DEFAULT,
+            hint_text: style::FG_BRIGHT_MAGENTA.with(style::BOLD),
+            unit_test: false,
+        }
+    }
+
+    /// A session suitable for use in testing.
+    #[cfg(test)]
+    pub fn test() -> Session {
+        Session {
+            log: Log::new(Level::Debug),
+            in_dir: None,
+            out_dir: None,
+            force_build: false,
+            emit_comments: false,
+            emit_report: false,
+            color_config: ColorConfig::IfTty,
+            max_errors: 1,
+            heading: Style::new(),
+            ambig_symbols: Style::new(),
+            observed_symbols: Style::new(),
+            cursor_symbol: Style::new(),
+            unobserved_symbols: Style::new(),
+            terminal_symbol: Style::new(),
+            nonterminal_symbol: Style::new(),
+            hint_text: Style::new(),
+            unit_test: true,
+        }
+    }
+
+    /// Indicates whether we should stop after `actual_errors` number
+    /// of errors have been reported.
+    pub fn stop_after(&self, actual_errors: usize) -> bool {
+        self.max_errors != 0 && actual_errors >= self.max_errors
+    }
+
+    pub fn log<M>(&self, level: Level, message: M)
+    where
+        M: FnOnce() -> String,
+    {
+        self.log.log(level, message)
+    }
+}
+
+impl Default for Session {
+    fn default() -> Self {
+        Session::new()
+    }
+}
+
+impl Default for ColorConfig {
+    fn default() -> Self {
+        ColorConfig::IfTty
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/test_util.rs
@@ -0,0 +1,68 @@
+use diff;
+use grammar::parse_tree as pt;
+use grammar::repr as r;
+use normalize::NormError;
+use regex::Regex;
+use std::fmt::{Debug, Error, Formatter};
+
+thread_local! {
+    static SPAN: Regex =
+        Regex::new(r"Span\([0-9 ,]*\)").unwrap()
+}
+
+struct ExpectedDebug<'a>(&'a str);
+
+impl<'a> Debug for ExpectedDebug<'a> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        write!(fmt, "{}", self.0)
+    }
+}
+
+pub fn expect_debug<D: Debug>(actual: D, expected: &str) {
+    compare(
+        ExpectedDebug(&format!("{:#?}", actual)),
+        ExpectedDebug(expected),
+    )
+}
+
+pub fn compare<D: Debug, E: Debug>(actual: D, expected: E) {
+    let actual_s = format!("{:?}", actual);
+    let expected_s = format!("{:?}", expected);
+
+    SPAN.with(|span| {
+        let actual_s = span.replace_all(&actual_s, "Span(..)");
+        let expected_s = span.replace_all(&expected_s, "Span(..)");
+        if actual_s != expected_s {
+            let actual_s = format!("{:#?}", actual);
+            let expected_s = format!("{:#?}", expected);
+
+            for diff in diff::lines(&actual_s, &expected_s) {
+                match diff {
+                    diff::Result::Right(r) => println!("- {}", r),
+                    diff::Result::Left(l) => println!("+ {}", l),
+                    diff::Result::Both(l, _) => println!("  {}", l),
+                }
+            }
+
+            assert!(false);
+        }
+    });
+}
+
+pub fn normalized_grammar(s: &str) -> r::Grammar {
+    ::normalize::normalize_without_validating(::parser::parse_grammar(s).unwrap()).unwrap()
+}
+
+pub fn check_norm_err(expected_err: &str, span: &str, err: NormError) {
+    let expected_err = Regex::new(expected_err).unwrap();
+    let start_index = span.find("~").unwrap();
+    let end_index = span.rfind("~").unwrap() + 1;
+    assert!(start_index <= end_index);
+    assert_eq!(err.span, pt::Span(start_index, end_index));
+    assert!(
+        expected_err.is_match(&err.message),
+        "unexpected error text `{}`, which did not match regular expression `{}`",
+        err.message,
+        expected_err
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/tls/mod.rs
@@ -0,0 +1,77 @@
+//! Certain bits of environmental state are too annoying to thread
+//! around everywhere, so pack them into TLS.
+
+use file_text::FileText;
+use session::Session;
+use std::cell::RefCell;
+use std::rc::Rc;
+
+pub struct Tls {
+    _dummy: (),
+}
+
+#[derive(Clone)]
+struct TlsFields {
+    session: Rc<Session>,
+    file_text: Rc<FileText>,
+}
+
+thread_local! {
+    static THE_TLS_FIELDS: RefCell<Option<TlsFields>> =
+        RefCell::new(None)
+}
+
+impl Tls {
+    #[cfg(test)]
+    pub fn test() -> Tls {
+        Self::install(Rc::new(Session::test()), Rc::new(FileText::test()))
+    }
+
+    #[cfg(test)]
+    pub fn test_string(text: &str) -> Tls {
+        use std::path::PathBuf;
+        Self::install(
+            Rc::new(Session::test()),
+            Rc::new(FileText::new(PathBuf::from("tmp.txt"), String::from(text))),
+        )
+    }
+
+    /// Installs `Tls` and returns a placeholder value.  When this
+    /// value is dropped, the `Tls` entries will be removed. To access
+    /// the values from `Tls`, call `Tls::session()` or
+    /// `Tls::file_text()`.
+    pub fn install(session: Rc<Session>, file_text: Rc<FileText>) -> Tls {
+        let fields = TlsFields {
+            session: session,
+            file_text: file_text,
+        };
+
+        THE_TLS_FIELDS.with(|s| {
+            let mut s = s.borrow_mut();
+            assert!(s.is_none());
+            *s = Some(fields.clone());
+        });
+
+        Tls { _dummy: () }
+    }
+
+    fn fields() -> TlsFields {
+        THE_TLS_FIELDS.with(|s| s.borrow().clone().expect("TLS is not installed"))
+    }
+
+    pub fn session() -> Rc<Session> {
+        Self::fields().session
+    }
+
+    pub fn file_text() -> Rc<FileText> {
+        Self::fields().file_text
+    }
+}
+
+impl Drop for Tls {
+    fn drop(&mut self) {
+        THE_TLS_FIELDS.with(|s| {
+            *s.borrow_mut() = None;
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/tok/mod.rs
@@ -0,0 +1,738 @@
+//! A tokenizer for use in LALRPOP itself.
+
+use std::str::CharIndices;
+use unicode_xid::UnicodeXID;
+
+use self::ErrorCode::*;
+use self::Tok::*;
+
+#[cfg(test)]
+mod test;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Error {
+    pub location: usize,
+    pub code: ErrorCode,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ErrorCode {
+    UnrecognizedToken,
+    UnterminatedEscape,
+    UnterminatedStringLiteral,
+    UnterminatedCharacterLiteral,
+    UnterminatedAttribute,
+    UnterminatedCode,
+    ExpectedStringLiteral,
+}
+
+fn error<T>(c: ErrorCode, l: usize) -> Result<T, Error> {
+    Err(Error {
+        location: l,
+        code: c,
+    })
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Tok<'input> {
+    // Keywords;
+    Enum,
+    Extern,
+    Grammar,
+    Match,
+    Else,
+    If,
+    Mut,
+    Pub,
+    Type,
+    Where,
+    For,
+
+    // Special keywords: these are accompanied by a series of
+    // uninterpreted strings representing imports and stuff.
+    Use(&'input str),
+
+    // Identifiers of various kinds:
+    Escape(&'input str),
+    Id(&'input str),
+    MacroId(&'input str),       // identifier followed immediately by `<`
+    Lifetime(&'input str),      // includes the `'`
+    StringLiteral(&'input str), // excludes the `"`
+    CharLiteral(&'input str),   // excludes the `'`
+    RegexLiteral(&'input str),  // excludes the `r"` and `"`
+
+    // Symbols:
+    Ampersand,
+    BangEquals,
+    BangTilde,
+    Colon,
+    ColonColon,
+    Comma,
+    DotDot,
+    Equals,
+    EqualsEquals,
+    EqualsGreaterThanCode(&'input str),
+    EqualsGreaterThanQuestionCode(&'input str),
+    EqualsGreaterThanLookahead,
+    EqualsGreaterThanLookbehind,
+    Hash,
+    GreaterThan,
+    LeftBrace,
+    LeftBracket,
+    LeftParen,
+    LessThan,
+    Lookahead,  // @L
+    Lookbehind, // @R
+    MinusGreaterThan,
+    Plus,
+    Question,
+    RightBrace,
+    RightBracket,
+    RightParen,
+    Semi,
+    Star,
+    TildeTilde,
+    Underscore,
+    Bang,
+    ShebangAttribute(&'input str), // #![...]
+}
+
+pub struct Tokenizer<'input> {
+    text: &'input str,
+    chars: CharIndices<'input>,
+    lookahead: Option<(usize, char)>,
+    shift: usize,
+}
+
+pub type Spanned<T> = (usize, T, usize);
+
+const KEYWORDS: &'static [(&'static str, Tok<'static>)] = &[
+    ("enum", Enum),
+    ("extern", Extern),
+    ("grammar", Grammar),
+    ("match", Match),
+    ("else", Else),
+    ("if", If),
+    ("mut", Mut),
+    ("pub", Pub),
+    ("type", Type),
+    ("where", Where),
+    ("for", For),
+];
+
+/*
+ * Helper for backtracking.
+ */
+macro_rules! first {
+    ($this:expr, $action:expr, $fallback:expr) => {
+        {
+            let fallback_state = ($this.chars.clone(), $this.lookahead);
+            let result = $action;
+            match result {
+                Ok(_) => {
+                    Some(result)
+                }
+                _ => {
+                    $this.chars = fallback_state.0;
+                    $this.lookahead = fallback_state.1;
+                    Some($fallback)
+                }
+            }
+        }
+    }
+}
+
+macro_rules! try_opt {
+    ($e:expr, $err:expr) => {
+        {
+            let r = $e;
+            match r {
+                Some(Ok(val)) => val,
+                Some(Err(err)) => return Err(err),
+                None => return $err,
+            }
+        }
+    }
+}
+
+impl<'input> Tokenizer<'input> {
+    pub fn new(text: &'input str, shift: usize) -> Tokenizer<'input> {
+        let mut t = Tokenizer {
+            text: text,
+            chars: text.char_indices(),
+            lookahead: None,
+            shift: shift,
+        };
+        t.bump();
+        t
+    }
+
+    fn shebang_attribute(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        try_opt!(
+            self.expect_char('!'),
+            error(ErrorCode::UnrecognizedToken, idx0)
+        );
+        try_opt!(
+            self.expect_char('['),
+            error(ErrorCode::UnterminatedAttribute, idx0)
+        );
+        let mut sq_bracket_counter = 1;
+        while let Some((idx1, c)) = self.lookahead {
+            match c {
+                '[' => {
+                    self.bump();
+                    sq_bracket_counter += 1
+                },
+                ']' => {
+                    self.bump();
+                    sq_bracket_counter -= 1;
+                    match sq_bracket_counter {
+                        0 => {
+                            let idx2 = idx1 + 1;
+                            let data = &self.text[idx0..idx2];
+                            self.bump();
+                            return Ok((idx0, ShebangAttribute(data), idx2));
+                        },
+                        n if n < 0 => return error(UnrecognizedToken, idx0),
+                        _ => (),
+                    }
+                },
+                '"' => {
+                    self.bump();
+                    let _ = try!(self.string_literal(idx1));
+                },
+                '\n' => return error(UnrecognizedToken, idx0),
+                _ => {
+                    self.bump();
+                },
+            }
+        }
+        error(UnrecognizedToken, idx0)
+    }
+
+    fn next_unshifted(&mut self) -> Option<Result<Spanned<Tok<'input>>, Error>> {
+        loop {
+            return match self.lookahead {
+                Some((idx0, '&')) => {
+                    self.bump();
+                    Some(Ok((idx0, Ampersand, idx0 + 1)))
+                },
+                Some((idx0, '!')) => match self.bump() {
+                    Some((idx1, '=')) => {
+                        self.bump();
+                        Some(Ok((idx0, BangEquals, idx1 + 1)))
+                    },
+                    Some((idx1, '~')) => {
+                        self.bump();
+                        Some(Ok((idx0, BangTilde, idx1 + 1)))
+                    },
+                    _ => Some(Ok((idx0, Bang, idx0 + 1))),
+                },
+                Some((idx0, ':')) => match self.bump() {
+                    Some((idx1, ':')) => {
+                        self.bump();
+                        Some(Ok((idx0, ColonColon, idx1 + 1)))
+                    },
+                    _ => Some(Ok((idx0, Colon, idx0 + 1))),
+                },
+                Some((idx0, ',')) => {
+                    self.bump();
+                    Some(Ok((idx0, Comma, idx0 + 1)))
+                },
+                Some((idx0, '.')) => match self.bump() {
+                    Some((idx1, '.')) => {
+                        self.bump();
+                        Some(Ok((idx0, DotDot, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '=')) => match self.bump() {
+                    Some((idx1, '=')) => {
+                        self.bump();
+                        Some(Ok((idx0, EqualsEquals, idx1 + 1)))
+                    },
+                    Some((_, '>')) => {
+                        self.bump();
+                        Some(self.right_arrow(idx0))
+                    },
+                    _ => Some(Ok((idx0, Equals, idx0 + 1))),
+                },
+                Some((idx0, '#')) => {
+                    self.bump();
+                    first!(self, { self.shebang_attribute(idx0) }, {
+                        Ok((idx0, Hash, idx0 + 1))
+                    })
+                },
+                Some((idx0, '>')) => {
+                    self.bump();
+                    Some(Ok((idx0, GreaterThan, idx0 + 1)))
+                },
+                Some((idx0, '{')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftBrace, idx0 + 1)))
+                },
+                Some((idx0, '[')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftBracket, idx0 + 1)))
+                },
+                Some((idx0, '(')) => {
+                    self.bump();
+                    Some(Ok((idx0, LeftParen, idx0 + 1)))
+                },
+                Some((idx0, '<')) => {
+                    self.bump();
+                    Some(Ok((idx0, LessThan, idx0 + 1)))
+                },
+                Some((idx0, '@')) => match self.bump() {
+                    Some((idx1, 'L')) => {
+                        self.bump();
+                        Some(Ok((idx0, Lookahead, idx1 + 1)))
+                    },
+                    Some((idx1, 'R')) => {
+                        self.bump();
+                        Some(Ok((idx0, Lookbehind, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '+')) => {
+                    self.bump();
+                    Some(Ok((idx0, Plus, idx0 + 1)))
+                },
+                Some((idx0, '?')) => {
+                    self.bump();
+                    Some(Ok((idx0, Question, idx0 + 1)))
+                },
+                Some((idx0, '}')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightBrace, idx0 + 1)))
+                },
+                Some((idx0, ']')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightBracket, idx0 + 1)))
+                },
+                Some((idx0, ')')) => {
+                    self.bump();
+                    Some(Ok((idx0, RightParen, idx0 + 1)))
+                },
+                Some((idx0, ';')) => {
+                    self.bump();
+                    Some(Ok((idx0, Semi, idx0 + 1)))
+                },
+                Some((idx0, '*')) => {
+                    self.bump();
+                    Some(Ok((idx0, Star, idx0 + 1)))
+                },
+                Some((idx0, '~')) => match self.bump() {
+                    Some((idx1, '~')) => {
+                        self.bump();
+                        Some(Ok((idx0, TildeTilde, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '`')) => {
+                    self.bump();
+                    Some(self.escape(idx0))
+                },
+                Some((idx0, '\'')) => {
+                    self.bump();
+                    Some(self.lifetimeish(idx0))
+                },
+                Some((idx0, '"')) => {
+                    self.bump();
+                    Some(self.string_literal(idx0))
+                },
+                Some((idx0, '/')) => match self.bump() {
+                    Some((_, '/')) => {
+                        self.take_until(|c| c == '\n');
+                        continue;
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, '-')) => match self.bump() {
+                    Some((idx1, '>')) => {
+                        self.bump();
+                        Some(Ok((idx0, MinusGreaterThan, idx1 + 1)))
+                    },
+                    _ => Some(error(UnrecognizedToken, idx0)),
+                },
+                Some((idx0, c)) if is_identifier_start(c) => {
+                    if c == 'r' {
+                        // watch out for r"..." or r#"..."# strings
+                        self.bump();
+                        match self.lookahead {
+                            Some((_, '#')) | Some((_, '"')) => Some(self.regex_literal(idx0)),
+                            _ => {
+                                // due to the particulars of how identifierish works,
+                                // it's ok that we already consumed the 'r', because the
+                                // identifier will run from idx0 (the 'r') to the end
+                                Some(self.identifierish(idx0))
+                            },
+                        }
+                    } else {
+                        Some(self.identifierish(idx0))
+                    }
+                },
+                Some((_, c)) if c.is_whitespace() => {
+                    self.bump();
+                    continue;
+                },
+                Some((idx, _)) => Some(error(UnrecognizedToken, idx)),
+                None => None,
+            };
+        }
+    }
+
+    fn bump(&mut self) -> Option<(usize, char)> {
+        self.lookahead = self.chars.next();
+        self.lookahead
+    }
+
+    fn right_arrow(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        // we've seen =>, now we have to choose between:
+        //
+        // => code
+        // =>? code
+        // =>@L
+        // =>@R
+
+        match self.lookahead {
+            Some((_, '@')) => match self.bump() {
+                Some((idx2, 'L')) => {
+                    self.bump();
+                    Ok((idx0, EqualsGreaterThanLookahead, idx2 + 1))
+                },
+                Some((idx2, 'R')) => {
+                    self.bump();
+                    Ok((idx0, EqualsGreaterThanLookbehind, idx2 + 1))
+                },
+                _ => error(UnrecognizedToken, idx0),
+            },
+
+            Some((idx1, '?')) => {
+                self.bump();
+                let idx2 = try!(self.code(idx0, "([{", "}])"));
+                let code = &self.text[idx1 + 1..idx2];
+                Ok((idx0, EqualsGreaterThanQuestionCode(code), idx2))
+            },
+
+            Some((idx1, _)) => {
+                let idx2 = try!(self.code(idx0, "([{", "}])"));
+                let code = &self.text[idx1..idx2];
+                Ok((idx0, EqualsGreaterThanCode(code), idx2))
+            },
+
+            None => error(UnterminatedCode, idx0),
+        }
+    }
+
+    fn code(&mut self, idx0: usize, open_delims: &str, close_delims: &str) -> Result<usize, Error> {
+        // This is the interesting case. To find the end of the code,
+        // we have to scan ahead, matching (), [], and {}, and looking
+        // for a suitable terminator: `,`, `;`, `]`, `}`, or `)`.
+        // Additionaly we had to take into account that we can encounter an character literal
+        // equal to one of delimeters.
+        let mut balance = 0; // number of unclosed `(` etc
+        loop {
+            if let Some((idx, c)) = self.lookahead {
+                if c == '"' {
+                    self.bump();
+                    try!(self.string_literal(idx)); // discard the produced token
+                    continue;
+                } else if c == '\'' {
+                    self.bump();
+                    if self.take_lifetime_or_character_literal().is_none() {
+                        return error(UnterminatedCharacterLiteral, idx);
+                    }
+                    continue;
+                } else if c == 'r' {
+                    self.bump();
+                    if let Some((idx, '#')) = self.lookahead {
+                        try!(self.regex_literal(idx));
+                    }
+                    continue;
+                } else if c == '/' {
+                    self.bump();
+                    if let Some((_, '/')) = self.lookahead {
+                        self.take_until(|c| c == '\n');
+                    }
+                    continue;
+                } else if open_delims.find(c).is_some() {
+                    balance += 1;
+                } else if balance > 0 {
+                    if close_delims.find(c).is_some() {
+                        balance -= 1;
+                    }
+                } else {
+                    debug_assert!(balance == 0);
+
+                    if c == ',' || c == ';' || close_delims.find(c).is_some() {
+                        // Note: we do not consume the
+                        // terminator. The code is everything *up
+                        // to but not including* the terminating
+                        // `,`, `;`, etc.
+                        return Ok(idx);
+                    }
+                }
+            } else if balance > 0 {
+                // the input should not end with an
+                // unbalanced number of `{` etc!
+                return error(UnterminatedCode, idx0);
+            } else {
+                debug_assert!(balance == 0);
+                return Ok(self.text.len());
+            }
+
+            self.bump();
+        }
+    }
+
+    fn escape(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.take_until(|c| c == '`') {
+            Some(idx1) => {
+                self.bump(); // consume the '`'
+                let text: &'input str = &self.text[idx0 + 1..idx1]; // do not include the `` in the str
+                Ok((idx0, Escape(text), idx1 + 1))
+            },
+            None => error(UnterminatedEscape, idx0),
+        }
+    }
+
+    fn take_lifetime_or_character_literal(&mut self) -> Option<usize> {
+        // try to decide if `'` is for lifetime or it oppens a character literal
+
+        let forget_character = |p: (usize, char)| p.0;
+
+        self.lookahead.and_then(|(_, c)| {
+            if c == '\\' {
+                // escape after `'` => it had to be character literal token, consume
+                // the backslash and escaped character, then consume until `'`
+                self.bump();
+                self.bump();
+                self.take_until_and_consume_terminating_character(|c: char| c == '\'')
+            } else {
+                // no escape, then we require to see next `'` or we assume it was lifetime
+                self.bump().and_then(|(idx, c)| {
+                    if c == '\'' {
+                        self.bump().map(forget_character)
+                    } else {
+                        Some(idx)
+                    }
+                })
+            }
+        })
+    }
+
+    fn string_or_char_literal(
+        &mut self,
+        idx0: usize,
+        quote: char,
+        variant: fn(&'input str) -> Tok<'input>,
+    ) -> Option<Spanned<Tok<'input>>> {
+        let mut escape = false;
+        let terminate = |c: char| {
+            if escape {
+                escape = false;
+                false
+            } else if c == '\\' {
+                escape = true;
+                false
+            } else if c == quote {
+                true
+            } else {
+                false
+            }
+        };
+        match self.take_until(terminate) {
+            Some(idx1) => {
+                self.bump(); // consume the closing quote
+                let text = &self.text[idx0 + 1..idx1]; // do not include quotes in the str
+                Some((idx0, variant(text), idx1 + 1))
+            },
+            None => None,
+        }
+    }
+
+    fn string_literal(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.string_or_char_literal(idx0, '"', StringLiteral) {
+            Some(x) => Ok(x),
+            None => error(UnterminatedStringLiteral, idx0),
+        }
+    }
+
+    // parses `r#"..."#` (for some number of #), starts after the `r`
+    // has been consumed; idx0 points at the `r`
+    fn regex_literal(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.take_while(|c| c == '#') {
+            Some(idx1) if self.lookahead == Some((idx1, '"')) => {
+                self.bump();
+                let hashes = idx1 - idx0 - 1;
+                let mut state = 0;
+                let end_of_regex = |c: char| {
+                    if state > 0 {
+                        // state N>0 means: observed n-1 hashes
+                        if c == '#' {
+                            state += 1;
+                        } else {
+                            state = 0;
+                        }
+                    }
+
+                    // state 0 means: not yet seen the `"`
+                    if state == 0 && c == '"' {
+                        state = 1;
+                    }
+
+                    state == (hashes + 1)
+                };
+                match self.take_until(end_of_regex) {
+                    Some(idx1) => {
+                        // idx1 is the closing quote
+                        self.bump();
+                        let start = idx0 + 2 + hashes; // skip the `r###"`
+                        let end = idx1 - hashes; // skip the `###`.
+                        Ok((idx0, RegexLiteral(&self.text[start..end]), idx1 + 1))
+                    },
+                    None => error(UnterminatedStringLiteral, idx0),
+                }
+            },
+            Some(idx1) => error(ExpectedStringLiteral, idx1),
+            None => error(UnterminatedStringLiteral, idx0),
+        }
+    }
+
+    // Saw a `'`, could either be: `'a` or `'a'`.
+    fn lifetimeish(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        match self.lookahead {
+            None => error(UnterminatedCharacterLiteral, idx0),
+
+            Some((_, c)) => {
+                if is_identifier_start(c) {
+                    let (start, word, end) = self.word(idx0);
+                    match self.lookahead {
+                        Some((idx2, '\'')) => {
+                            self.bump();
+                            let text = &self.text[idx0 + 1..idx2];
+                            Ok((idx0, CharLiteral(text), idx2 + 1))
+                        },
+                        _ => Ok((start, Lifetime(word), end)),
+                    }
+                } else {
+                    match self.string_or_char_literal(idx0, '\'', CharLiteral) {
+                        Some(x) => Ok(x),
+                        None => error(UnterminatedCharacterLiteral, idx0),
+                    }
+                }
+            },
+        }
+    }
+
+    fn identifierish(&mut self, idx0: usize) -> Result<Spanned<Tok<'input>>, Error> {
+        let (start, word, end) = self.word(idx0);
+
+        if word == "_" {
+            return Ok((idx0, Underscore, idx0 + 1));
+        }
+
+        if word == "use" {
+            let code_end = try!(self.code(idx0, "([{", "}])"));
+            let code = &self.text[end..code_end];
+            return Ok((start, Tok::Use(code), code_end));
+        }
+
+        let tok =
+            // search for a keyword first; if none are found, this is
+            // either a MacroId or an Id, depending on whether there
+            // is a `<` immediately afterwards
+            KEYWORDS.iter()
+                    .filter(|&&(w, _)| w == word)
+                    .map(|&(_, ref t)| t.clone())
+                    .next()
+                    .unwrap_or_else(|| {
+                        match self.lookahead {
+                            Some((_, '<')) => MacroId(word),
+                            _ => Id(word),
+                        }
+                    });
+
+        Ok((start, tok, end))
+    }
+
+    fn word(&mut self, idx0: usize) -> Spanned<&'input str> {
+        match self.take_while(is_identifier_continue) {
+            Some(end) => (idx0, &self.text[idx0..end], end),
+            None => (idx0, &self.text[idx0..], self.text.len()),
+        }
+    }
+
+    fn take_while<F>(&mut self, mut keep_going: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        self.take_until(|c| !keep_going(c))
+    }
+
+    fn take_until<F>(&mut self, mut terminate: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        loop {
+            match self.lookahead {
+                None => {
+                    return None;
+                },
+                Some((idx1, c)) => {
+                    if terminate(c) {
+                        return Some(idx1);
+                    } else {
+                        self.bump();
+                    }
+                },
+            }
+        }
+    }
+
+    fn take_until_and_consume_terminating_character<F>(&mut self, terminate: F) -> Option<usize>
+    where
+        F: FnMut(char) -> bool,
+    {
+        self.take_until(terminate)
+            .and_then(|_| self.bump().map(|p| p.0))
+    }
+
+    fn expect_char(&mut self, c: char) -> Option<Result<usize, Error>> {
+        match self.lookahead {
+            Some((idx0, cc)) if c == cc => {
+                self.bump();
+                Some(Ok((idx0)))
+            },
+            Some((idx0, _)) => {
+                self.bump();
+                Some(error(UnrecognizedToken, idx0))
+            },
+            None => None,
+        }
+    }
+}
+
+impl<'input> Iterator for Tokenizer<'input> {
+    type Item = Result<Spanned<Tok<'input>>, Error>;
+
+    fn next(&mut self) -> Option<Result<Spanned<Tok<'input>>, Error>> {
+        match self.next_unshifted() {
+            None => None,
+            Some(Ok((l, t, r))) => Some(Ok((l + self.shift, t, r + self.shift))),
+            Some(Err(Error { location, code })) => Some(Err(Error {
+                location: location + self.shift,
+                code: code,
+            })),
+        }
+    }
+}
+
+fn is_identifier_start(c: char) -> bool {
+    UnicodeXID::is_xid_start(c) || c == '_'
+}
+
+fn is_identifier_continue(c: char) -> bool {
+    UnicodeXID::is_xid_continue(c) || c == '_'
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/tok/test.rs
@@ -0,0 +1,707 @@
+use super::{Error, ErrorCode, Tok, Tokenizer};
+use super::Tok::*;
+
+enum Expectation<'a> {
+    ExpectTok(Tok<'a>),
+    ExpectErr(ErrorCode),
+}
+
+use self::Expectation::*;
+
+fn gen_test(input: &str, expected: Vec<(&str, Expectation)>) {
+    // use $ to signal EOL because it can be replaced with a single space
+    // for spans, and because it applies also to r#XXX# style strings:
+    let input = input.replace("$", "\n");
+
+    let tokenizer = Tokenizer::new(&input, 0);
+    let len = expected.len();
+    for (token, (expected_span, expectation)) in tokenizer.zip(expected.into_iter()) {
+        let expected_start = expected_span.find("~").unwrap();
+        let expected_end = expected_span.rfind("~").unwrap() + 1;
+        println!("token: {:?}", token);
+        match expectation {
+            ExpectTok(expected_tok) => {
+                assert_eq!(Ok((expected_start, expected_tok, expected_end)), token);
+            },
+            ExpectErr(expected_ec) => assert_eq!(
+                Err(Error {
+                    location: expected_start,
+                    code: expected_ec,
+                }),
+                token
+            ),
+        }
+    }
+
+    let tokenizer = Tokenizer::new(&input, 0);
+    assert_eq!(None, tokenizer.skip(len).next());
+}
+
+fn test(input: &str, expected: Vec<(&str, Tok)>) {
+    let generic_expected = expected
+        .into_iter()
+        .map(|(span, tok)| (span, ExpectTok(tok)))
+        .collect();
+    gen_test(input, generic_expected);
+}
+
+fn test_err(input: &str, expected: (&str, ErrorCode)) {
+    let (span, ec) = expected;
+    gen_test(input, vec![(span, ExpectErr(ec))])
+}
+
+#[test]
+fn basic() {
+    test(
+        "extern foo",
+        vec![("~~~~~~    ", Extern), ("       ~~~", Id("foo"))],
+    );
+}
+
+#[test]
+fn eol_comment() {
+    test(
+        "extern // This is a comment$ foo",
+        vec![
+            ("~~~~~~                          ", Extern),
+            ("                             ~~~", Id("foo")),
+        ],
+    );
+}
+
+#[test]
+fn code1() {
+    test(
+        "=> a(b, c),",
+        vec![
+            ("~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            ("          ~", Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_id_then_equalsgreaterthancode_functioncall() {
+    test(
+        "id => a(b, c),",
+        vec![
+            ("~~            ", Id("id")),
+            ("   ~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            ("             ~", Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_functioncall() {
+    test(
+        r#" "\." => a(b, c),"#,
+        vec![
+            (r#" ~~~~            "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~~~~ "#, EqualsGreaterThanCode(" a(b, c)")),
+            (r#"                ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_many_characters_in_stringliteral() {
+    test(
+        r#" "\." => "Planet Earth" ,"#,
+        vec![
+            (r#" ~~~~                    "#, StringLiteral(r#"\."#)),
+            (
+                r#"      ~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" "Planet Earth" "#),
+            ),
+            (r#"                        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_one_character_dot_in_stringliteral() {
+    test(
+        r#" "\." => "." ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" "." "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_one_character_openningbracket_in_stringliteral(
+) {
+    test(
+        r#" "\(" => "(" ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" "(" "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_empty_stringliteral() {
+    test(
+        r#" "\(" => "" ,"#,
+        vec![
+            (r#" ~~~~        "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~ "#, EqualsGreaterThanCode(r#" "" "#)),
+            (r#"            ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_dot_then_equalsgreaterthancode_one_character_dot() {
+    test(
+        r#" "\." => '.' ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\."#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" '.' "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn rule_stringliteral_slash_openningbracket_then_equalsgreaterthancode_one_character_openningbracket(
+) {
+    test(
+        r#" "\(" => '(' ,"#,
+        vec![
+            (r#" ~~~~         "#, StringLiteral(r#"\("#)),
+            (r#"      ~~~~~~~ "#, EqualsGreaterThanCode(r#" '(' "#)),
+            (r#"             ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningbracket() {
+    test(
+        r#"=> '(' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '(' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_n() {
+    test(
+        r#"=> '\n' ,"#,
+        vec![
+            (r#"~~~~~~~~ "#, EqualsGreaterThanCode(r#" '\n' "#)),
+            (r#"        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_w() {
+    test(
+        r#"=> '\w' ,"#,
+        vec![
+            (r#"~~~~~~~~ "#, EqualsGreaterThanCode(r#" '\w' "#)),
+            (r#"        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_escaped_planet123() {
+    test(
+        r#"=> '\planet123' ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" '\planet123' "#),
+            ),
+            (r#"                ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningcurlybracket() {
+    test(
+        r#"=> '{' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '{' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningsquarebracket() {
+    test(
+        r#"=> '[' ,"#,
+        vec![
+            (r#"~~~~~~~ "#, EqualsGreaterThanCode(r#" '[' "#)),
+            (r#"       ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_openningbracket_wrapped_by_brackets() {
+    test(
+        r#"=> ('(') ,"#,
+        vec![
+            (r#"~~~~~~~~~ "#, EqualsGreaterThanCode(r#" ('(') "#)),
+            (r#"         ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_one_character_closingbracket_wrapped_by_brackets() {
+    test(
+        r#"=> (')') ,"#,
+        vec![
+            (r#"~~~~~~~~~ "#, EqualsGreaterThanCode(r#" (')') "#)),
+            (r#"         ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_tuple() {
+    test(
+        r#"=> (1,2,3) ,"#,
+        vec![
+            (r#"~~~~~~~~~~~ "#, EqualsGreaterThanCode(r#" (1,2,3) "#)),
+            (r#"           ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_statement_with_lifetime() {
+    test(
+        r#"=> HuffmanTable::<Code<'a>>::new() ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" HuffmanTable::<Code<'a>>::new() "#),
+            ),
+            (r#"                                   ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_statement_with_many_lifetimes() {
+    test(
+        r#"=> (HuffmanTable::<Code<'a, 'b>>::new()),"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" (HuffmanTable::<Code<'a, 'b>>::new())"#),
+            ),
+            (r#"                                        ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_nested_function_with_lifetimes() {
+    test(
+        r#"=> fn foo<'a>(x: &'a i32, y: &'a i32) -> &'a i32 {} ,"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" fn foo<'a>(x: &'a i32, y: &'a i32) -> &'a i32 {} "#),
+            ),
+            (
+                r#"                                                    ~"#,
+                Comma,
+            ),
+        ],
+    );
+}
+
+#[test]
+fn where_with_lifetimes() {
+    test(
+        r#"where <'a,bar<'b,'c>>,baz;"#,
+        vec![
+            (r#"~~~~~                     "#, Where),
+            (r#"      ~                   "#, LessThan),
+            (r#"       ~~                 "#, Lifetime("'a")),
+            (r#"         ~                "#, Comma),
+            (r#"          ~~~             "#, MacroId("bar")),
+            (r#"             ~            "#, LessThan),
+            (r#"              ~~          "#, Lifetime("'b")),
+            (r#"                ~         "#, Comma),
+            (r#"                 ~~       "#, Lifetime("'c")),
+            (r#"                   ~      "#, GreaterThan),
+            (r#"                    ~     "#, GreaterThan),
+            (r#"                     ~    "#, Comma),
+            (r#"                      ~~~ "#, Id("baz")),
+            (r#"                         ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn forall() {
+    test(
+        r#"for<'a, 'b, 'c> FnMut"#,
+        vec![
+            (r#"~~~                  "#, For),
+            (r#"   ~                 "#, LessThan),
+            (r#"    ~~               "#, Lifetime("'a")),
+            (r#"      ~              "#, Comma),
+            (r#"        ~~           "#, Lifetime("'b")),
+            (r#"          ~          "#, Comma),
+            (r#"            ~~       "#, Lifetime("'c")),
+            (r#"              ~      "#, GreaterThan),
+            (r#"                ~~~~~"#, Id("FnMut")),
+        ],
+    );
+}
+
+#[test]
+fn where_forall_fnmut_with_return_type() {
+    test(
+        r#"where F: for<'a> FnMut(&'a T) -> U;"#,
+        vec![
+            (r#"~~~~~                              "#, Where),
+            (r#"      ~                            "#, Id("F")),
+            (r#"       ~                           "#, Colon),
+            (r#"         ~~~                       "#, For),
+            (r#"            ~                      "#, LessThan),
+            (r#"             ~~                    "#, Lifetime("'a")),
+            (r#"               ~                   "#, GreaterThan),
+            (r#"                 ~~~~~             "#, Id("FnMut")),
+            (r#"                      ~            "#, LeftParen),
+            (r#"                       ~           "#, Ampersand),
+            (r#"                        ~~         "#, Lifetime("'a")),
+            (r#"                           ~       "#, Id("T")),
+            (r#"                            ~      "#, RightParen),
+            (r#"                              ~~   "#, MinusGreaterThan),
+            (r#"                                 ~ "#, Id("U")),
+            (r#"                                  ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn equalsgreaterthancode_error_unbalanced() {
+    test_err(r#"=> (,"#, (r#"~    "#, ErrorCode::UnterminatedCode))
+}
+
+#[test]
+fn equalsgreaterthancode_error_unbalanced_closingbracket_character() {
+    test_err(
+        r#"=> (,')',"#,
+        (r#"~        "#, ErrorCode::UnterminatedCode),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_unterminated_string_literal() {
+    test_err(
+        r#"=>  "Jan III Sobieski"#,
+        (
+            r#"    ~                "#,
+            ErrorCode::UnterminatedStringLiteral,
+        ),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_unterminated_character_literal() {
+    test_err(
+        r#"=>  '\x233  "#,
+        (r#"    ~       "#, ErrorCode::UnterminatedCharacterLiteral),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_error_end_of_input_instead_of_closing_normal_character_literal() {
+    test_err(
+        r#"=>  'x"#,
+        (r#"    ~ "#, ErrorCode::UnterminatedCharacterLiteral),
+    )
+}
+
+#[test]
+fn equalsgreaterthancode_single_quote_literal() {
+    test(
+        r#"=> { println!('\''); },"#,
+        vec![
+            (
+                r#"~~~~~~~~~~~~~~~~~~~~~~ "#,
+                EqualsGreaterThanCode(r#" { println!('\''); }"#),
+            ),
+            (r#"                      ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_paren() {
+    // Issue #25
+    test(
+        r#"=> a("(", c),"#,
+        vec![
+            (r#"~~~~~~~~~~~~ "#, EqualsGreaterThanCode(r#" a("(", c)"#)),
+            (r#"            ~"#, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_regex_paren() {
+    // Issue #25
+    test(
+        r###"=> a(r##"("#""##, c),"###,
+        vec![
+            (
+                r###"~~~~~~~~~~~~~~~~~~~~ "###,
+                EqualsGreaterThanCode(r###" a(r##"("#""##, c)"###),
+            ),
+            (r###"                    ~"###, Comma),
+        ],
+    );
+}
+
+#[test]
+fn code_comment_eol() {
+    test(
+        "=> a(// (
+),",
+        vec![
+            (
+                "~~~~~~~~~
+~,",
+                EqualsGreaterThanCode(" a(// (\n)"),
+            ),
+            (
+                "=> a(// (
+)~",
+                Comma,
+            ),
+        ],
+    );
+}
+
+#[test]
+fn code2() {
+    test(
+        "=>? a(b, c),",
+        vec![
+            ("~~~~~~~~~~~ ", EqualsGreaterThanQuestionCode(" a(b, c)")),
+            ("           ~", Comma),
+        ],
+    );
+}
+
+#[test]
+#[should_panic]
+fn code_forgot_comma() {
+    test(
+        "=> a(b, c),",
+        vec![
+            ("~~~~~~~~~~ ", EqualsGreaterThanCode(" a(b, c)")),
+            // intentionally forget the comma token; this is more of a test of `test`
+        ],
+    );
+}
+
+#[test]
+fn various_kinds_of_ids() {
+    test(
+        "foo<T<'a,U,`Z*{}`>>",
+        vec![
+            ("~~~                ", MacroId("foo")),
+            ("   ~               ", LessThan),
+            ("    ~              ", MacroId("T")),
+            ("     ~             ", LessThan),
+            ("      ~~           ", Lifetime("'a")),
+            ("        ~          ", Comma),
+            ("         ~         ", Id("U")),
+            ("          ~        ", Comma),
+            ("           ~~~~~~  ", Escape("Z*{}")),
+            ("                 ~ ", GreaterThan),
+            ("                  ~", GreaterThan),
+        ],
+    );
+}
+
+#[test]
+fn string_literals() {
+    test(
+        r#"foo "bar\"\n" baz"#,
+        vec![
+            (r#"~~~              "#, Id("foo")),
+            (r#"    ~~~~~~~~~    "#, StringLiteral(r#"bar\"\n"#)),
+            (r#"              ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn use1() {
+    test(
+        r#"use foo::bar; baz"#,
+        vec![
+            (r#"~~~~~~~~~~~~     "#, Use(" foo::bar")),
+            (r#"            ~    "#, Semi),
+            (r#"              ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn use2() {
+    test(
+        r#"use {foo,bar}; baz"#,
+        vec![
+            (r#"~~~~~~~~~~~~~     "#, Use(" {foo,bar}")),
+            (r#"             ~    "#, Semi),
+            (r#"               ~~~"#, Id("baz")),
+        ],
+    );
+}
+
+#[test]
+fn where1() {
+    test(
+        r#"where <foo,bar>,baz;"#,
+        vec![
+            (r#"~~~~~               "#, Where),
+            (r#"      ~             "#, LessThan),
+            (r#"       ~~~          "#, Id("foo")),
+            (r#"          ~         "#, Comma),
+            (r#"           ~~~      "#, Id("bar")),
+            (r#"              ~     "#, GreaterThan),
+            (r#"               ~    "#, Comma),
+            (r#"                ~~~ "#, Id("baz")),
+            (r#"                   ~"#, Semi),
+        ],
+    );
+}
+
+#[test]
+fn regex1() {
+    test(
+        r#####"raa r##" #"#"" "#"##rrr"#####,
+        vec![
+            (r#####"~~~                    "#####, Id("raa")),
+            (
+                r#####"    ~~~~~~~~~~~~~~~~   "#####,
+                RegexLiteral(r##" #"#"" "#"##),
+            ),
+            (r#####"                    ~~~"#####, Id("rrr")),
+        ],
+    );
+}
+
+#[test]
+fn hash_token() {
+    test(r#" # "#, vec![(r#" ~ "#, Hash)]);
+}
+
+#[test]
+fn shebang_attribute_normal_text() {
+    test(
+        r#" #![Attribute] "#,
+        vec![(r#" ~~~~~~~~~~~~~ "#, ShebangAttribute("#![Attribute]"))],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_without_quotes() {
+    test(
+        r#" #![set width = 80] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute("#![set width = 80]"),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_with_quotes() {
+    test(
+        r#" #![set width = "80"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "80"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_closing_sqbracket_in_string_literal() {
+    test(
+        r#" #![set width = "80]"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "80]"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_opening_sqbracket_in_string_literal() {
+    test(
+        r#" #![set width = "[80"] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = "[80"]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn shebang_attribute_special_characters_nested_sqbrackets() {
+    test(
+        r#" #![set width = [80]] "#,
+        vec![
+            (
+                r#" ~~~~~~~~~~~~~~~~~~~~ "#,
+                ShebangAttribute(r#"#![set width = [80]]"#),
+            ),
+        ],
+    );
+}
+
+#[test]
+fn regex2() {
+    test(r#"r"(123""#, vec![(r#"~~~~~~~"#, RegexLiteral(r"(123"))]);
+}
+
+#[test]
+fn char_literals() {
+    test(
+        r#"'foo' 'a 'b '!' '!!' '\'' 'c"#,
+        vec![
+            (r#"~~~~~                       "#, CharLiteral("foo")),
+            (r#"      ~~                    "#, Lifetime("'a")),
+            (r#"         ~~                 "#, Lifetime("'b")),
+            (r#"            ~~~             "#, CharLiteral("!")),
+            (r#"                ~~~~        "#, CharLiteral("!!")),
+            (r#"                     ~~~~   "#, CharLiteral("\\'")),
+            (r#"                          ~~"#, Lifetime("'c")),
+        ],
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lalrpop/src/util.rs
@@ -0,0 +1,52 @@
+use std::fmt::{Display, Error, Formatter};
+
+pub use std::collections::btree_map as map;
+pub struct Sep<S>(pub &'static str, pub S);
+
+impl<'a, S: Display> Display for Sep<&'a Vec<S>> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let &Sep(sep, vec) = self;
+        let mut elems = vec.iter();
+        if let Some(elem) = elems.next() {
+            try!(write!(fmt, "{}", elem));
+            while let Some(elem) = elems.next() {
+                try!(write!(fmt, "{}{}", sep, elem));
+            }
+        }
+        Ok(())
+    }
+}
+
+pub struct Escape<S>(pub S);
+
+impl<S: Display> Display for Escape<S> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let tmp = format!("{}", self.0);
+        for c in tmp.chars() {
+            match c {
+                'a'...'z' | '0'...'9' | 'A'...'Z' => try!(write!(fmt, "{}", c)),
+                '_' => try!(write!(fmt, "__")),
+                _ => try!(write!(fmt, "_{:x}", c as usize)),
+            }
+        }
+        Ok(())
+    }
+}
+
+pub struct Prefix<S>(pub &'static str, pub S);
+
+impl<'a, S: Display> Display for Prefix<&'a [S]> {
+    fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
+        let &Prefix(prefix, vec) = self;
+        let mut elems = vec.iter();
+        while let Some(elem) = elems.next() {
+            try!(write!(fmt, "{}{}", prefix, elem));
+        }
+        Ok(())
+    }
+}
+
+/// Strip leading and trailing whitespace.
+pub fn strip(s: &str) -> &str {
+    s.trim_matches(char::is_whitespace)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"41896cb1fdbaf0fa0c5eef319b2786b043731d7e8e3b115911f3aa02137f248c","Cargo.toml":"e068ceb403286a107bb06393708a74c2dceed341422641a1c130d6380a76c27b","LICENSE-APACHE":"8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"0e489f044f04ca322c451a12c6721496e9b0305036be443c52772622c7e5ef51","deploy-docs.sh":"ebe29a3275c186298584074a2f1cbef1a33846eb7a221dfb41a30c1342f00f38","src/heapsize.rs":"fe098aa1f79f11af271cb9c0db89d89f45d4e7429d2b6afb5cc18edfd8128a47","src/lib.rs":"d167aec9e73328a27e02ba7ceff81d50e37ecd0d5d8b81c1dc7cdf0a1b16981f","src/serde.rs":"74756da5be8aa5464d4d556964a5839cf0d91b10f5cd9dc724ef0d4f9329c1b4","tests/heapsize.rs":"2d211acb210b675119fd82baa5549c625b939bb9180149aa6c7644715419cdab","tests/serde.rs":"7b9903b5b825eb876c0cc3f979835f27103604a6173c01d6724cfbdb4238266e","tests/test.rs":"3db1290ab859932ed485257076052e1d3512ad78d2788278bb61cd0626ac9fdd"},"package":"70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/.travis.yml
@@ -0,0 +1,20 @@
+language: rust
+sudo: false
+matrix:
+    include:
+        - rust: beta
+          env: FEATURES="serde_impl heapsize_impl"
+        - rust: nightly
+          env: FEATURES="serde_impl nightly clippy heapsize_impl"
+        - rust: stable
+script:
+    - cargo build --features "$FEATURES"
+    - cargo test --features "$FEATURES"
+    - cargo doc --no-deps --features "$FEATURES"
+after_success: |
+    [ $TRAVIS_RUST_VERSION = nightly ] &&
+    [ $TRAVIS_BRANCH = master ] &&
+    [ $TRAVIS_PULL_REQUEST = false ] &&
+    bash deploy-docs.sh
+notifications:
+    webhooks: http://huon.me:54857/travis
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/Cargo.toml
@@ -0,0 +1,43 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "linked-hash-map"
+version = "0.5.1"
+authors = ["Stepan Koltsov <stepan.koltsov@gmail.com>", "Andrew Paseltiner <apaseltiner@gmail.com>"]
+description = "A HashMap wrapper that holds key-value pairs in insertion order"
+homepage = "https://github.com/contain-rs/linked-hash-map"
+documentation = "https://contain-rs.github.io/linked-hash-map/linked_hash_map"
+readme = "README.md"
+keywords = ["data-structures"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/contain-rs/linked-hash-map"
+[dependencies.clippy]
+version = "0.*"
+optional = true
+
+[dependencies.heapsize]
+version = "0.4"
+optional = true
+
+[dependencies.serde]
+version = "1.0"
+optional = true
+
+[dependencies.serde_test]
+version = "1.0"
+optional = true
+
+[features]
+heapsize_impl = ["heapsize"]
+nightly = []
+serde_impl = ["serde", "serde_test"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/README.md
@@ -0,0 +1,15 @@
+**WARNING: THIS PROJECT IS IN MAINTENANCE MODE, DUE TO INSUFFICIENT MAINTAINER RESOURCES**
+
+It works fine, but will generally no longer be improved.
+
+We are currently only accepting changes which:
+
+* keep this compiling with the latest versions of Rust or its dependencies.
+* have minimal review requirements, such as documentation changes (so not totally new APIs).
+
+------
+
+
+A HashMap wrapper that holds key-value pairs in insertion order.
+
+Documentation is available at https://contain-rs.github.io/linked-hash-map/linked_hash_map.
new file mode 100755
--- /dev/null
+++ b/third_party/rust/linked-hash-map/deploy-docs.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+rev=$(git rev-parse --short HEAD)
+
+cd target/doc
+
+git init
+git config user.email 'FlashCat@users.noreply.github.com'
+git config user.name 'FlashCat'
+git remote add upstream "https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git"
+
+touch .
+
+git add -A .
+git commit -qm "rebuild pages at ${rev}"
+git push -q upstream HEAD:gh-pages --force
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/src/heapsize.rs
@@ -0,0 +1,49 @@
+extern crate heapsize;
+
+use self::heapsize::{HeapSizeOf, heap_size_of};
+use std::hash::{Hash, BuildHasher};
+
+use {LinkedHashMap, KeyRef, Node};
+
+impl<K> HeapSizeOf for KeyRef<K> {
+    fn heap_size_of_children(&self) -> usize {
+        0
+    }
+}
+
+impl<K, V> HeapSizeOf for Node<K, V>
+    where K: HeapSizeOf,
+          V: HeapSizeOf
+{
+    fn heap_size_of_children(&self) -> usize {
+        self.key.heap_size_of_children() + self.value.heap_size_of_children()
+    }
+}
+
+impl<K, V, S> HeapSizeOf for LinkedHashMap<K, V, S>
+    where K: HeapSizeOf + Hash + Eq,
+          V: HeapSizeOf,
+          S: BuildHasher
+{
+    fn heap_size_of_children(&self) -> usize {
+        unsafe {
+            let mut size = self.map.heap_size_of_children();
+            for &value in self.map.values() {
+                size += (*value).heap_size_of_children();
+                size += heap_size_of(value as *const _ as *const _);
+            }
+
+            if !self.head.is_null() {
+                size += heap_size_of(self.head as *const _ as *const _);
+            }
+
+            let mut free = self.free;
+            while !free.is_null() {
+                size += heap_size_of(free as *const _ as *const _);
+                free = (*free).next
+            }
+
+            size
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/src/lib.rs
@@ -0,0 +1,1343 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A `HashMap` wrapper that holds key-value pairs in insertion order.
+//!
+//! # Examples
+//!
+//! ```
+//! use linked_hash_map::LinkedHashMap;
+//!
+//! let mut map = LinkedHashMap::new();
+//! map.insert(2, 20);
+//! map.insert(1, 10);
+//! map.insert(3, 30);
+//! assert_eq!(map[&1], 10);
+//! assert_eq!(map[&2], 20);
+//! assert_eq!(map[&3], 30);
+//!
+//! let items: Vec<(i32, i32)> = map.iter().map(|t| (*t.0, *t.1)).collect();
+//! assert_eq!(items, [(2, 20), (1, 10), (3, 30)]);
+//! ```
+
+#![forbid(missing_docs)]
+#![cfg_attr(all(feature = "nightly", test), feature(test))]
+
+#![cfg_attr(feature = "clippy", feature(plugin))]
+#![cfg_attr(feature = "clippy", plugin(clippy))]
+#![cfg_attr(feature = "clippy", deny(clippy))]
+
+// Optional Serde support
+#[cfg(feature = "serde_impl")]
+pub mod serde;
+// Optional Heapsize support
+#[cfg(feature = "heapsize_impl")]
+mod heapsize;
+
+use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections::hash_map::{self, HashMap};
+use std::fmt;
+use std::hash::{BuildHasher, Hash, Hasher};
+use std::iter;
+use std::marker;
+use std::mem;
+use std::ops::{Index, IndexMut};
+use std::ptr;
+
+struct KeyRef<K> { k: *const K }
+
+struct Node<K, V> {
+    next: *mut Node<K, V>,
+    prev: *mut Node<K, V>,
+    key: K,
+    value: V,
+}
+
+/// A linked hash map.
+pub struct LinkedHashMap<K, V, S = hash_map::RandomState> {
+    map: HashMap<KeyRef<K>, *mut Node<K, V>, S>,
+    head: *mut Node<K, V>,
+    free: *mut Node<K, V>,
+}
+
+impl<K: Hash> Hash for KeyRef<K> {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        unsafe { (*self.k).hash(state) }
+    }
+}
+
+impl<K: PartialEq> PartialEq for KeyRef<K> {
+    fn eq(&self, other: &Self) -> bool {
+        unsafe{ (*self.k).eq(&*other.k) }
+    }
+}
+
+impl<K: Eq> Eq for KeyRef<K> {}
+
+// This type exists only to support borrowing `KeyRef`s, which cannot be borrowed to `Q` directly
+// due to conflicting implementations of `Borrow`. The layout of `&Qey<Q>` must be identical to
+// `&Q` in order to support transmuting in the `Qey::from_ref` method.
+#[derive(Hash, PartialEq, Eq)]
+struct Qey<Q: ?Sized>(Q);
+
+impl<Q: ?Sized> Qey<Q> {
+    fn from_ref(q: &Q) -> &Self { unsafe { mem::transmute(q) } }
+}
+
+impl<K, Q: ?Sized> Borrow<Qey<Q>> for KeyRef<K> where K: Borrow<Q> {
+    fn borrow(&self) -> &Qey<Q> {
+        Qey::from_ref(unsafe { (*self.k).borrow() })
+    }
+}
+
+impl<K, V> Node<K, V> {
+    fn new(k: K, v: V) -> Self {
+        Node {
+            key: k,
+            value: v,
+            next: ptr::null_mut(),
+            prev: ptr::null_mut(),
+        }
+    }
+}
+
+unsafe fn drop_empty_node<K, V>(the_box: *mut Node<K, V>) {
+    // Prevent compiler from trying to drop the un-initialized key and values in the node.
+    let Node { key, value, .. } = *Box::from_raw(the_box);
+    mem::forget(key);
+    mem::forget(value);
+}
+
+impl<K: Hash + Eq, V> LinkedHashMap<K, V> {
+    /// Creates a linked hash map.
+    pub fn new() -> Self { Self::with_map(HashMap::new()) }
+
+    /// Creates an empty linked hash map with the given initial capacity.
+    pub fn with_capacity(capacity: usize) -> Self {
+        Self::with_map(HashMap::with_capacity(capacity))
+    }
+}
+
+impl<K, V, S> LinkedHashMap<K, V, S> {
+    #[inline]
+    fn detach(&mut self, node: *mut Node<K, V>) {
+        unsafe {
+            (*(*node).prev).next = (*node).next;
+            (*(*node).next).prev = (*node).prev;
+        }
+    }
+
+    #[inline]
+    fn attach(&mut self, node: *mut Node<K, V>) {
+        unsafe {
+            (*node).next = (*self.head).next;
+            (*node).prev = self.head;
+            (*self.head).next = node;
+            (*(*node).next).prev = node;
+        }
+    }
+
+    // Caller must check `!self.head.is_null()`
+    unsafe fn drop_entries(&mut self) {
+        let mut cur = (*self.head).next;
+        while cur != self.head {
+            let next = (*cur).next;
+            Box::from_raw(cur);
+            cur = next;
+        }
+    }
+
+    fn clear_free_list(&mut self) {
+        unsafe {
+            let mut free = self.free;
+            while ! free.is_null() {
+                let next_free = (*free).next;
+                drop_empty_node(free);
+                free = next_free;
+            }
+            self.free = ptr::null_mut();
+        }
+    }
+
+    fn ensure_guard_node(&mut self) {
+        if self.head.is_null() {
+            // allocate the guard node if not present
+            unsafe {
+                self.head = Box::into_raw(Box::new(mem::uninitialized()));
+                (*self.head).next = self.head;
+                (*self.head).prev = self.head;
+            }
+        }
+    }
+}
+
+impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
+    fn with_map(map: HashMap<KeyRef<K>, *mut Node<K, V>, S>) -> Self {
+        LinkedHashMap {
+            map: map,
+            head: ptr::null_mut(),
+            free: ptr::null_mut(),
+        }
+    }
+
+    /// Creates an empty linked hash map with the given initial hash builder.
+    pub fn with_hasher(hash_builder: S) -> Self {
+        Self::with_map(HashMap::with_hasher(hash_builder))
+    }
+
+    /// Creates an empty linked hash map with the given initial capacity and hash builder.
+    pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
+        Self::with_map(HashMap::with_capacity_and_hasher(capacity, hash_builder))
+    }
+
+    /// Reserves capacity for at least `additional` more elements to be inserted into the map. The
+    /// map may reserve more space to avoid frequent allocations.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the new allocation size overflows `usize.`
+    pub fn reserve(&mut self, additional: usize) { self.map.reserve(additional); }
+
+    /// Shrinks the capacity of the map as much as possible. It will drop down as much as possible
+    /// while maintaining the internal rules and possibly leaving some space in accordance with the
+    /// resize policy.
+    pub fn shrink_to_fit(&mut self) {
+        self.map.shrink_to_fit();
+        self.clear_free_list();
+    }
+
+    /// Gets the given key's corresponding entry in the map for in-place manipulation.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut letters = LinkedHashMap::new();
+    ///
+    /// for ch in "a short treatise on fungi".chars() {
+    ///     let counter = letters.entry(ch).or_insert(0);
+    ///     *counter += 1;
+    /// }
+    ///
+    /// assert_eq!(letters[&'s'], 2);
+    /// assert_eq!(letters[&'t'], 3);
+    /// assert_eq!(letters[&'u'], 1);
+    /// assert_eq!(letters.get(&'y'), None);
+    /// ```
+    pub fn entry(&mut self, k: K) -> Entry<K, V, S> {
+        let self_ptr: *mut Self = self;
+
+        if let Some(entry) = self.map.get_mut(&KeyRef{k: &k}) {
+            return Entry::Occupied(OccupiedEntry {
+                entry: *entry,
+                map: self_ptr,
+                marker: marker::PhantomData,
+            });
+        }
+
+        Entry::Vacant(VacantEntry {
+            key: k,
+            map: self,
+        })
+    }
+
+    /// Returns an iterator visiting all entries in insertion order.
+    /// Iterator element type is `OccupiedEntry<K, V, S>`. Allows for removal
+    /// as well as replacing the entry.
+    ///
+    /// # Examples
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert("a", 10);
+    /// map.insert("c", 30);
+    /// map.insert("b", 20);
+    ///
+    /// {
+    ///     let mut iter = map.entries();
+    ///     let mut entry = iter.next().unwrap();
+    ///     assert_eq!(&"a", entry.key());
+    ///     *entry.get_mut() = 17;
+    /// }
+    ///
+    /// assert_eq!(&17, map.get(&"a").unwrap());
+    /// ```
+    pub fn entries(&mut self) -> Entries<K, V, S> {
+        let head = if ! self.head.is_null() {
+            unsafe { (*self.head).prev }
+        } else {
+            ptr::null_mut()
+        };
+        Entries {
+            map: self,
+            head: head,
+            remaining: self.len(),
+            marker: marker::PhantomData,
+        }
+    }
+
+    /// Inserts a key-value pair into the map. If the key already existed, the old value is
+    /// returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert(1, "a");
+    /// map.insert(2, "b");
+    /// assert_eq!(map[&1], "a");
+    /// assert_eq!(map[&2], "b");
+    /// ```
+    pub fn insert(&mut self, k: K, v: V) -> Option<V> {
+        self.ensure_guard_node();
+
+        let (node, old_val) = match self.map.get(&KeyRef{k: &k}) {
+            Some(node) => {
+                let old_val = unsafe { ptr::replace(&mut (**node).value, v) };
+                (*node, Some(old_val))
+            }
+            None => {
+                let node = if self.free.is_null() {
+                    Box::into_raw(Box::new(Node::new(k, v)))
+                } else {
+                    // use a recycled box
+                    unsafe {
+                        let free = self.free;
+                        self.free = (*free).next;
+                        ptr::write(free, Node::new(k, v));
+                        free
+                    }
+                };
+                (node, None)
+            }
+        };
+        match old_val {
+            Some(_) => {
+                // Existing node, just update LRU position
+                self.detach(node);
+                self.attach(node);
+            }
+            None => {
+                let keyref = unsafe { &(*node).key };
+                self.map.insert(KeyRef{k: keyref}, node);
+                self.attach(node);
+            }
+        }
+        old_val
+    }
+
+    /// Checks if the map contains the given key.
+    pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool where K: Borrow<Q>, Q: Eq + Hash {
+        self.map.contains_key(Qey::from_ref(k))
+    }
+
+    /// Returns the value corresponding to the key in the map.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert(1, "a");
+    /// map.insert(2, "b");
+    /// map.insert(2, "c");
+    /// map.insert(3, "d");
+    ///
+    /// assert_eq!(map.get(&1), Some(&"a"));
+    /// assert_eq!(map.get(&2), Some(&"c"));
+    /// ```
+    pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, Q: Eq + Hash {
+        self.map.get(Qey::from_ref(k)).map(|e| unsafe { &(**e).value })
+    }
+
+    /// Returns the mutable reference corresponding to the key in the map.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert(1, "a");
+    /// map.insert(2, "b");
+    ///
+    /// *map.get_mut(&1).unwrap() = "c";
+    /// assert_eq!(map.get(&1), Some(&"c"));
+    /// ```
+    pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V> where K: Borrow<Q>, Q: Eq + Hash {
+        self.map.get(Qey::from_ref(k)).map(|e| unsafe { &mut (**e).value })
+    }
+
+    /// Returns the value corresponding to the key in the map.
+    ///
+    /// If value is found, it is moved to the end of the list.
+    /// This operation can be used in implemenation of LRU cache.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert(1, "a");
+    /// map.insert(2, "b");
+    /// map.insert(3, "d");
+    ///
+    /// assert_eq!(map.get_refresh(&2), Some(&mut "b"));
+    ///
+    /// assert_eq!((&2, &"b"), map.iter().rev().next().unwrap());
+    /// ```
+    pub fn get_refresh<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V> where K: Borrow<Q>, Q: Eq + Hash {
+        let (value, node_ptr_opt) = match self.map.get(Qey::from_ref(k)) {
+            None => (None, None),
+            Some(node) => {
+                (Some(unsafe { &mut (**node).value }), Some(*node))
+            }
+        };
+        if let Some(node_ptr) = node_ptr_opt {
+            self.detach(node_ptr);
+            self.attach(node_ptr);
+        }
+        value
+    }
+
+    /// Removes and returns the value corresponding to the key from the map.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert(2, "a");
+    ///
+    /// assert_eq!(map.remove(&1), None);
+    /// assert_eq!(map.remove(&2), Some("a"));
+    /// assert_eq!(map.remove(&2), None);
+    /// assert_eq!(map.len(), 0);
+    /// ```
+    pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V> where K: Borrow<Q>, Q: Eq + Hash {
+        let removed = self.map.remove(Qey::from_ref(k));
+        removed.map(|node| {
+            self.detach(node);
+            unsafe {
+                // add to free list
+                (*node).next = self.free;
+                self.free = node;
+                // drop the key and return the value
+                drop(ptr::read(&(*node).key));
+                ptr::read(&(*node).value)
+            }
+        })
+    }
+
+    /// Returns the maximum number of key-value pairs the map can hold without reallocating.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map: LinkedHashMap<i32, &str> = LinkedHashMap::new();
+    /// let capacity = map.capacity();
+    /// ```
+    pub fn capacity(&self) -> usize {
+        self.map.capacity()
+    }
+
+    /// Removes the first entry.
+    ///
+    /// Can be used in implementation of LRU cache.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert(1, 10);
+    /// map.insert(2, 20);
+    /// map.pop_front();
+    /// assert_eq!(map.get(&1), None);
+    /// assert_eq!(map.get(&2), Some(&20));
+    /// ```
+    #[inline]
+    pub fn pop_front(&mut self) -> Option<(K, V)> {
+        if self.is_empty() {
+            return None
+        }
+        let lru = unsafe { (*self.head).prev };
+        self.detach(lru);
+        self.map
+            .remove(&KeyRef{k: unsafe { &(*lru).key }})
+            .map(|e| {
+                let e = *unsafe { Box::from_raw(e) };
+                (e.key, e.value)
+            })
+    }
+
+    /// Gets the first entry.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert(1, 10);
+    /// map.insert(2, 20);
+    /// assert_eq!(map.front(), Some((&1, &10)));
+    /// ```
+    #[inline]
+    pub fn front(&self) -> Option<(&K, &V)> {
+        if self.is_empty() {
+            return None
+        }
+        let lru = unsafe { (*self.head).prev };
+        self.map
+            .get(&KeyRef{k: unsafe { &(*lru).key }})
+            .map(|e| unsafe { (&(**e).key, &(**e).value) })
+    }
+
+    /// Removes the last entry.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert(1, 10);
+    /// map.insert(2, 20);
+    /// map.pop_back();
+    /// assert_eq!(map.get(&1), Some(&10));
+    /// assert_eq!(map.get(&2), None);
+    /// ```
+    #[inline]
+    pub fn pop_back(&mut self) -> Option<(K, V)> {
+        if self.is_empty() {
+            return None
+        }
+        let mru = unsafe { (*self.head).next };
+        self.detach(mru);
+        self.map
+            .remove(&KeyRef{k: unsafe { &(*mru).key }})
+            .map(|e| {
+                let e = *unsafe { Box::from_raw(e) };
+                (e.key, e.value)
+            })
+    }
+
+    /// Gets the last entry.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert(1, 10);
+    /// map.insert(2, 20);
+    /// assert_eq!(map.back(), Some((&2, &20)));
+    /// ```
+    #[inline]
+    pub fn back(&mut self) -> Option<(&K, &V)> {
+        if self.is_empty() {
+            return None
+        }
+        let mru = unsafe { (*self.head).next };
+        self.map
+            .get(&KeyRef{k: unsafe { &(*mru).key }})
+            .map(|e| unsafe { (&(**e).key, &(**e).value) })
+    }
+
+    /// Returns the number of key-value pairs in the map.
+    pub fn len(&self) -> usize { self.map.len() }
+
+    /// Returns whether the map is currently empty.
+    pub fn is_empty(&self) -> bool { self.len() == 0 }
+
+    /// Returns a reference to the map's hasher.
+    pub fn hasher(&self) -> &S {
+        self.map.hasher()
+    }
+
+    /// Clears the map of all key-value pairs.
+    pub fn clear(&mut self) {
+        self.map.clear();
+        // update the guard node if present
+        if ! self.head.is_null() {
+            unsafe {
+                self.drop_entries();
+                (*self.head).prev = self.head;
+                (*self.head).next = self.head;
+            }
+        }
+    }
+
+    /// Returns a double-ended iterator visiting all key-value pairs in order of insertion.
+    /// Iterator element type is `(&'a K, &'a V)`
+    ///
+    /// # Examples
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert("a", 10);
+    /// map.insert("c", 30);
+    /// map.insert("b", 20);
+    ///
+    /// let mut iter = map.iter();
+    /// assert_eq!((&"a", &10), iter.next().unwrap());
+    /// assert_eq!((&"c", &30), iter.next().unwrap());
+    /// assert_eq!((&"b", &20), iter.next().unwrap());
+    /// assert_eq!(None, iter.next());
+    /// ```
+    pub fn iter(&self) -> Iter<K, V> {
+        let head = if self.head.is_null() {
+            ptr::null_mut()
+        } else {
+            unsafe { (*self.head).prev }
+        };
+        Iter {
+            head: head,
+            tail: self.head,
+            remaining: self.len(),
+            marker: marker::PhantomData,
+        }
+    }
+
+    /// Returns a double-ended iterator visiting all key-value pairs in order of insertion.
+    /// Iterator element type is `(&'a K, &'a mut V)`
+    /// # Examples
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert("a", 10);
+    /// map.insert("c", 30);
+    /// map.insert("b", 20);
+    ///
+    /// {
+    ///     let mut iter = map.iter_mut();
+    ///     let mut entry = iter.next().unwrap();
+    ///     assert_eq!(&"a", entry.0);
+    ///     *entry.1 = 17;
+    /// }
+    ///
+    /// assert_eq!(&17, map.get(&"a").unwrap());
+    /// ```
+    pub fn iter_mut(&mut self) -> IterMut<K, V> {
+        let head = if self.head.is_null() {
+            ptr::null_mut()
+        } else {
+            unsafe { (*self.head).prev }
+        };
+        IterMut {
+            head: head,
+            tail: self.head,
+            remaining: self.len(),
+            marker: marker::PhantomData,
+        }
+    }
+
+    /// Returns a double-ended iterator visiting all key in order of insertion.
+    ///
+    /// # Examples
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert('a', 10);
+    /// map.insert('c', 30);
+    /// map.insert('b', 20);
+    ///
+    /// let mut keys = map.keys();
+    /// assert_eq!(&'a', keys.next().unwrap());
+    /// assert_eq!(&'c', keys.next().unwrap());
+    /// assert_eq!(&'b', keys.next().unwrap());
+    /// assert_eq!(None, keys.next());
+    /// ```
+    pub fn keys(&self) -> Keys<K, V> {
+        Keys { inner: self.iter() }
+    }
+
+    /// Returns a double-ended iterator visiting all values in order of insertion.
+    ///
+    /// # Examples
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    /// map.insert('a', 10);
+    /// map.insert('c', 30);
+    /// map.insert('b', 20);
+    ///
+    /// let mut values = map.values();
+    /// assert_eq!(&10, values.next().unwrap());
+    /// assert_eq!(&30, values.next().unwrap());
+    /// assert_eq!(&20, values.next().unwrap());
+    /// assert_eq!(None, values.next());
+    /// ```
+    pub fn values(&self) -> Values<K, V> {
+        Values { inner: self.iter() }
+    }
+}
+
+impl<'a, K, V, S, Q: ?Sized> Index<&'a Q> for LinkedHashMap<K, V, S>
+    where K: Hash + Eq + Borrow<Q>, S: BuildHasher, Q: Eq + Hash
+{
+    type Output = V;
+
+    fn index(&self, index: &'a Q) -> &V {
+        self.get(index).expect("no entry found for key")
+    }
+}
+
+impl<'a, K, V, S, Q: ?Sized> IndexMut<&'a Q> for LinkedHashMap<K, V, S>
+    where K: Hash + Eq + Borrow<Q>, S: BuildHasher, Q: Eq + Hash
+{
+    fn index_mut(&mut self, index: &'a Q) -> &mut V {
+        self.get_mut(index).expect("no entry found for key")
+    }
+}
+
+impl<K: Hash + Eq + Clone, V: Clone, S: BuildHasher + Clone> Clone for LinkedHashMap<K, V, S> {
+    fn clone(&self) -> Self {
+        let mut map = Self::with_hasher(self.map.hasher().clone());
+        map.extend(self.iter().map(|(k, v)| (k.clone(), v.clone())));
+        map
+    }
+}
+
+impl<K: Hash + Eq, V, S: BuildHasher + Default> Default for LinkedHashMap<K, V, S> {
+    fn default() -> Self { Self::with_hasher(S::default()) }
+}
+
+impl<K: Hash + Eq, V, S: BuildHasher> Extend<(K, V)> for LinkedHashMap<K, V, S> {
+    fn extend<I: IntoIterator<Item=(K, V)>>(&mut self, iter: I) {
+        for (k, v) in iter {
+            self.insert(k, v);
+        }
+    }
+}
+
+impl<'a, K, V, S> Extend<(&'a K, &'a V)> for LinkedHashMap<K, V, S>
+    where K: 'a + Hash + Eq + Copy, V: 'a + Copy, S: BuildHasher,
+{
+    fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: I) {
+        for (&k, &v) in iter {
+            self.insert(k, v);
+        }
+    }
+}
+
+impl<K: Hash + Eq, V, S: BuildHasher + Default> iter::FromIterator<(K, V)> for LinkedHashMap<K, V, S> {
+    fn from_iter<I: IntoIterator<Item=(K, V)>>(iter: I) -> Self {
+        let iter = iter.into_iter();
+        let mut map = Self::with_capacity_and_hasher(iter.size_hint().0, S::default());
+        map.extend(iter);
+        map
+    }
+}
+
+impl<A: fmt::Debug + Hash + Eq, B: fmt::Debug, S: BuildHasher> fmt::Debug for LinkedHashMap<A, B, S> {
+    /// Returns a string that lists the key-value pairs in insertion order.
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_map().entries(self).finish()
+    }
+}
+
+impl<K: Hash + Eq, V: PartialEq, S: BuildHasher> PartialEq for LinkedHashMap<K, V, S> {
+    fn eq(&self, other: &Self) -> bool {
+        self.len() == other.len() && self.iter().eq(other)
+    }
+}
+
+impl<K: Hash + Eq, V: Eq, S: BuildHasher> Eq for LinkedHashMap<K, V, S> {}
+
+impl<K: Hash + Eq + PartialOrd, V: PartialOrd, S: BuildHasher> PartialOrd for LinkedHashMap<K, V, S> {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        self.iter().partial_cmp(other)
+    }
+
+    fn lt(&self, other: &Self) -> bool {
+        self.iter().lt(other)
+    }
+
+    fn le(&self, other: &Self) -> bool {
+        self.iter().le(other)
+    }
+
+    fn ge(&self, other: &Self) -> bool {
+        self.iter().ge(other)
+    }
+
+    fn gt(&self, other: &Self) -> bool {
+        self.iter().gt(other)
+    }
+}
+
+impl<K: Hash + Eq + Ord, V: Ord, S: BuildHasher> Ord for LinkedHashMap<K, V, S> {
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.iter().cmp(other)
+    }
+}
+
+impl<K: Hash + Eq, V: Hash, S: BuildHasher> Hash for LinkedHashMap<K, V, S> {
+    fn hash<H: Hasher>(&self, h: &mut H) { for e in self.iter() { e.hash(h); } }
+}
+
+unsafe impl<K: Send, V: Send, S: Send> Send for LinkedHashMap<K, V, S> {}
+
+unsafe impl<K: Sync, V: Sync, S: Sync> Sync for LinkedHashMap<K, V, S> {}
+
+impl<K, V, S> Drop for LinkedHashMap<K, V, S> {
+    fn drop(&mut self) {
+        if !self.head.is_null() {
+            unsafe {
+                self.drop_entries();
+                drop_empty_node(self.head);
+            }
+        }
+        self.clear_free_list();
+    }
+}
+
+/// An insertion-order iterator over a `LinkedHashMap`'s entries, with immutable references to the
+/// values.
+pub struct Iter<'a, K: 'a, V: 'a> {
+    head: *const Node<K, V>,
+    tail: *const Node<K, V>,
+    remaining: usize,
+    marker: marker::PhantomData<(&'a K, &'a V)>,
+}
+
+/// An insertion-order iterator over a `LinkedHashMap`'s entries, with mutable references to the
+/// values.
+pub struct IterMut<'a, K: 'a, V: 'a> {
+    head: *mut Node<K, V>,
+    tail: *mut Node<K, V>,
+    remaining: usize,
+    marker: marker::PhantomData<(&'a K, &'a mut V)>,
+}
+
+/// A consuming insertion-order iterator over a `LinkedHashMap`'s entries.
+pub struct IntoIter<K, V> {
+    head: *mut Node<K, V>,
+    tail: *mut Node<K, V>,
+    remaining: usize,
+    marker: marker::PhantomData<(K, V)>,
+}
+
+/// An insertion-order iterator over a `LinkedHashMap`'s entries represented as
+/// an `OccupiedEntry`.
+pub struct Entries<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
+    map: *mut LinkedHashMap<K, V, S>,
+    head: *mut Node<K, V>,
+    remaining: usize,
+    marker: marker::PhantomData<(&'a K, &'a mut V, &'a S)>,
+}
+
+unsafe impl<'a, K, V> Send for Iter<'a, K, V> where K: Send, V: Send {}
+
+unsafe impl<'a, K, V> Send for IterMut<'a, K, V> where K: Send, V: Send {}
+
+unsafe impl<K, V> Send for IntoIter<K, V> where K: Send, V: Send {}
+
+unsafe impl<'a, K, V, S> Send for Entries<'a, K, V, S> where K: Send, V: Send, S: Send {}
+
+unsafe impl<'a, K, V> Sync for Iter<'a, K, V> where K: Sync, V: Sync {}
+
+unsafe impl<'a, K, V> Sync for IterMut<'a, K, V> where K: Sync, V: Sync {}
+
+unsafe impl<K, V> Sync for IntoIter<K, V> where K: Sync, V: Sync {}
+
+unsafe impl<'a, K, V, S> Sync for Entries<'a, K, V, S> where K: Sync, V: Sync, S: Sync {}
+
+impl<'a, K, V> Clone for Iter<'a, K, V> {
+    fn clone(&self) -> Self { Iter { ..*self } }
+}
+
+impl<K, V> Clone for IntoIter<K, V> where K: Clone, V: Clone {
+    fn clone(&self) -> Self {
+        if self.remaining == 0 {
+            return IntoIter { ..*self }
+        }
+
+        fn clone_node<K, V>(e: *mut Node<K, V>) -> *mut Node<K, V>
+            where K: Clone, V: Clone,
+        {
+            Box::into_raw(Box::new(Node::new(
+                unsafe { (*e).key.clone() }, unsafe { (*e).value.clone() }
+            )))
+        }
+
+        let mut cur = self.head;
+        let head = clone_node(cur);
+        let mut tail = head;
+        for _ in 1..self.remaining {
+            unsafe {
+                (*tail).prev = clone_node((*cur).prev);
+                (*(*tail).prev).next = tail;
+                tail = (*tail).prev;
+                cur = (*cur).prev;
+            }
+        }
+
+        IntoIter {
+            head: head,
+            tail: tail,
+            remaining: self.remaining,
+            marker: marker::PhantomData,
+        }
+    }
+}
+
+impl<'a, K, V> Iterator for Iter<'a, K, V> {
+    type Item = (&'a K, &'a V);
+
+    fn next(&mut self) -> Option<(&'a K, &'a V)> {
+        if self.head == self.tail {
+            None
+        } else {
+            self.remaining -= 1;
+            unsafe {
+                let r = Some((&(*self.head).key, &(*self.head).value));
+                self.head = (*self.head).prev;
+                r
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (self.remaining, Some(self.remaining))
+    }
+}
+
+impl<'a, K, V> Iterator for IterMut<'a, K, V> {
+    type Item = (&'a K, &'a mut V);
+
+    fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
+        if self.head == self.tail {
+            None
+        } else {
+            self.remaining -= 1;
+            unsafe {
+                let r = Some((&(*self.head).key, &mut (*self.head).value));
+                self.head = (*self.head).prev;
+                r
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (self.remaining, Some(self.remaining))
+    }
+}
+
+impl<K, V> Iterator for IntoIter<K, V> {
+    type Item = (K, V);
+
+    fn next(&mut self) -> Option<(K, V)> {
+        if self.remaining == 0 {
+            return None
+        }
+        self.remaining -= 1;
+        unsafe {
+            let prev = (*self.head).prev;
+            let e = *Box::from_raw(self.head);
+            self.head = prev;
+            Some((e.key, e.value))
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (self.remaining, Some(self.remaining))
+    }
+}
+
+impl<'a, K, V, S: BuildHasher> Iterator for Entries<'a, K, V, S> {
+    type Item = OccupiedEntry<'a, K, V, S>;
+
+    fn next(&mut self) -> Option<OccupiedEntry<'a, K, V, S>> {
+        if self.remaining == 0 {
+            None
+        } else {
+            self.remaining -= 1;
+            unsafe {
+                let r = Some(OccupiedEntry {
+                    map: self.map,
+                    entry: self.head,
+                    marker: marker::PhantomData,
+                });
+
+                self.head = (*self.head).prev;
+                r
+            }
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (self.remaining, Some(self.remaining))
+    }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
+    fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
+        if self.head == self.tail {
+            None
+        } else {
+            self.remaining -= 1;
+            unsafe {
+                self.tail = (*self.tail).next;
+                Some((&(*self.tail).key, &(*self.tail).value))
+            }
+        }
+    }
+}
+
+impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
+    fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
+        if self.head == self.tail {
+            None
+        } else {
+            self.remaining -= 1;
+            unsafe {
+                self.tail = (*self.tail).next;
+                Some((&(*self.tail).key, &mut (*self.tail).value))
+            }
+        }
+    }
+}
+
+impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
+    fn next_back(&mut self) -> Option<(K, V)> {
+        if self.remaining == 0 {
+            return None
+        }
+        self.remaining -= 1;
+        unsafe {
+            let next = (*self.tail).next;
+            let e = *Box::from_raw(self.tail);
+            self.tail = next;
+            Some((e.key, e.value))
+        }
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
+    fn len(&self) -> usize { self.remaining }
+}
+
+impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
+    fn len(&self) -> usize { self.remaining }
+}
+
+impl<K, V> ExactSizeIterator for IntoIter<K, V> {
+    fn len(&self) -> usize { self.remaining }
+}
+
+impl<K, V> Drop for IntoIter<K, V> {
+    fn drop(&mut self) {
+        for _ in 0..self.remaining {
+            unsafe {
+                let next = (*self.tail).next;
+                Box::from_raw(self.tail);
+                self.tail = next;
+            }
+        }
+    }
+}
+
+/// An insertion-order iterator over a `LinkedHashMap`'s keys.
+pub struct Keys<'a, K: 'a, V: 'a> {
+    inner: Iter<'a, K, V>,
+}
+
+impl<'a, K, V> Clone for Keys<'a, K, V> {
+    fn clone(&self) -> Self { Keys { inner: self.inner.clone() } }
+}
+
+impl<'a, K, V> Iterator for Keys<'a, K, V> {
+    type Item = &'a K;
+
+    #[inline] fn next(&mut self) -> Option<&'a K> { self.inner.next().map(|e| e.0) }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
+    #[inline] fn next_back(&mut self) -> Option<&'a K> { self.inner.next_back().map(|e| e.0) }
+}
+
+impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
+    fn len(&self) -> usize { self.inner.len() }
+}
+
+/// An insertion-order iterator over a `LinkedHashMap`'s values.
+pub struct Values<'a, K: 'a, V: 'a> {
+    inner: Iter<'a, K, V>,
+}
+
+impl<'a, K, V> Clone for Values<'a, K, V> {
+    fn clone(&self) -> Self { Values { inner: self.inner.clone() } }
+}
+
+impl<'a, K, V> Iterator for Values<'a, K, V> {
+    type Item = &'a V;
+
+    #[inline] fn next(&mut self) -> Option<&'a V> { self.inner.next().map(|e| e.1) }
+    #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
+}
+
+impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
+    #[inline] fn next_back(&mut self) -> Option<&'a V> { self.inner.next_back().map(|e| e.1) }
+}
+
+impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
+    fn len(&self) -> usize { self.inner.len() }
+}
+
+impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a LinkedHashMap<K, V, S> {
+    type Item = (&'a K, &'a V);
+    type IntoIter = Iter<'a, K, V>;
+    fn into_iter(self) -> Iter<'a, K, V> { self.iter() }
+}
+
+impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a mut LinkedHashMap<K, V, S> {
+    type Item = (&'a K, &'a mut V);
+    type IntoIter = IterMut<'a, K, V>;
+    fn into_iter(self) -> IterMut<'a, K, V> { self.iter_mut() }
+}
+
+impl<K: Hash + Eq, V, S: BuildHasher> IntoIterator for LinkedHashMap<K, V, S> {
+    type Item = (K, V);
+    type IntoIter = IntoIter<K, V>;
+    fn into_iter(mut self) -> IntoIter<K, V> {
+        let (head, tail) = if !self.head.is_null() {
+            unsafe { ((*self.head).prev, (*self.head).next) }
+        } else {
+            (ptr::null_mut(), ptr::null_mut())
+        };
+        let len = self.len();
+
+        if !self.head.is_null() {
+            unsafe { drop_empty_node(self.head) }
+        }
+        self.clear_free_list();
+        // drop the HashMap but not the LinkedHashMap
+        self.map = unsafe { mem::uninitialized() };
+        mem::forget(self);
+
+        IntoIter {
+            head: head,
+            tail: tail,
+            remaining: len,
+            marker: marker::PhantomData,
+        }
+    }
+}
+
+/// A view into a single location in a map, which may be vacant or occupied.
+pub enum Entry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
+    /// An occupied Entry.
+    Occupied(OccupiedEntry<'a, K, V, S>),
+    /// A vacant Entry.
+    Vacant(VacantEntry<'a, K, V, S>),
+}
+
+/// A view into a single occupied location in a `LinkedHashMap`.
+pub struct OccupiedEntry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
+    entry: *mut Node<K, V>,
+    map: *mut LinkedHashMap<K, V, S>,
+    marker: marker::PhantomData<&'a K>,
+}
+
+/// A view into a single empty location in a `LinkedHashMap`.
+pub struct VacantEntry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
+    key: K,
+    map: &'a mut LinkedHashMap<K, V, S>,
+}
+
+impl<'a, K: Hash + Eq, V, S: BuildHasher> Entry<'a, K, V, S> {
+    /// Returns the entry key
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::<String, u32>::new();
+    ///
+    /// assert_eq!("hello", map.entry("hello".to_string()).key());
+    /// ```
+    pub fn key(&self) -> &K {
+        match *self {
+            Entry::Occupied(ref e) => e.key(),
+            Entry::Vacant(ref e) => e.key(),
+        }
+    }
+
+    /// Ensures a value is in the entry by inserting the default if empty, and returns
+    /// a mutable reference to the value in the entry.
+    pub fn or_insert(self, default: V) -> &'a mut V {
+        match self {
+            Entry::Occupied(entry) => entry.into_mut(),
+            Entry::Vacant(entry) => entry.insert(default),
+        }
+    }
+
+    /// Ensures a value is in the entry by inserting the result of the default function if empty,
+    /// and returns a mutable reference to the value in the entry.
+    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
+        match self {
+            Entry::Occupied(entry) => entry.into_mut(),
+            Entry::Vacant(entry) => entry.insert(default()),
+        }
+    }
+}
+
+impl<'a, K: Hash + Eq, V, S: BuildHasher> OccupiedEntry<'a, K, V, S> {
+    /// Gets a reference to the entry key
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::new();
+    ///
+    /// map.insert("foo".to_string(), 1);
+    /// assert_eq!("foo", map.entry("foo".to_string()).key());
+    /// ```
+    pub fn key(&self) -> &K {
+        unsafe { &(*self.entry).key }
+    }
+
+    /// Gets a reference to the value in the entry.
+    pub fn get(&self) -> &V {
+        unsafe { &(*self.entry).value }
+    }
+
+    /// Gets a mutable reference to the value in the entry.
+    pub fn get_mut(&mut self) -> &mut V {
+        unsafe { &mut (*self.entry).value }
+    }
+
+    /// Converts the OccupiedEntry into a mutable reference to the value in the entry
+    /// with a lifetime bound to the map itself
+    pub fn into_mut(self) -> &'a mut V {
+        unsafe { &mut (*self.entry).value }
+    }
+
+    /// Sets the value of the entry, and returns the entry's old value
+    pub fn insert(&mut self, value: V) -> V {
+        unsafe {
+            (*self.map).ensure_guard_node();
+
+            let old_val = mem::replace(&mut (*self.entry).value, value);
+            let node_ptr: *mut Node<K, V> = self.entry;
+
+            // Existing node, just update LRU position
+            (*self.map).detach(node_ptr);
+            (*self.map).attach(node_ptr);
+
+            old_val
+        }
+    }
+
+    /// Takes the value out of the entry, and returns it
+    pub fn remove(self) -> V {
+        unsafe { (*self.map).remove(&(*self.entry).key) }.unwrap()
+    }
+}
+
+impl<'a, K: 'a + Hash + Eq, V: 'a, S: BuildHasher> VacantEntry<'a, K, V, S> {
+    /// Gets a reference to the entry key
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use linked_hash_map::LinkedHashMap;
+    ///
+    /// let mut map = LinkedHashMap::<String, u32>::new();
+    ///
+    /// assert_eq!("foo", map.entry("foo".to_string()).key());
+    /// ```
+    pub fn key(&self) -> &K {
+        &self.key
+    }
+
+    /// Sets the value of the entry with the VacantEntry's key,
+    /// and returns a mutable reference to it
+    pub fn insert(self, value: V) -> &'a mut V {
+        self.map.ensure_guard_node();
+
+        let node = if self.map.free.is_null() {
+            Box::into_raw(Box::new(Node::new(self.key, value)))
+        } else {
+            // use a recycled box
+            unsafe {
+                let free = self.map.free;
+                self.map.free = (*free).next;
+                ptr::write(free, Node::new(self.key, value));
+                free
+            }
+        };
+
+        let keyref = unsafe { &(*node).key };
+
+        self.map.attach(node);
+
+        let ret = self.map.map.entry(KeyRef{k: keyref}).or_insert(node);
+        unsafe { &mut (**ret).value }
+    }
+}
+
+#[cfg(all(feature = "nightly", test))]
+mod bench {
+    extern crate test;
+
+    use super::LinkedHashMap;
+
+    #[bench]
+    fn not_recycled_cycling(b: &mut test::Bencher) {
+        let mut hash_map = LinkedHashMap::with_capacity(1000);
+        for i in 0usize..1000 {
+            hash_map.insert(i, i);
+        }
+        b.iter(|| {
+            for i in 0usize..1000 {
+                hash_map.remove(&i);
+            }
+            hash_map.clear_free_list();
+            for i in 0usize..1000 {
+                hash_map.insert(i, i);
+            }
+        })
+    }
+
+    #[bench]
+    fn recycled_cycling(b: &mut test::Bencher) {
+        let mut hash_map = LinkedHashMap::with_capacity(1000);
+        for i in 0usize..1000 {
+            hash_map.insert(i, i);
+        }
+        b.iter(|| {
+            for i in 0usize..1000 {
+                hash_map.remove(&i);
+            }
+            for i in 0usize..1000 {
+                hash_map.insert(i, i);
+            }
+        })
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/src/serde.rs
@@ -0,0 +1,94 @@
+//! An optional implementation of serialization/deserialization.
+
+extern crate serde;
+
+use std::fmt::{Formatter, Result as FmtResult};
+use std::marker::PhantomData;
+use std::hash::{BuildHasher, Hash};
+
+use super::LinkedHashMap;
+
+use self::serde::{Serialize, Serializer, Deserialize, Deserializer};
+use self::serde::ser::SerializeMap;
+use self::serde::de::{Visitor, MapAccess, Error};
+
+impl<K, V, S> Serialize for LinkedHashMap<K, V, S>
+    where K: Serialize + Eq + Hash,
+          V: Serialize,
+          S: BuildHasher
+{
+    #[inline]
+    fn serialize<T>(&self, serializer:T) -> Result<T::Ok, T::Error>
+        where T: Serializer,
+    {
+        let mut map_serializer = try!(serializer.serialize_map(Some(self.len())));
+        for (k, v) in self {
+            try!(map_serializer.serialize_key(k));
+            try!(map_serializer.serialize_value(v));
+        }
+        map_serializer.end()
+    }
+}
+
+#[derive(Debug)]
+/// `serde::de::Visitor` for a linked hash map.
+pub struct LinkedHashMapVisitor<K, V> {
+    marker: PhantomData<LinkedHashMap<K, V>>,
+}
+
+impl<K, V> LinkedHashMapVisitor<K, V> {
+    /// Creates a new visitor for a linked hash map.
+    pub fn new() -> Self {
+        LinkedHashMapVisitor {
+            marker: PhantomData,
+        }
+    }
+}
+
+impl<K, V> Default for LinkedHashMapVisitor<K, V> {
+    fn default() -> Self {
+        LinkedHashMapVisitor::new()
+    }
+}
+
+impl<'de, K, V> Visitor<'de> for LinkedHashMapVisitor<K, V>
+    where K: Deserialize<'de> + Eq + Hash,
+          V: Deserialize<'de>,
+{
+    type Value = LinkedHashMap<K, V>;
+
+    fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
+        write!(formatter, "a map")
+    }
+
+    #[inline]
+    fn visit_unit<E>(self) -> Result<Self::Value, E>
+        where E: Error,
+    {
+        Ok(LinkedHashMap::new())
+    }
+
+    #[inline]
+    fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
+        where M: MapAccess<'de>,
+    {
+        let mut values = LinkedHashMap::with_capacity(map.size_hint().unwrap_or(0));
+
+        while let Some((key, value)) = map.next_entry()? {
+            values.insert(key, value);
+        }
+
+        Ok(values)
+    }
+}
+
+impl<'de, K, V> Deserialize<'de> for LinkedHashMap<K, V>
+    where K: Deserialize<'de> + Eq + Hash,
+          V: Deserialize<'de>,
+{
+    fn deserialize<D>(deserializer: D) -> Result<LinkedHashMap<K, V>, D::Error>
+        where D: Deserializer<'de>,
+    {
+        deserializer.deserialize_map(LinkedHashMapVisitor::new())
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/tests/heapsize.rs
@@ -0,0 +1,23 @@
+#![cfg(feature = "heapsize_impl")]
+
+extern crate heapsize;
+extern crate linked_hash_map;
+
+use linked_hash_map::LinkedHashMap;
+use heapsize::HeapSizeOf;
+
+#[test]
+fn empty() {
+    assert_eq!(LinkedHashMap::<String, String>::new().heap_size_of_children(), 0);
+}
+
+#[test]
+fn nonempty() {
+    let mut map = LinkedHashMap::new();
+    map.insert("hello".to_string(), "world".to_string());
+    map.insert("hola".to_string(), "mundo".to_string());
+    map.insert("bonjour".to_string(), "monde".to_string());
+    map.remove("hello");
+
+    assert!(map.heap_size_of_children() != 0);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/tests/serde.rs
@@ -0,0 +1,38 @@
+#![cfg(feature = "serde_impl")]
+
+extern crate linked_hash_map;
+use linked_hash_map::LinkedHashMap;
+
+extern crate serde_test;
+use serde_test::{Token, assert_tokens};
+
+#[test]
+fn test_ser_de_empty() {
+    let map = LinkedHashMap::<char, u32>::new();
+
+    assert_tokens(&map, &[
+        Token::Map { len: Some(0) },
+        Token::MapEnd,
+    ]);
+}
+
+#[test]
+fn test_ser_de() {
+    let mut map = LinkedHashMap::new();
+    map.insert('b', 20);
+    map.insert('a', 10);
+    map.insert('c', 30);
+
+    assert_tokens(&map, &[
+        Token::Map { len: Some(3) },
+            Token::Char('b'),
+            Token::I32(20),
+
+            Token::Char('a'),
+            Token::I32(10),
+
+            Token::Char('c'),
+            Token::I32(30),
+        Token::MapEnd,
+    ]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/linked-hash-map/tests/test.rs
@@ -0,0 +1,426 @@
+extern crate linked_hash_map;
+
+use linked_hash_map::{LinkedHashMap, Entry};
+
+fn assert_opt_eq<V: PartialEq>(opt: Option<&V>, v: V) {
+    assert!(opt.is_some());
+    assert!(opt.unwrap() == &v);
+}
+
+#[test]
+fn test_insert_and_get() {
+    let mut map = LinkedHashMap::new();
+    map.insert(1, 10);
+    map.insert(2, 20);
+    assert_opt_eq(map.get(&1), 10);
+    assert_opt_eq(map.get(&2), 20);
+    assert_eq!(map.len(), 2);
+}
+
+#[test]
+fn test_index() {
+    let mut map = LinkedHashMap::new();
+    map.insert(1, 10);
+    map.insert(2, 20);
+    assert_eq!(10, map[&1]);
+    map[&2] = 22;
+    assert_eq!(22, map[&2]);
+}
+
+#[test]
+fn test_insert_update() {
+    let mut map = LinkedHashMap::new();
+    map.insert("1".to_string(), vec![10, 10]);
+    map.insert("1".to_string(), vec![10, 19]);
+    assert_opt_eq(map.get(&"1".to_string()), vec![10, 19]);
+    assert_eq!(map.len(), 1);
+}
+
+#[test]
+fn test_entry_insert_vacant() {
+    let mut map = LinkedHashMap::new();
+    match map.entry("1".to_string()) {
+        Entry::Vacant(e) => {
+            assert_eq!(*e.insert(vec![10, 10]), vec![10, 10]);
+        }
+        _ => panic!("fail"),
+    }
+    assert!(map.contains_key("1"));
+    assert_eq!(map["1"], vec![10, 10]);
+
+    match map.entry("1".to_string()) {
+        Entry::Occupied(mut e) => {
+            assert_eq!(*e.get(), vec![10, 10]);
+            assert_eq!(e.insert(vec![10, 16]), vec![10, 10]);
+        }
+        _ => panic!("fail"),
+    }
+
+    assert!(map.contains_key("1"));
+    assert_eq!(map["1"], vec![10, 16]);
+
+    match map.entry("1".to_string()) {
+        Entry::Occupied(e) => {
+            assert_eq!(e.remove(), vec![10, 16]);
+        }
+        _ => panic!("fail"),
+    }
+}
+
+#[test]
+fn test_entries_replacing() {
+    let mut map = LinkedHashMap::new();
+    map.insert("a", 10);
+
+    {
+        let mut iter = map.entries();
+        let mut entry = iter.next().unwrap();
+        assert_eq!(entry.insert(20), 10);
+        assert!(iter.next().is_none());
+    }
+
+    assert_eq!(map["a"], 20);
+}
+
+#[test]
+fn test_entries_remove() {
+    let mut map = LinkedHashMap::new();
+    map.insert("a", 10);
+    map.insert("b", 20);
+    map.insert("c", 30);
+    map.insert("d", 40);
+
+    // remove middle
+    {
+        let mut iter = map.entries();
+        iter.next().unwrap();
+        let b = iter.next().unwrap();
+        assert_eq!(*b.key(), "b");
+        assert_eq!(b.remove(), 20);
+        assert_eq!(*iter.next().unwrap().key(), "c");
+    }
+
+    assert_eq!(map.len(), 3);
+    assert_eq!(map["a"], 10);
+    assert_eq!(map["c"], 30);
+    assert_eq!(map["d"], 40);
+
+    // remove first
+    {
+        let mut iter = map.entries();
+        let a = iter.next().unwrap();
+        assert_eq!(*a.key(), "a");
+        assert_eq!(a.remove(), 10);
+    }
+
+    assert_eq!(map.len(), 2);
+    assert_eq!(map["c"], 30);
+    assert_eq!(map["d"], 40);
+
+    // remove last
+    {
+        let mut iter = map.entries();
+        iter.next().unwrap();
+        let d = iter.next().unwrap();
+        assert_eq!(*d.key(), "d");
+        assert_eq!(d.remove(), 40);
+        assert!(iter.next().is_none());
+    }
+
+    assert_eq!(map.len(), 1);
+    assert_eq!(map["c"], 30);
+
+    // remove only
+    {
+        let mut iter = map.entries();
+        let c = iter.next().unwrap();
+        assert_eq!(*c.key(), "c");
+        assert_eq!(c.remove(), 30);
+    }
+
+    assert!(map.is_empty());
+}
+#[test]
+fn entries_insert() {
+    let mut map = LinkedHashMap::new();
+    map.insert(0, 0);
+    map.insert(1, 1);
+
+    let mut iter = map.entries();
+
+    iter.next().unwrap().insert(0);
+    iter.next().unwrap(); // 1
+    assert!(iter.next().is_none());
+}
+
+#[test]
+fn test_debug() {
+    let mut map = LinkedHashMap::new();
+    assert_eq!(format!("{:?}", map), "{}");
+    map.insert(1, 10);
+    map.insert(2, 20);
+    map.insert(3, 30);
+    assert_eq!(format!("{:?}", map), "{1: 10, 2: 20, 3: 30}");
+    map.insert(2, 22);
+    assert_eq!(format!("{:?}", map), "{1: 10, 3: 30, 2: 22}");
+    map.get(&3);
+    assert_eq!(format!("{:?}", map), "{1: 10, 3: 30, 2: 22}");
+    map.get_refresh(&mut 3);
+    assert_eq!(format!("{:?}", map), "{1: 10, 2: 22, 3: 30}");
+    map.clear();
+    assert_eq!(format!("{:?}", map), "{}");
+}
+
+#[test]
+fn test_remove() {
+    let mut map = LinkedHashMap::new();
+    map.insert(1, 10);
+    map.insert(2, 20);
+    map.insert(3, 30);
+    map.insert(4, 40);
+    map.insert(5, 50);
+    map.remove(&3);
+    map.remove(&4);
+    assert!(map.get(&3).is_none());
+    assert!(map.get(&4).is_none());
+    map.insert(6, 60);
+    map.insert(7, 70);
+    map.insert(8, 80);
+    assert_opt_eq(map.get(&6), 60);
+    assert_opt_eq(map.get(&7), 70);
+    assert_opt_eq(map.get(&8), 80);
+}
+
+
+#[test]
+fn test_pop() {
+    let mut map = LinkedHashMap::new();
+    map.insert(1, 10);
+    map.insert(2, 20);
+    map.insert(3, 30);
+    map.insert(4, 40);
+    map.insert(5, 50);
+    assert_eq!(map.pop_front(), Some((1, 10)));
+    assert!(map.get(&1).is_none());
+    assert_eq!(map.pop_back(), Some((5, 50)));
+    assert!(map.get(&5).is_none());
+    map.insert(6, 60);
+    map.insert(7, 70);
+    map.insert(8, 80);
+    assert_eq!(map.pop_front(), Some((2, 20)));
+    assert!(map.get(&2).is_none());
+    assert_eq!(map.pop_back(), Some((8, 80)));
+    assert!(map.get(&8).is_none());
+    map.insert(3, 30);
+    assert_eq!(map.pop_front(), Some((4, 40)));
+    assert!(map.get(&4).is_none());
+    assert_eq!(map.pop_back(), Some((3, 30)));
+    assert!(map.get(&3).is_none());
+}
+
+#[test]
+fn test_clear() {
+    let mut map = LinkedHashMap::new();
+    map.insert(1, 10);
+    map.insert(2, 20);
+    map.clear();
+    assert!(map.get(&1).is_none());
+    assert!(map.get(&2).is_none());
+    assert_eq!(format!("{:?}", map), "{}");
+}
+
+#[test]
+fn test_iter() {
+    let mut map = LinkedHashMap::new();
+
+    // empty iter
+    assert_eq!(None, map.iter().next());
+
+    map.insert("a", 10);
+    map.insert("b", 20);
+    map.insert("c", 30);
+
+    // regular iter
+    let mut iter = map.iter();
+    assert_eq!((&"a", &10), iter.next().unwrap());
+    assert_eq!((&"b", &20), iter.next().unwrap());
+    assert_eq!((&"c", &30), iter.next().unwrap());
+    assert_eq!(None, iter.next());
+    assert_eq!(None, iter.next());
+
+    // reversed iter
+    let mut rev_iter = map.iter().rev();
+    assert_eq!((&"c", &30), rev_iter.next().unwrap());
+    assert_eq!((&"b", &20), rev_iter.next().unwrap());
+    assert_eq!((&"a", &10), rev_iter.next().unwrap());
+    assert_eq!(None, rev_iter.next());
+    assert_eq!(None, rev_iter.next());
+
+    // mixed
+    let mut mixed_iter = map.iter();
+    assert_eq!((&"a", &10), mixed_iter.next().unwrap());
+    assert_eq!((&"c", &30), mixed_iter.next_back().unwrap());
+    assert_eq!((&"b", &20), mixed_iter.next().unwrap());
+    assert_eq!(None, mixed_iter.next());
+    assert_eq!(None, mixed_iter.next_back());
+}
+
+#[test]
+fn test_iter_mut() {
+    let mut map = LinkedHashMap::new();
+    map.insert("a", 10);
+    map.insert("c", 30);
+    map.insert("b", 20);
+
+    {
+        let mut iter = map.iter_mut();
+        let entry = iter.next().unwrap();
+        assert_eq!(&"a", entry.0);
+        *entry.1 = 17;
+
+        // reverse iterator
+        let mut iter = iter.rev();
+        let entry = iter.next().unwrap();
+        assert_eq!(&"b", entry.0);
+        *entry.1 = 23;
+
+        let entry = iter.next().unwrap();
+        assert_eq!(&"c", entry.0);
+        assert_eq!(None, iter.next());
+        assert_eq!(None, iter.next());
+    }
+
+    assert_eq!(17, map[&"a"]);
+    assert_eq!(23, map[&"b"]);
+}
+
+#[test]
+fn test_consuming_iter() {
+    let map = {
+        let mut map = LinkedHashMap::new();
+        map.insert("a", 10);
+        map.insert("c", 30);
+        map.insert("b", 20);
+        map
+    };
+
+    let mut iter = map.into_iter();
+    assert_eq!(Some(("a", 10)), iter.next());
+
+    let clone = iter.clone();
+    for iter in &mut [iter, clone] {
+        assert_eq!(Some(("b", 20)), iter.next_back());
+        assert_eq!(1, iter.len());
+        assert_eq!(Some(("c", 30)), iter.next());
+        assert_eq!(None, iter.next());
+    }
+}
+
+#[test]
+fn test_consuming_iter_empty() {
+    let map = LinkedHashMap::<&str, i32>::new();
+    let mut iter = map.into_iter();
+    assert_eq!(None, iter.next());
+    let mut clone = iter.clone();
+    assert_eq!(None, clone.next());
+}
+
+#[test]
+fn test_consuming_iter_with_free_list() {
+    let mut map = LinkedHashMap::new();
+    map.insert("a", 10);
+    map.insert("c", 30);
+    map.insert("b", 20);
+    map.remove("a");
+    map.remove("b");
+
+    let mut iter = map.into_iter();
+    assert_eq!(Some(("c", 30)), iter.next());
+    assert_eq!(None, iter.next());
+}
+
+#[test]
+fn test_into_iter_drop() {
+    struct Counter<'a>(&'a mut usize);
+
+    impl<'a> Drop for Counter<'a> {
+        fn drop(&mut self) {
+            *self.0 += 1;
+        }
+    }
+
+    let mut a = 0;
+    let mut b = 0;
+    let mut c = 0;
+
+    {
+        let mut map = LinkedHashMap::new();
+        map.insert("a", Counter(&mut a));
+        map.insert("b", Counter(&mut b));
+        map.insert("c", Counter(&mut c));
+
+        let mut iter = map.into_iter();
+        iter.next();
+        iter.next_back();
+    }
+
+    assert_eq!(a, 1);
+    assert_eq!(b, 1);
+    assert_eq!(c, 1);
+}
+
+#[test]
+fn test_borrow() {
+    #[derive(PartialEq, Eq, Hash)] struct Foo(Bar);
+    #[derive(PartialEq, Eq, Hash)] struct Bar(i32);
+
+    impl ::std::borrow::Borrow<Bar> for Foo {
+        fn borrow(&self) -> &Bar { &self.0 }
+    }
+
+    let mut map = LinkedHashMap::new();
+    map.insert(Foo(Bar(1)), "a");
+    map.insert(Foo(Bar(2)), "b");
+
+    assert!(map.contains_key(&Bar(1)));
+    assert!(map.contains_key(&Bar(2)));
+    assert!(map.contains_key(&Foo(Bar(1))));
+    assert!(map.contains_key(&Foo(Bar(2))));
+
+    assert_eq!(map.get(&Bar(1)), Some(&"a"));
+    assert_eq!(map.get(&Bar(2)), Some(&"b"));
+    assert_eq!(map.get(&Foo(Bar(1))), Some(&"a"));
+    assert_eq!(map.get(&Foo(Bar(2))), Some(&"b"));
+
+    assert_eq!(map.get_refresh(&Bar(1)), Some(&mut "a"));
+    assert_eq!(map.get_refresh(&Bar(2)), Some(&mut "b"));
+    assert_eq!(map.get_refresh(&Foo(Bar(1))), Some(&mut "a"));
+    assert_eq!(map.get_refresh(&Foo(Bar(2))), Some(&mut "b"));
+
+    assert_eq!(map.get_mut(&Bar(1)), Some(&mut "a"));
+    assert_eq!(map.get_mut(&Bar(2)), Some(&mut "b"));
+    assert_eq!(map.get_mut(&Foo(Bar(1))), Some(&mut "a"));
+    assert_eq!(map.get_mut(&Foo(Bar(2))), Some(&mut "b"));
+
+    assert_eq!(map[&Bar(1)], "a");
+    assert_eq!(map[&Bar(2)], "b");
+    assert_eq!(map[&Foo(Bar(1))], "a");
+    assert_eq!(map[&Foo(Bar(2))], "b");
+
+    assert_eq!(map.remove(&Bar(1)), Some("a"));
+    assert_eq!(map.remove(&Bar(2)), Some("b"));
+    assert_eq!(map.remove(&Foo(Bar(1))), None);
+    assert_eq!(map.remove(&Foo(Bar(2))), None);
+}
+
+#[test]
+fn test_send_sync() {
+    fn is_send_sync<T: Send + Sync>() {}
+
+    is_send_sync::<LinkedHashMap<u32, i32>>();
+    is_send_sync::<linked_hash_map::Iter<u32, i32>>();
+    is_send_sync::<linked_hash_map::IterMut<u32, i32>>();
+    is_send_sync::<linked_hash_map::IntoIter<u32, i32>>();
+    is_send_sync::<linked_hash_map::Keys<u32, i32>>();
+    is_send_sync::<linked_hash_map::Values<u32, i32>>();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"0600e977b88280afee20ce3b56e64bf240038c2e180c8b9e1e02d34f7d61a654","Cargo.toml":"0635c91ee09336945616a8cbf2a96d7d7f39aed78ec42c7d8008a60f1e6bbac7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.rst":"d7208219bafe64ad6bb4b1ffee5b43bb14002b84d0a0b41c9fce7db3352c83fe","benches/bench.rs":"9540fa56aa5ac2cf16ff78b7f9614ca1f4e231d857f7e05b994f90d5feaf9e95","benches/faststring.rs":"e230bb2d39f1de301fc82a6fd458078f7a3fdf80ead9b8db8af2831383201320","src/equivalent.rs":"4d07c0ae8c8ff405fdbb45e6c891158d3fdcfedd47001e4cec090c79b5c56564","src/lib.rs":"0112d05df2a0ea9071e4313f1c3a8ec043cad133d3377946da2f5bf66eb7e201","src/macros.rs":"0ff93b574d8d441d3235cc76d9d142a13b2e9a9e4ce8313b7eaa0476380a4379","src/mutable_keys.rs":"29d372733ab270eb2da22c2702d12ec603c66430cb809adbeddb8ec7110749fc","src/serde.rs":"bc1f91dab9edf627c98815896b1be76e3ebc4360be0684d8f5e4ac21090b3b7a","src/set.rs":"21607e53e6aafa8fd3e34166fe034f7a76c02708fe5a2ce8c7f2c2100e60d215","src/util.rs":"331f80b48387878caa01ab9cfd43927ea0c15129c6beb755d6b40abc6ada900f","tests/equivalent_trait.rs":"3f48a3e1e0df163db99249ce1d4b7654904371e4cac996a71e36b74569df11f9","tests/quick.rs":"1b18d947ffa731417c808fe1cd469fd0d1df65b0c5f28936d6c9347772f52d3a","tests/serde.rs":"b67153585905357ea190a4f2692aef93479f501a00501521335d91cbcbe35a04","tests/tests.rs":"bc72e84efc79f47bbb17c1cb594c5290290691051ee298942a1911a55d3b94f1"},"package":"a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/.travis.yml
@@ -0,0 +1,22 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: 1.18.0
+    - rust: stable
+      env:
+       - FEATURES='serde-1'
+    - rust: beta
+    - rust: nightly
+    - rust: nightly
+      env:
+       - FEATURES='test_low_transition_point'
+branches:
+  only:
+    - master
+script:
+  - |
+      cargo build --verbose --features "$FEATURES" &&
+      cargo test --verbose --features "$FEATURES" &&
+      cargo test --release --verbose --features "$FEATURES" &&
+      cargo doc --verbose --features "$FEATURES"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/Cargo.toml
@@ -0,0 +1,58 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "ordermap"
+version = "0.3.5"
+authors = ["bluss"]
+description = "A hash table with consistent order and fast iteration."
+documentation = "https://docs.rs/ordermap/"
+keywords = ["hashmap"]
+categories = ["data-structures"]
+license = "Apache-2.0/MIT"
+repository = "https://github.com/bluss/ordermap"
+[package.metadata.docs.rs]
+features = ["serde-1"]
+
+[package.metadata.release]
+no-dev-version = true
+[profile.bench]
+debug = true
+
+[lib]
+bench = false
+[dependencies.serde]
+version = "1.0"
+optional = true
+[dev-dependencies.fnv]
+version = "1.0"
+
+[dev-dependencies.itertools]
+version = "0.7.0"
+
+[dev-dependencies.lazy_static]
+version = "1"
+
+[dev-dependencies.quickcheck]
+version = "0.6"
+default-features = false
+
+[dev-dependencies.rand]
+version = "0.4"
+
+[dev-dependencies.serde_test]
+version = "1.0.5"
+
+[features]
+serde-1 = ["serde"]
+test_debug = []
+test_low_transition_point = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016--2017
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/README.rst
@@ -0,0 +1,226 @@
+
+Awesome hash table implementation in just Rust (stable, no unsafe code).
+
+Please read the `API documentation here`__
+
+__ https://docs.rs/ordermap/
+
+|build_status|_ |crates|_
+
+.. |crates| image:: https://img.shields.io/crates/v/ordermap.svg
+.. _crates: https://crates.io/crates/ordermap
+
+.. |build_status| image:: https://travis-ci.org/bluss/ordermap.svg
+.. _build_status: https://travis-ci.org/bluss/ordermap
+
+
+Background
+==========
+
+This was inspired by Python 3.6's new dict implementation (which remembers
+the insertion order and is fast to iterate, and is compact in memory).
+
+Some of those features were translated to Rust, and some were not. The result
+was ordermap, a hash table that has following properties:
+
+- Order is **independent of hash function** and hash values of keys.
+- Fast to iterate.
+- Indexed in compact space.
+- Preserves insertion order **as long** as you don't call ``.remove()``.
+- Uses robin hood hashing just like Rust's libstd ``HashMap``.
+
+  - It's the usual backwards shift deletion, but only on the index vector, so
+    it's cheaper because it's moving less memory around.
+
+Does not implement (Yet)
+------------------------
+
+- ``.reserve()`` exists but does not have a complete implementation
+
+Performance
+-----------
+
+``OrderMap`` derives a couple of performance facts directly from how it is constructed,
+which is roughly:
+
+  Two vectors, the first, sparse, with hashes and key-value indices, and the
+  second, dense, the key-value pairs.
+
+- Iteration is very fast since it is on the dense key-values.
+- Removal is fast since it moves memory areas only in the first vector,
+  and uses a single swap in the second vector.
+- Lookup is fast-ish because the hashes and indices are densely stored.
+  Lookup also is slow-ish since hashes and key-value pairs are stored in
+  separate places. (Visible when cpu caches size is limiting.)
+
+- In practice, ``OrderMap`` has been tested out as the hashmap in rustc in PR45282_ and
+  the performance was roughly on par across the whole workload. 
+- If you want the properties of ``OrderMap``, or its strongest performance points
+  fits your workload, it might be the best hash table implementation.
+
+.. _PR45282: https://github.com/rust-lang/rust/pull/45282
+
+Interesting Features
+--------------------
+
+- Insertion order is preserved (``.swap_remove()`` perturbs the order, like the method name says).
+- Implements ``.pop() -> Option<(K, V)>`` in O(1) time.
+- ``OrderMap::new()`` is empty and uses no allocation until you insert something.
+- Lookup key-value pairs by index and vice versa.
+- No ``unsafe``.
+- Supports ``IndexMut``.
+
+
+Where to go from here?
+----------------------
+
+- Ideas and PRs for how to implement insertion-order preserving remove (for example tombstones)
+  are welcome. The plan is to split the crate into two hash table implementations
+  a) the current compact index space version and b) the full insertion order version.
+
+
+Ideas that we already did
+-------------------------
+
+- It can be an *indexable* ordered map in the current fashion
+  (This was implemented in 0.2.0, for potential use as a graph datastructure).
+
+- Idea for more cache efficient lookup (This was implemented in 0.1.2).
+
+  Current ``indices: Vec<Pos>``. ``Pos`` is interpreted as ``(u32, u32)`` more
+  or less when ``.raw_capacity()`` fits in 32 bits. ``Pos`` then stores both the lower
+  half of the hash and the entry index.
+  This means that the hash values in ``Bucket`` don't need to be accessed
+  while scanning for an entry.
+
+
+Recent Changes
+==============
+
+- 0.3.5
+
+  - Documentation improvements
+
+- 0.3.4
+
+  - The ``.retain()`` methods for ``OrderMap`` and ``OrderSet`` now
+    traverse the elements in order, and the retained elements **keep their order**
+  - Added new methods ``.sort_by()``, ``.sort_keys()`` to ``OrderMap`` and
+    ``.sort_by()``, ``.sort()`` to ``OrderSet``. These methods allow you to
+    sort the maps in place efficiently.
+
+- 0.3.3
+
+  - Document insertion behaviour better by @lucab
+  - Updated dependences (no feature changes) by @ignatenkobrain
+
+- 0.3.2
+
+  - Add ``OrderSet`` by @cuviper!
+  - ``OrderMap::drain`` is now (too) a double ended iterator.
+
+- 0.3.1
+
+  - In all ordermap iterators, forward the ``collect`` method to the underlying
+    iterator as well.
+  - Add crates.io categories.
+
+- 0.3.0
+
+  - The methods ``get_pair``, ``get_pair_index`` were both replaced by
+    ``get_full`` (and the same for the mutable case).
+  - Method ``swap_remove_pair`` replaced by ``swap_remove_full``.
+  - Add trait ``MutableKeys`` for opt-in mutable key access. Mutable key access
+    is only possible through the methods of this extension trait.
+  - Add new trait ``Equivalent`` for key equivalence. This extends the
+    ``Borrow`` trait mechanism for ``OrderMap::get`` in a backwards compatible
+    way, just some minor type inference related issues may become apparent.
+    See `#10`__ for more information.
+  - Implement ``Extend<(&K, &V)>`` by @xfix.
+
+__ https://github.com/bluss/ordermap/pull/10
+
+- 0.2.13
+
+  - Fix deserialization to support custom hashers by @Techcable.
+  - Add methods ``.index()`` on the entry types by @garro95.
+
+- 0.2.12
+
+  - Add methods ``.with_hasher()``, ``.hasher()``.
+
+- 0.2.11
+
+  - Support ``ExactSizeIterator`` for the iterators. By @Binero.
+  - Use ``Box<[Pos]>`` internally, saving a word in the ``OrderMap`` struct.
+  - Serde support, with crate feature ``"serde-1"``. By @xfix.
+
+- 0.2.10
+
+  - Add iterator ``.drain(..)`` by @stevej.
+
+- 0.2.9
+
+  - Add method ``.is_empty()`` by @overvenus.
+  - Implement ``PartialEq, Eq`` by @overvenus.
+  - Add method ``.sorted_by()``.
+
+- 0.2.8
+
+  - Add iterators ``.values()`` and ``.values_mut()``.
+  - Fix compatibility with 32-bit platforms.
+
+- 0.2.7
+
+  - Add ``.retain()``.
+
+- 0.2.6
+
+  - Add ``OccupiedEntry::remove_entry`` and other minor entry methods,
+    so that it now has all the features of ``HashMap``'s entries.
+
+- 0.2.5
+
+  - Improved ``.pop()`` slightly.
+
+- 0.2.4
+
+  - Improved performance of ``.insert()`` (`#3`__) by @pczarn.
+
+__ https://github.com/bluss/ordermap/pull/3
+
+- 0.2.3
+
+  - Generalize ``Entry`` for now, so that it works on hashmaps with non-default
+    hasher. However, there's a lingering compat issue since libstd ``HashMap``
+    does not parameterize its entries by the hasher (``S`` typarm).
+  - Special case some iterator methods like ``.nth()``.
+
+- 0.2.2
+
+  - Disable the verbose ``Debug`` impl by default.
+
+- 0.2.1
+
+  - Fix doc links and clarify docs.
+
+- 0.2.0
+
+  - Add more ``HashMap`` methods & compat with its API.
+  - Experimental support for ``.entry()`` (the simplest parts of the API).
+  - Add ``.reserve()`` (placeholder impl).
+  - Add ``.remove()`` as synonym for ``.swap_remove()``.
+  - Changed ``.insert()`` to swap value if the entry already exists, and
+    return ``Option``.
+  - Experimental support as an *indexed* hash map! Added methods
+    ``.get_index()``, ``.get_index_mut()``, ``.swap_remove_index()``,
+    ``.get_pair_index()``, ``.get_pair_index_mut()``.
+
+- 0.1.2
+
+  - Implement the 32/32 split idea for ``Pos`` which improves cache utilization
+    and lookup performance.
+
+- 0.1.1
+
+  - Initial release.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/benches/bench.rs
@@ -0,0 +1,745 @@
+#![feature(test)]
+extern crate test;
+extern crate rand;
+extern crate fnv;
+#[macro_use]
+extern crate lazy_static;
+
+use std::hash::Hash;
+use fnv::FnvHasher;
+use std::hash::BuildHasherDefault;
+type FnvBuilder = BuildHasherDefault<FnvHasher>;
+
+use test::Bencher;
+use test::black_box;
+
+extern crate ordermap;
+
+use ordermap::OrderMap;
+
+use std::collections::HashMap;
+use std::iter::FromIterator;
+
+use rand::{weak_rng, Rng};
+
+#[bench]
+fn new_hashmap(b: &mut Bencher) {
+    b.iter(|| {
+        HashMap::<String, String>::new()
+    });
+}
+
+#[bench]
+fn new_orderedmap(b: &mut Bencher) {
+    b.iter(|| {
+        OrderMap::<String, String>::new()
+    });
+}
+
+#[bench]
+fn with_capacity_10e5_hashmap(b: &mut Bencher) {
+    b.iter(|| {
+        HashMap::<String, String>::with_capacity(10_000)
+    });
+}
+
+#[bench]
+fn with_capacity_10e5_orderedmap(b: &mut Bencher) {
+    b.iter(|| {
+        OrderMap::<String, String>::with_capacity(10_000)
+    });
+}
+
+#[bench]
+fn insert_hashmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_string_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x.to_string(), ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_string_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x.to_string(), ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_str_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let ss = Vec::from_iter((0..c).map(|x| x.to_string()));
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for key in &ss {
+            map.insert(&key[..], ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_str_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let ss = Vec::from_iter((0..c).map(|x| x.to_string()));
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for key in &ss {
+            map.insert(&key[..], ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_int_bigvalue_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let value = [0u64; 10];
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for i in 0..c {
+            map.insert(i, value);
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_int_bigvalue_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let value = [0u64; 10];
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for i in 0..c {
+            map.insert(i, value);
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_100_000(b: &mut Bencher) {
+    let c = 100_000;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_100_000(b: &mut Bencher) {
+    let c = 100_000;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_150(b: &mut Bencher) {
+    let c = 150;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_150(b: &mut Bencher) {
+    let c = 150;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x, ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn entry_hashmap_150(b: &mut Bencher) {
+    let c = 150;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.entry(x).or_insert(());
+        }
+        map
+    });
+}
+
+#[bench]
+fn entry_orderedmap_150(b: &mut Bencher) {
+    let c = 150;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.entry(x).or_insert(());
+        }
+        map
+    });
+}
+
+#[bench]
+fn iter_sum_hashmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let len = c - c/10;
+    for x in 0..len {
+        map.insert(x, ());
+    }
+    assert_eq!(map.len(), len);
+    b.iter(|| {
+        map.keys().sum::<usize>()
+    });
+}
+
+#[bench]
+fn iter_sum_orderedmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let len = c - c/10;
+    for x in 0..len {
+        map.insert(x, ());
+    }
+    assert_eq!(map.len(), len);
+    b.iter(|| {
+        map.keys().sum::<usize>()
+    });
+}
+
+#[bench]
+fn iter_black_box_hashmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let len = c - c/10;
+    for x in 0..len {
+        map.insert(x, ());
+    }
+    assert_eq!(map.len(), len);
+    b.iter(|| {
+        for &key in map.keys() {
+            black_box(key);
+        }
+    });
+}
+
+#[bench]
+fn iter_black_box_orderedmap_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let len = c - c/10;
+    for x in 0..len {
+        map.insert(x, ());
+    }
+    assert_eq!(map.len(), len);
+    b.iter(|| {
+        for &key in map.keys() {
+            black_box(key);
+        }
+    });
+}
+
+fn shuffled_keys<I>(iter: I) -> Vec<I::Item>
+    where I: IntoIterator
+{
+    let mut v = Vec::from_iter(iter);
+    let mut rng = weak_rng();
+    rng.shuffle(&mut v);
+    v
+}
+
+#[bench]
+fn lookup_hashmap_10_000_exist(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key, 1);
+    }
+    b.iter(|| {
+        let mut found = 0;
+        for key in 5000..c {
+            found += map.get(&key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_hashmap_10_000_noexist(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key, 1);
+    }
+    b.iter(|| {
+        let mut found = 0;
+        for key in c..15000 {
+            found += map.get(&key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_orderedmap_10_000_exist(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key, 1);
+    }
+    b.iter(|| {
+        let mut found = 0;
+        for key in 5000..c {
+            found += map.get(&key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_orderedmap_10_000_noexist(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key, 1);
+    }
+    b.iter(|| {
+        let mut found = 0;
+        for key in c..15000 {
+            found += map.get(&key).is_some() as i32;
+        }
+        found
+    });
+}
+
+// number of items to look up
+const LOOKUP_MAP_SIZE: u32 = 100_000_u32;
+const LOOKUP_SAMPLE_SIZE: u32 = 5000;
+const SORT_MAP_SIZE: usize = 10_000;
+
+
+// use lazy_static so that comparison benchmarks use the exact same inputs
+lazy_static! {
+    static ref KEYS: Vec<u32> = {
+        shuffled_keys(0..LOOKUP_MAP_SIZE)
+    };
+}
+
+lazy_static! {
+    static ref HMAP_100K: HashMap<u32, u32> = {
+        let c = LOOKUP_MAP_SIZE;
+        let mut map = HashMap::with_capacity(c as usize);
+        let keys = &*KEYS;
+        for &key in keys {
+            map.insert(key, key);
+        }
+        map
+    };
+}
+
+lazy_static! {
+    static ref OMAP_100K: OrderMap<u32, u32> = {
+        let c = LOOKUP_MAP_SIZE;
+        let mut map = OrderMap::with_capacity(c as usize);
+        let keys = &*KEYS;
+        for &key in keys {
+            map.insert(key, key);
+        }
+        map
+    };
+}
+
+lazy_static! {
+    static ref OMAP_SORT_U32: OrderMap<u32, u32> = {
+        let mut map = OrderMap::with_capacity(SORT_MAP_SIZE);
+        for &key in &KEYS[..SORT_MAP_SIZE] {
+            map.insert(key, key);
+        }
+        map
+    };
+}
+lazy_static! {
+    static ref OMAP_SORT_S: OrderMap<String, String> = {
+        let mut map = OrderMap::with_capacity(SORT_MAP_SIZE);
+        for &key in &KEYS[..SORT_MAP_SIZE] {
+            map.insert(format!("{:^16x}", &key), String::new());
+        }
+        map
+    };
+}
+
+#[bench]
+fn lookup_hashmap_100_000_multi(b: &mut Bencher) {
+    let map = &*HMAP_100K;
+    b.iter(|| {
+        let mut found = 0;
+        for key in 0..LOOKUP_SAMPLE_SIZE {
+            found += map.get(&key).is_some() as u32;
+        }
+        found
+    });
+}
+
+
+#[bench]
+fn lookup_ordermap_100_000_multi(b: &mut Bencher) {
+    let map = &*OMAP_100K;
+    b.iter(|| {
+        let mut found = 0;
+        for key in 0..LOOKUP_SAMPLE_SIZE {
+            found += map.get(&key).is_some() as u32;
+        }
+        found
+    });
+}
+
+// inorder: Test looking up keys in the same order as they were inserted
+#[bench]
+fn lookup_hashmap_100_000_inorder_multi(b: &mut Bencher) {
+    let map = &*HMAP_100K;
+    let keys = &*KEYS;
+    b.iter(|| {
+        let mut found = 0;
+        for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] {
+            found += map.get(key).is_some() as u32;
+        }
+        found
+    });
+}
+
+
+#[bench]
+fn lookup_ordermap_100_000_inorder_multi(b: &mut Bencher) {
+    let map = &*OMAP_100K;
+    let keys = &*KEYS;
+    b.iter(|| {
+        let mut found = 0;
+        for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] {
+            found += map.get(key).is_some() as u32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_hashmap_100_000_single(b: &mut Bencher) {
+    let map = &*HMAP_100K;
+    let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle();
+    b.iter(|| {
+        let key = iter.next().unwrap();
+        map.get(&key).is_some()
+    });
+}
+
+
+#[bench]
+fn lookup_ordermap_100_000_single(b: &mut Bencher) {
+    let map = &*OMAP_100K;
+    let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle();
+    b.iter(|| {
+        let key = iter.next().unwrap();
+        map.get(&key).is_some()
+    });
+}
+
+const GROW_SIZE: usize = 100_000;
+type GrowKey = u32;
+
+// Test grow/resize without preallocation
+#[bench]
+fn grow_fnv_hashmap_100_000(b: &mut Bencher) {
+    b.iter(|| {
+        let mut map: HashMap<_, _, FnvBuilder> = HashMap::default();
+        for x in 0..GROW_SIZE {
+            map.insert(x as GrowKey, x as GrowKey);
+        }
+        map
+    });
+}
+
+#[bench]
+fn grow_fnv_ordermap_100_000(b: &mut Bencher) {
+    b.iter(|| {
+        let mut map: OrderMap<_, _, FnvBuilder> = OrderMap::default();
+        for x in 0..GROW_SIZE {
+            map.insert(x as GrowKey, x as GrowKey);
+        }
+        map
+    });
+}
+
+
+const MERGE: u64 = 10_000;
+#[bench]
+fn hashmap_merge_simple(b: &mut Bencher) {
+    let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
+    let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
+    b.iter(|| {
+        let mut merged = first_map.clone();
+        merged.extend(second_map.iter().map(|(&k, &v)| (k, v)));
+        merged
+    });
+}
+
+#[bench]
+fn hashmap_merge_shuffle(b: &mut Bencher) {
+    let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
+    let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
+    let mut v = Vec::new();
+    let mut rng = weak_rng();
+    b.iter(|| {
+        let mut merged = first_map.clone();
+        v.extend(second_map.iter().map(|(&k, &v)| (k, v)));
+        rng.shuffle(&mut v);
+        merged.extend(v.drain(..));
+
+        merged
+    });
+}
+
+#[bench]
+fn ordermap_merge_simple(b: &mut Bencher) {
+    let first_map: OrderMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
+    let second_map: OrderMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
+    b.iter(|| {
+        let mut merged = first_map.clone();
+        merged.extend(second_map.iter().map(|(&k, &v)| (k, v)));
+        merged
+    });
+}
+
+#[bench]
+fn ordermap_merge_shuffle(b: &mut Bencher) {
+    let first_map: OrderMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
+    let second_map: OrderMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
+    let mut v = Vec::new();
+    let mut rng = weak_rng();
+    b.iter(|| {
+        let mut merged = first_map.clone();
+        v.extend(second_map.iter().map(|(&k, &v)| (k, v)));
+        rng.shuffle(&mut v);
+        merged.extend(v.drain(..));
+
+        merged
+    });
+}
+
+#[bench]
+fn remove_ordermap_100_000(b: &mut Bencher) {
+    let map = OMAP_100K.clone();
+    let mut keys = Vec::from_iter(map.keys().cloned());
+    weak_rng().shuffle(&mut keys);
+
+    b.iter(|| {
+        let mut map = map.clone();
+        for key in &keys {
+            map.remove(key).is_some();
+        }
+        assert_eq!(map.len(), 0);
+        map
+    });
+}
+
+#[bench]
+fn pop_ordermap_100_000(b: &mut Bencher) {
+    let map = OMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        while map.len() > 0 {
+            map.pop();
+        }
+        assert_eq!(map.len(), 0);
+        map
+    });
+}
+
+#[bench]
+fn few_retain_ordermap_100_000(b: &mut Bencher) {
+    let map = OMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 7 == 0);
+        map
+    });
+}
+
+#[bench]
+fn few_retain_hashmap_100_000(b: &mut Bencher) {
+    let map = HMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 7 == 0);
+        map
+    });
+}
+
+#[bench]
+fn half_retain_ordermap_100_000(b: &mut Bencher) {
+    let map = OMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 2 == 0);
+        map
+    });
+}
+
+#[bench]
+fn half_retain_hashmap_100_000(b: &mut Bencher) {
+    let map = HMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 2 == 0);
+        map
+    });
+}
+
+#[bench]
+fn many_retain_ordermap_100_000(b: &mut Bencher) {
+    let map = OMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 100 != 0);
+        map
+    });
+}
+
+#[bench]
+fn many_retain_hashmap_100_000(b: &mut Bencher) {
+    let map = HMAP_100K.clone();
+
+    b.iter(|| {
+        let mut map = map.clone();
+        map.retain(|k, _| *k % 100 != 0);
+        map
+    });
+}
+
+
+// simple sort impl for comparison
+pub fn simple_sort<K: Ord + Hash, V>(m: &mut OrderMap<K, V>) {
+    let mut ordered: Vec<_> = m.drain(..).collect();
+    ordered.sort_by(|left, right| left.0.cmp(&right.0));
+    m.extend(ordered);
+}
+
+
+#[bench]
+fn ordermap_sort_s(b: &mut Bencher) {
+    let map = OMAP_SORT_S.clone();
+
+    // there's a map clone there, but it's still useful to profile this
+    b.iter(|| {
+        let mut map = map.clone();
+        map.sort_keys();
+        map
+    });
+}
+
+#[bench]
+fn ordermap_simple_sort_s(b: &mut Bencher) {
+    let map = OMAP_SORT_S.clone();
+
+    // there's a map clone there, but it's still useful to profile this
+    b.iter(|| {
+        let mut map = map.clone();
+        simple_sort(&mut map);
+        map
+    });
+}
+
+#[bench]
+fn ordermap_sort_u32(b: &mut Bencher) {
+    let map = OMAP_SORT_U32.clone();
+
+    // there's a map clone there, but it's still useful to profile this
+    b.iter(|| {
+        let mut map = map.clone();
+        map.sort_keys();
+        map
+    });
+}
+
+#[bench]
+fn ordermap_simple_sort_u32(b: &mut Bencher) {
+    let map = OMAP_SORT_U32.clone();
+
+    // there's a map clone there, but it's still useful to profile this
+    b.iter(|| {
+        let mut map = map.clone();
+        simple_sort(&mut map);
+        map
+    });
+}
+
+// measure the fixed overhead of cloning in sort benchmarks
+#[bench]
+fn ordermap_clone_for_sort_s(b: &mut Bencher) {
+    let map = OMAP_SORT_S.clone();
+
+    b.iter(|| {
+        map.clone()
+    });
+}
+
+#[bench]
+fn ordermap_clone_for_sort_u32(b: &mut Bencher) {
+    let map = OMAP_SORT_U32.clone();
+
+    b.iter(|| {
+        map.clone()
+    });
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/benches/faststring.rs
@@ -0,0 +1,183 @@
+#![feature(test)]
+extern crate test;
+extern crate rand;
+extern crate lazy_static;
+
+use test::Bencher;
+
+extern crate ordermap;
+
+use ordermap::OrderMap;
+
+use std::collections::HashMap;
+use std::iter::FromIterator;
+
+use rand::{weak_rng, Rng};
+
+use std::hash::{Hash, Hasher};
+
+use std::borrow::Borrow;
+use std::ops::Deref;
+use std::mem;
+
+#[derive(PartialEq, Eq, Copy, Clone)]
+pub struct OneShot<T: ?Sized>(pub T);
+
+impl Hash for OneShot<str>
+{
+    fn hash<H: Hasher>(&self, h: &mut H) {
+        h.write(self.0.as_bytes())
+    }
+}
+
+impl<'a, S> From<&'a S> for &'a OneShot<str>
+    where S: AsRef<str>
+{
+    fn from(s: &'a S) -> Self {
+        let s: &str = s.as_ref();
+        unsafe {
+            mem::transmute(s)
+        }
+    }
+}
+
+impl Hash for OneShot<String>
+{
+    fn hash<H: Hasher>(&self, h: &mut H) {
+        h.write(self.0.as_bytes())
+    }
+}
+
+impl Borrow<OneShot<str>> for OneShot<String>
+{
+    fn borrow(&self) -> &OneShot<str> {
+        <&OneShot<str>>::from(&self.0)
+    }
+}
+
+impl<T> Deref for OneShot<T>
+{
+    type Target = T;
+    fn deref(&self) -> &T {
+        &self.0
+    }
+}
+
+
+fn shuffled_keys<I>(iter: I) -> Vec<I::Item>
+    where I: IntoIterator
+{
+    let mut v = Vec::from_iter(iter);
+    let mut rng = weak_rng();
+    rng.shuffle(&mut v);
+    v
+}
+
+
+#[bench]
+fn insert_hashmap_string_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x.to_string(), ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_hashmap_string_oneshot_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = HashMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(OneShot(x.to_string()), ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn insert_orderedmap_string_10_000(b: &mut Bencher) {
+    let c = 10_000;
+    b.iter(|| {
+        let mut map = OrderMap::with_capacity(c);
+        for x in 0..c {
+            map.insert(x.to_string(), ());
+        }
+        map
+    });
+}
+
+#[bench]
+fn lookup_hashmap_10_000_exist_string(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key.to_string(), 1);
+    }
+    let lookups = (5000..c).map(|x| x.to_string()).collect::<Vec<_>>();
+    b.iter(|| {
+        let mut found = 0;
+        for key in &lookups {
+            found += map.get(key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_hashmap_10_000_exist_string_oneshot(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = HashMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(OneShot(key.to_string()), 1);
+    }
+    let lookups = (5000..c).map(|x| OneShot(x.to_string())).collect::<Vec<_>>();
+    b.iter(|| {
+        let mut found = 0;
+        for key in &lookups {
+            found += map.get(key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_ordermap_10_000_exist_string(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(key.to_string(), 1);
+    }
+    let lookups = (5000..c).map(|x| x.to_string()).collect::<Vec<_>>();
+    b.iter(|| {
+        let mut found = 0;
+        for key in &lookups {
+            found += map.get(key).is_some() as i32;
+        }
+        found
+    });
+}
+
+#[bench]
+fn lookup_ordermap_10_000_exist_string_oneshot(b: &mut Bencher) {
+    let c = 10_000;
+    let mut map = OrderMap::with_capacity(c);
+    let keys = shuffled_keys(0..c);
+    for &key in &keys {
+        map.insert(OneShot(key.to_string()), 1);
+    }
+    let lookups = (5000..c).map(|x| OneShot(x.to_string())).collect::<Vec<_>>();
+    b.iter(|| {
+        let mut found = 0;
+        for key in &lookups {
+            found += map.get(key).is_some() as i32;
+        }
+        found
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/equivalent.rs
@@ -0,0 +1,27 @@
+
+use std::borrow::Borrow;
+
+/// Key equivalence trait.
+///
+/// This trait allows hash table lookup to be customized.
+/// It has one blanket implementation that uses the regular `Borrow` solution,
+/// just like `HashMap` and `BTreeMap` do, so that you can pass `&str` to lookup
+/// into a map with `String` keys and so on.
+///
+/// # Contract
+///
+/// The implementor **must** hash like `K`, if it is hashable.
+pub trait Equivalent<K: ?Sized> {
+    /// Compare self to `key` and return `true` if they are equal.
+    fn equivalent(&self, key: &K) -> bool;
+}
+
+impl<Q: ?Sized, K: ?Sized> Equivalent<K> for Q
+    where Q: Eq,
+          K: Borrow<Q>,
+{
+    #[inline]
+    fn equivalent(&self, key: &K) -> bool {
+        *self == *key.borrow()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/lib.rs
@@ -0,0 +1,1877 @@
+
+#![deny(unsafe_code)]
+#![doc(html_root_url = "https://docs.rs/ordermap/0.3/")]
+
+//! [`OrderMap`] is a hash table where the iteration order of the key-value
+//! pairs is independent of the hash values of the keys.
+//!
+//! [`OrderMap`]: struct.OrderMap.html
+
+#[macro_use]
+mod macros;
+#[cfg(feature = "serde-1")]
+mod serde;
+mod util;
+mod equivalent;
+mod mutable_keys;
+
+pub mod set;
+
+use std::hash::Hash;
+use std::hash::BuildHasher;
+use std::hash::Hasher;
+use std::iter::FromIterator;
+use std::collections::hash_map::RandomState;
+use std::ops::RangeFull;
+
+use std::cmp::{max, Ordering};
+use std::fmt;
+use std::mem::{replace};
+use std::marker::PhantomData;
+
+use util::{third, ptrdistance, enumerate};
+pub use equivalent::Equivalent;
+pub use mutable_keys::MutableKeys;
+pub use set::OrderSet;
+
+fn hash_elem_using<B: BuildHasher, K: ?Sized + Hash>(build: &B, k: &K) -> HashValue {
+    let mut h = build.build_hasher();
+    k.hash(&mut h);
+    HashValue(h.finish() as usize)
+}
+
+/// Hash value newtype. Not larger than usize, since anything larger
+/// isn't used for selecting position anyway.
+#[derive(Copy, Debug)]
+struct HashValue(usize);
+
+impl HashValue {
+    #[inline(always)]
+    fn get(self) -> usize { self.0 }
+}
+
+impl Clone for HashValue {
+    #[inline]
+    fn clone(&self) -> Self { *self }
+}
+impl PartialEq for HashValue {
+    #[inline]
+    fn eq(&self, rhs: &Self) -> bool {
+        self.0 == rhs.0
+    }
+}
+
+/// A possibly truncated hash value.
+///
+#[derive(Debug)]
+struct ShortHash<Sz>(usize, PhantomData<Sz>);
+
+impl<Sz> ShortHash<Sz> {
+    /// Pretend this is a full HashValue, which
+    /// is completely ok w.r.t determining bucket index
+    ///
+    /// - Sz = u32: 32-bit hash is enough to select bucket index
+    /// - Sz = u64: hash is not truncated
+    fn into_hash(self) -> HashValue {
+        HashValue(self.0)
+    }
+}
+
+impl<Sz> Copy for ShortHash<Sz> { }
+impl<Sz> Clone for ShortHash<Sz> {
+    #[inline]
+    fn clone(&self) -> Self { *self }
+}
+
+impl<Sz> PartialEq for ShortHash<Sz> {
+    #[inline]
+    fn eq(&self, rhs: &Self) -> bool {
+        self.0 == rhs.0
+    }
+}
+
+// Compare ShortHash == HashValue by truncating appropriately
+// if applicable before the comparison
+impl<Sz> PartialEq<HashValue> for ShortHash<Sz> where Sz: Size {
+    #[inline]
+    fn eq(&self, rhs: &HashValue) -> bool {
+        if Sz::is_64_bit() {
+            self.0 == rhs.0
+        } else {
+            lo32(self.0 as u64) == lo32(rhs.0 as u64)
+        }
+    }
+}
+impl<Sz> From<ShortHash<Sz>> for HashValue {
+    fn from(x: ShortHash<Sz>) -> Self { HashValue(x.0) }
+}
+
+/// `Pos` is stored in the `indices` array and it points to the index of a
+/// `Bucket` in self.entries.
+///
+/// Pos can be interpreted either as a 64-bit index, or as a 32-bit index and
+/// a 32-bit hash.
+///
+/// Storing the truncated hash next to the index saves loading the hash from the
+/// entry, increasing the cache efficiency.
+///
+/// Note that the lower 32 bits of the hash is enough to compute desired
+/// position and probe distance in a hash map with less than 2**32 buckets.
+///
+/// The OrderMap will simply query its **current raw capacity** to see what its
+/// current size class is, and dispatch to the 32-bit or 64-bit lookup code as
+/// appropriate. Only the growth code needs some extra logic to handle the
+/// transition from one class to another
+#[derive(Copy)]
+struct Pos {
+    index: u64,
+}
+
+impl Clone for Pos {
+    #[inline(always)]
+    fn clone(&self) -> Self { *self }
+}
+
+impl fmt::Debug for Pos {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.pos() {
+            Some(i) => write!(f, "Pos({} / {:x})", i, self.index),
+            None => write!(f, "Pos(None)"),
+        }
+    }
+}
+
+impl Pos {
+    #[inline]
+    fn none() -> Self { Pos { index: !0 } }
+
+    #[inline]
+    fn is_none(&self) -> bool { self.index == !0 }
+
+    /// Return the index part of the Pos value inside `Some(_)` if the position
+    /// is not none, otherwise return `None`.
+    #[inline]
+    fn pos(&self) -> Option<usize> {
+        if self.index == !0 { None } else { Some(lo32(self.index as u64)) }
+    }
+
+    /// Set the index part of the Pos value to `i`
+    #[inline]
+    fn set_pos<Sz>(&mut self, i: usize)
+        where Sz: Size,
+    {
+        debug_assert!(!self.is_none());
+        if Sz::is_64_bit() {
+            self.index = i as u64;
+        } else {
+            self.index = i as u64 | ((self.index >> 32) << 32)
+        }
+    }
+
+    #[inline]
+    fn with_hash<Sz>(i: usize, hash: HashValue) -> Self
+        where Sz: Size
+    {
+        if Sz::is_64_bit() {
+            Pos {
+                index: i as u64,
+            }
+        } else {
+            Pos {
+                index: i as u64 | ((hash.0 as u64) << 32)
+            }
+        }
+    }
+
+    /// “Resolve” the Pos into a combination of its index value and
+    /// a proxy value to the hash (whether it contains the hash or not
+    /// depends on the size class of the hash map).
+    #[inline]
+    fn resolve<Sz>(&self) -> Option<(usize, ShortHashProxy<Sz>)>
+        where Sz: Size
+    {
+        if Sz::is_64_bit() {
+            if !self.is_none() {
+                Some((self.index as usize, ShortHashProxy::new(0)))
+            } else {
+                None
+            }
+        } else {
+            if !self.is_none() {
+                let (i, hash) = split_lo_hi(self.index);
+                Some((i as usize, ShortHashProxy::new(hash as usize)))
+            } else {
+                None
+            }
+        }
+    }
+
+    /// Like resolve, but the Pos **must** be non-none. Return its index.
+    #[inline]
+    fn resolve_existing_index<Sz>(&self) -> usize 
+        where Sz: Size
+    {
+        debug_assert!(!self.is_none(), "datastructure inconsistent: none where valid Pos expected");
+        if Sz::is_64_bit() {
+            self.index as usize
+        } else {
+            let (i, _) = split_lo_hi(self.index);
+            i as usize
+        }
+    }
+
+}
+
+#[inline]
+fn lo32(x: u64) -> usize { (x & 0xFFFF_FFFF) as usize }
+
+// split into low, hi parts
+#[inline]
+fn split_lo_hi(x: u64) -> (u32, u32) { (x as u32, (x >> 32) as u32) }
+
+// Possibly contains the truncated hash value for an entry, depending on
+// the size class.
+struct ShortHashProxy<Sz>(usize, PhantomData<Sz>);
+
+impl<Sz> ShortHashProxy<Sz>
+    where Sz: Size
+{
+    fn new(x: usize) -> Self {
+        ShortHashProxy(x, PhantomData)
+    }
+
+    /// Get the hash from either `self` or from a lookup into `entries`,
+    /// depending on `Sz`.
+    fn get_short_hash<K, V>(&self, entries: &[Bucket<K, V>], index: usize) -> ShortHash<Sz> {
+        if Sz::is_64_bit() {
+            ShortHash(entries[index].hash.0, PhantomData)
+        } else {
+            ShortHash(self.0, PhantomData)
+        }
+    }
+}
+
+/// A hash table where the iteration order of the key-value pairs is independent
+/// of the hash values of the keys.
+///
+/// The interface is closely compatible with the standard `HashMap`, but also
+/// has additional features.
+///
+/// # Order
+///
+/// The key-value pairs have a consistent order that is determined by
+/// the sequence of insertion and removal calls on the map. The order does
+/// not depend on the keys or the hash function at all.
+///
+/// All iterators traverse the map in *the order*.
+///
+/// # Indices
+///
+/// The key-value pairs are indexed in a compact range without holes in the
+/// range `0..self.len()`. For example, the method `.get_full` looks up the
+/// index for a key, and the method `.get_index` looks up the key-value pair by
+/// index.
+///
+/// # Examples
+///
+/// ```
+/// use ordermap::OrderMap;
+///
+/// // count the frequency of each letter in a sentence.
+/// let mut letters = OrderMap::new();
+/// for ch in "a short treatise on fungi".chars() {
+///     *letters.entry(ch).or_insert(0) += 1;
+/// }
+/// 
+/// assert_eq!(letters[&'s'], 2);
+/// assert_eq!(letters[&'t'], 3);
+/// assert_eq!(letters[&'u'], 1);
+/// assert_eq!(letters.get(&'y'), None);
+/// ```
+#[derive(Clone)]
+pub struct OrderMap<K, V, S = RandomState> {
+    mask: usize,
+    /// indices are the buckets. indices.len() == raw capacity
+    indices: Box<[Pos]>,
+    /// entries is a dense vec of entries in their order. entries.len() == len
+    entries: Vec<Bucket<K, V>>,
+    hash_builder: S,
+}
+
+#[derive(Copy, Clone, Debug)]
+struct Bucket<K, V> {
+    hash: HashValue,
+    key: K,
+    value: V,
+}
+
+#[inline(always)]
+fn desired_pos(mask: usize, hash: HashValue) -> usize {
+    hash.0 & mask
+}
+
+/// The number of steps that `current` is forward of the desired position for hash
+#[inline(always)]
+fn probe_distance(mask: usize, hash: HashValue, current: usize) -> usize {
+    current.wrapping_sub(desired_pos(mask, hash)) & mask
+}
+
+enum Inserted<V> {
+    Done,
+    Swapped { prev_value: V },
+    RobinHood {
+        probe: usize,
+        old_pos: Pos,
+    }
+}
+
+impl<K, V, S> fmt::Debug for OrderMap<K, V, S>
+    where K: fmt::Debug + Hash + Eq,
+          V: fmt::Debug,
+          S: BuildHasher,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(f.debug_map().entries(self.iter()).finish());
+        if cfg!(not(feature = "test_debug")) {
+            return Ok(());
+        }
+        try!(writeln!(f, ""));
+        for (i, index) in enumerate(&*self.indices) {
+            try!(write!(f, "{}: {:?}", i, index));
+            if let Some(pos) = index.pos() {
+                let hash = self.entries[pos].hash;
+                let key = &self.entries[pos].key;
+                let desire = desired_pos(self.mask, hash);
+                try!(write!(f, ", desired={}, probe_distance={}, key={:?}",
+                              desire,
+                              probe_distance(self.mask, hash, i),
+                              key));
+            }
+            try!(writeln!(f, ""));
+        }
+        try!(writeln!(f, "cap={}, raw_cap={}, entries.cap={}",
+                      self.capacity(),
+                      self.raw_capacity(),
+                      self.entries.capacity()));
+        Ok(())
+    }
+}
+
+#[inline]
+fn usable_capacity(cap: usize) -> usize {
+    cap - cap / 4
+}
+
+#[inline]
+fn to_raw_capacity(n: usize) -> usize {
+    n + n / 3
+}
+
+// this could not be captured in an efficient iterator
+macro_rules! probe_loop {
+    ($probe_var: ident < $len: expr, $body: expr) => {
+        loop {
+            if $probe_var < $len {
+                $body
+                $probe_var += 1;
+            } else {
+                $probe_var = 0;
+            }
+        }
+    }
+}
+
+impl<K, V> OrderMap<K, V> {
+    /// Create a new map. (Does not allocate.)
+    pub fn new() -> Self {
+        Self::with_capacity(0)
+    }
+
+    /// Create a new map with capacity for `n` key-value pairs. (Does not
+    /// allocate if `n` is zero.)
+    ///
+    /// Computes in **O(n)** time.
+    pub fn with_capacity(n: usize) -> Self {
+        Self::with_capacity_and_hasher(n, <_>::default())
+    }
+}
+
+impl<K, V, S> OrderMap<K, V, S>
+{
+    /// Create a new map with capacity for `n` key-value pairs. (Does not
+    /// allocate if `n` is zero.)
+    ///
+    /// Computes in **O(n)** time.
+    pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self
+        where S: BuildHasher
+    {
+        if n == 0 {
+            OrderMap {
+                mask: 0,
+                indices: Box::new([]),
+                entries: Vec::new(),
+                hash_builder: hash_builder,
+            }
+        } else {
+            let raw = to_raw_capacity(n);
+            let raw_cap = max(raw.next_power_of_two(), 8);
+            OrderMap {
+                mask: raw_cap.wrapping_sub(1),
+                indices: vec![Pos::none(); raw_cap].into_boxed_slice(),
+                entries: Vec::with_capacity(usable_capacity(raw_cap)),
+                hash_builder: hash_builder,
+            }
+        }
+    }
+
+    /// Return the number of key-value pairs in the map.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn len(&self) -> usize { self.entries.len() }
+
+    /// Returns true if the map contains no elements.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn is_empty(&self) -> bool { self.len() == 0 }
+
+    /// Create a new map with `hash_builder`
+    pub fn with_hasher(hash_builder: S) -> Self
+        where S: BuildHasher
+    {
+        Self::with_capacity_and_hasher(0, hash_builder)
+    }
+
+    /// Return a reference to the map's `BuildHasher`.
+    pub fn hasher(&self) -> &S
+        where S: BuildHasher
+    {
+        &self.hash_builder
+    }
+
+    // Return whether we need 32 or 64 bits to specify a bucket or entry index
+    #[cfg(not(feature = "test_low_transition_point"))]
+    fn size_class_is_64bit(&self) -> bool {
+        usize::max_value() > u32::max_value() as usize &&
+            self.raw_capacity() >= u32::max_value() as usize
+    }
+
+    // for testing
+    #[cfg(feature = "test_low_transition_point")]
+    fn size_class_is_64bit(&self) -> bool {
+        self.raw_capacity() >= 64
+    }
+
+    #[inline(always)]
+    fn raw_capacity(&self) -> usize {
+        self.indices.len()
+    }
+
+    /// Computes in **O(1)** time.
+    pub fn capacity(&self) -> usize {
+        usable_capacity(self.raw_capacity())
+    }
+}
+
+/// Trait for the "size class". Either u32 or u64 depending on the index
+/// size needed to address an entry's indes in self.entries.
+trait Size {
+    fn is_64_bit() -> bool;
+    fn is_same_size<T: Size>() -> bool {
+        Self::is_64_bit() == T::is_64_bit()
+    }
+}
+
+impl Size for u32 {
+    #[inline]
+    fn is_64_bit() -> bool { false }
+}
+
+impl Size for u64 {
+    #[inline]
+    fn is_64_bit() -> bool { true }
+}
+
+/// Call self.method(args) with `::<u32>` or `::<u64>` depending on `self`
+/// size class.
+///
+/// The u32 or u64 is *prepended* to the type parameter list!
+macro_rules! dispatch_32_vs_64 {
+    ($self_:ident . $method:ident::<$($t:ty),*>($($arg:expr),*)) => {
+        if $self_.size_class_is_64bit() {
+            $self_.$method::<u64, $($t),*>($($arg),*)
+        } else {
+            $self_.$method::<u32, $($t),*>($($arg),*)
+        }
+    };
+    ($self_:ident . $method:ident ($($arg:expr),*)) => {
+        if $self_.size_class_is_64bit() {
+            $self_.$method::<u64>($($arg),*)
+        } else {
+            $self_.$method::<u32>($($arg),*)
+        }
+    };
+}
+
+/// Entry for an existing key-value pair or a vacant location to
+/// insert one.
+///
+/// FIXME: Remove dependence on the `S` parameter
+/// (to match HashMap).
+pub enum Entry<'a, K: 'a, V: 'a, S: 'a = RandomState> {
+    /// Existing slot with equivalent key.
+    Occupied(OccupiedEntry<'a, K, V, S>),
+    /// Vacant slot (no equivalent key in the map).
+    Vacant(VacantEntry<'a, K, V, S>),
+}
+
+impl<'a, K, V, S> Entry<'a, K, V, S> {
+    /// Computes in **O(1)** time (amortized average).
+    pub fn or_insert(self, default: V) -> &'a mut V {
+        match self {
+            Entry::Occupied(entry) => entry.into_mut(),
+            Entry::Vacant(entry) => entry.insert(default),
+        }
+    }
+
+    /// Computes in **O(1)** time (amortized average).
+    pub fn or_insert_with<F>(self, call: F) -> &'a mut V
+        where F: FnOnce() -> V,
+    {
+        match self {
+            Entry::Occupied(entry) => entry.into_mut(),
+            Entry::Vacant(entry) => entry.insert(call()),
+        }
+    }
+
+    pub fn key(&self) -> &K {
+        match *self {
+            Entry::Occupied(ref entry) => entry.key(),
+            Entry::Vacant(ref entry) => entry.key(),
+        }
+    }
+
+    /// Return the index where the key-value pair exists or will be inserted.
+    pub fn index(&self) -> usize {
+        match *self {
+            Entry::Occupied(ref entry) => entry.index(),
+            Entry::Vacant(ref entry) => entry.index(),
+        }
+    }
+}
+
+pub struct OccupiedEntry<'a, K: 'a, V: 'a, S: 'a = RandomState> {
+    map: &'a mut OrderMap<K, V, S>,
+    key: K,
+    probe: usize,
+    index: usize,
+}
+
+impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> {
+    pub fn key(&self) -> &K { &self.key }
+    pub fn get(&self) -> &V {
+        &self.map.entries[self.index].value
+    }
+    pub fn get_mut(&mut self) -> &mut V {
+        &mut self.map.entries[self.index].value
+    }
+
+    /// Return the index of the key-value pair
+    pub fn index(&self) -> usize {
+        self.index
+    }
+    pub fn into_mut(self) -> &'a mut V {
+        &mut self.map.entries[self.index].value
+    }
+
+    pub fn insert(self, value: V) -> V {
+        replace(&mut self.into_mut(), value)
+    }
+
+    pub fn remove(self) -> V {
+        self.remove_entry().1
+    }
+
+    /// Remove and return the key, value pair stored in the map for this entry
+    pub fn remove_entry(self) -> (K, V) {
+        self.map.remove_found(self.probe, self.index)
+    }
+}
+
+
+pub struct VacantEntry<'a, K: 'a, V: 'a, S: 'a = RandomState> {
+    map: &'a mut OrderMap<K, V, S>,
+    key: K,
+    hash: HashValue,
+    probe: usize,
+}
+
+impl<'a, K, V, S> VacantEntry<'a, K, V, S> {
+    pub fn key(&self) -> &K { &self.key }
+    pub fn into_key(self) -> K { self.key }
+    /// Return the index where the key-value pair will be inserted.
+    pub fn index(&self) -> usize { self.map.len() }
+    pub fn insert(self, value: V) -> &'a mut V {
+        if self.map.size_class_is_64bit() {
+            self.insert_impl::<u64>(value)
+        } else {
+            self.insert_impl::<u32>(value)
+        }
+    }
+
+    fn insert_impl<Sz>(self, value: V) -> &'a mut V
+        where Sz: Size
+    {
+        let index = self.map.entries.len();
+        self.map.entries.push(Bucket { hash: self.hash, key: self.key, value: value });
+        let old_pos = Pos::with_hash::<Sz>(index, self.hash);
+        self.map.insert_phase_2::<Sz>(self.probe, old_pos);
+        &mut {self.map}.entries[index].value
+    }
+}
+
+impl<K, V, S> OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher,
+{
+    // Warning, this is a code duplication zone Entry is not yet finished
+    fn entry_phase_1<Sz>(&mut self, key: K) -> Entry<K, V, S>
+        where Sz: Size
+    {
+        let hash = hash_elem_using(&self.hash_builder, &key);
+        let mut probe = desired_pos(self.mask, hash);
+        let mut dist = 0;
+        debug_assert!(self.len() < self.raw_capacity());
+        probe_loop!(probe < self.indices.len(), {
+            if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() {
+                let entry_hash = hash_proxy.get_short_hash(&self.entries, i);
+                // if existing element probed less than us, swap
+                let their_dist = probe_distance(self.mask, entry_hash.into_hash(), probe);
+                if their_dist < dist {
+                    // robin hood: steal the spot if it's better for us
+                    return Entry::Vacant(VacantEntry {
+                        map: self,
+                        hash: hash,
+                        key: key,
+                        probe: probe,
+                    });
+                } else if entry_hash == hash && self.entries[i].key == key {
+                    return Entry::Occupied(OccupiedEntry {
+                        map: self,
+                        key: key,
+                        probe: probe,
+                        index: i,
+                    });
+                }
+            } else {
+                // empty bucket, insert here
+                return Entry::Vacant(VacantEntry {
+                    map: self,
+                    hash: hash,
+                    key: key,
+                    probe: probe,
+                });
+            }
+            dist += 1;
+        });
+    }
+
+    /// Remove all key-value pairs in the map, while preserving its capacity.
+    ///
+    /// Computes in **O(n)** time.
+    pub fn clear(&mut self) {
+        self.entries.clear();
+        self.clear_indices();
+    }
+
+    // clear self.indices to the same state as "no elements"
+    fn clear_indices(&mut self) {
+        for pos in self.indices.iter_mut() {
+            *pos = Pos::none();
+        }
+    }
+
+    /// Reserve capacity for `additional` more key-value pairs.
+    ///
+    /// FIXME Not implemented fully yet.
+    pub fn reserve(&mut self, additional: usize) {
+        if additional > 0 {
+            self.reserve_one();
+        }
+    }
+
+    // First phase: Look for the preferred location for key.
+    //
+    // We will know if `key` is already in the map, before we need to insert it.
+    // When we insert they key, it might be that we need to continue displacing
+    // entries (robin hood hashing), in which case Inserted::RobinHood is returned
+    fn insert_phase_1<Sz>(&mut self, key: K, value: V) -> Inserted<V>
+        where Sz: Size
+    {
+        let hash = hash_elem_using(&self.hash_builder, &key);
+        let mut probe = desired_pos(self.mask, hash);
+        let mut dist = 0;
+        let insert_kind;
+        debug_assert!(self.len() < self.raw_capacity());
+        probe_loop!(probe < self.indices.len(), {
+            let pos = &mut self.indices[probe];
+            if let Some((i, hash_proxy)) = pos.resolve::<Sz>() {
+                let entry_hash = hash_proxy.get_short_hash(&self.entries, i);
+                // if existing element probed less than us, swap
+                let their_dist = probe_distance(self.mask, entry_hash.into_hash(), probe);
+                if their_dist < dist {
+                    // robin hood: steal the spot if it's better for us
+                    let index = self.entries.len();
+                    insert_kind = Inserted::RobinHood {
+                        probe: probe,
+                        old_pos: Pos::with_hash::<Sz>(index, hash),
+                    };
+                    break;
+                } else if entry_hash == hash && self.entries[i].key == key {
+                    return Inserted::Swapped {
+                        prev_value: replace(&mut self.entries[i].value, value),
+                    };
+                }
+            } else {
+                // empty bucket, insert here
+                let index = self.entries.len();
+                *pos = Pos::with_hash::<Sz>(index, hash);
+                insert_kind = Inserted::Done;
+                break;
+            }
+            dist += 1;
+        });
+        self.entries.push(Bucket { hash: hash, key: key, value: value });
+        insert_kind
+    }
+
+    fn first_allocation(&mut self) {
+        debug_assert_eq!(self.len(), 0);
+        let raw_cap = 8usize;
+        self.mask = raw_cap.wrapping_sub(1);
+        self.indices = vec![Pos::none(); raw_cap].into_boxed_slice();
+        self.entries = Vec::with_capacity(usable_capacity(raw_cap));
+    }
+
+    #[inline(never)]
+    // `Sz` is *current* Size class, before grow
+    fn double_capacity<Sz>(&mut self)
+        where Sz: Size
+    {
+        debug_assert!(self.raw_capacity() == 0 || self.len() > 0);
+        if self.raw_capacity() == 0 {
+            return self.first_allocation();
+        }
+
+        // find first ideally placed element -- start of cluster
+        let mut first_ideal = 0;
+        for (i, index) in enumerate(&*self.indices) {
+            if let Some(pos) = index.pos() {
+                if 0 == probe_distance(self.mask, self.entries[pos].hash, i) {
+                    first_ideal = i;
+                    break;
+                }
+            }
+        }
+
+        // visit the entries in an order where we can simply reinsert them
+        // into self.indices without any bucket stealing.
+        let new_raw_cap = self.indices.len() * 2;
+        let old_indices = replace(&mut self.indices, vec![Pos::none(); new_raw_cap].into_boxed_slice());
+        self.mask = new_raw_cap.wrapping_sub(1);
+
+        // `Sz` is the old size class, and either u32 or u64 is the new
+        for &pos in &old_indices[first_ideal..] {
+            dispatch_32_vs_64!(self.reinsert_entry_in_order::<Sz>(pos));
+        }
+
+        for &pos in &old_indices[..first_ideal] {
+            dispatch_32_vs_64!(self.reinsert_entry_in_order::<Sz>(pos));
+        }
+        let more = self.capacity() - self.len();
+        self.entries.reserve_exact(more);
+    }
+
+    // write to self.indices
+    // read from self.entries at `pos`
+    //
+    // reinserting rewrites all `Pos` entries anyway. This handles transitioning
+    // from u32 to u64 size class if needed by using the two type parameters.
+    fn reinsert_entry_in_order<SzNew, SzOld>(&mut self, pos: Pos)
+        where SzNew: Size,
+              SzOld: Size,
+    {
+        if let Some((i, hash_proxy)) = pos.resolve::<SzOld>() {
+            // only if the size class is conserved can we use the short hash
+            let entry_hash = if SzOld::is_same_size::<SzNew>() {
+                hash_proxy.get_short_hash(&self.entries, i).into_hash()
+            } else {
+                self.entries[i].hash
+            };
+            // find first empty bucket and insert there
+            let mut probe = desired_pos(self.mask, entry_hash);
+            probe_loop!(probe < self.indices.len(), {
+                if let Some(_) = self.indices[probe].resolve::<SzNew>() {
+                    /* nothing */
+                } else {
+                    // empty bucket, insert here
+                    self.indices[probe] = Pos::with_hash::<SzNew>(i, entry_hash);
+                    return;
+                }
+            });
+        }
+    }
+
+    fn reserve_one(&mut self) {
+        if self.len() == self.capacity() {
+            dispatch_32_vs_64!(self.double_capacity());
+        }
+    }
+
+    /// Insert a key-value pair in the map.
+    ///
+    /// If an equivalent key already exists in the map: the key remains and
+    /// retains in its place in the order, its corresponding value is updated
+    /// with `value` and the older value is returned inside `Some(_)`.
+    ///
+    /// If no equivalent key existed in the map: the new key-value pair is
+    /// inserted, last in order, and `None` is returned.
+    ///
+    /// Computes in **O(1)** time (amortized average).
+    ///
+    /// See also [`entry`](#method.entry) if you you want to insert *or* modify
+    /// or if you need to get the `index` of the corresponding key-value pair.
+    pub fn insert(&mut self, key: K, value: V) -> Option<V> {
+        self.reserve_one();
+        if self.size_class_is_64bit() {
+            match self.insert_phase_1::<u64>(key, value) {
+                Inserted::Swapped { prev_value } => Some(prev_value),
+                Inserted::Done => None,
+                Inserted::RobinHood { probe, old_pos } => {
+                    self.insert_phase_2::<u64>(probe, old_pos);
+                    None
+                }
+            }
+        } else {
+            match self.insert_phase_1::<u32>(key, value) {
+                Inserted::Swapped { prev_value } => Some(prev_value),
+                Inserted::Done => None,
+                Inserted::RobinHood { probe, old_pos } => {
+                    self.insert_phase_2::<u32>(probe, old_pos);
+                    None
+                }
+            }
+        }
+    }
+
+    /// Get the given key’s corresponding entry in the map for insertion and/or
+    /// in-place manipulation.
+    ///
+    /// Computes in **O(1)** time (amortized average).
+    pub fn entry(&mut self, key: K) -> Entry<K, V, S> {
+        self.reserve_one();
+        dispatch_32_vs_64!(self.entry_phase_1(key))
+    }
+
+
+    /// Return an iterator over the key-value pairs of the map, in their order
+    pub fn iter(&self) -> Iter<K, V> {
+        Iter {
+            iter: self.entries.iter()
+        }
+    }
+
+    /// Return an iterator over the key-value pairs of the map, in their order
+    pub fn iter_mut(&mut self) -> IterMut<K, V> {
+        IterMut {
+            iter: self.entries.iter_mut()
+        }
+    }
+
+    /// Return an iterator over the keys of the map, in their order
+    pub fn keys(&self) -> Keys<K, V> {
+        Keys {
+            iter: self.entries.iter()
+        }
+    }
+
+    /// Return an iterator over the values of the map, in their order
+    pub fn values(&self) -> Values<K, V> {
+        Values {
+            iter: self.entries.iter()
+        }
+    }
+
+    /// Return an iterator over mutable references to the the values of the map,
+    /// in their order
+    pub fn values_mut(&mut self) -> ValuesMut<K, V> {
+        ValuesMut {
+            iter: self.entries.iter_mut()
+        }
+    }
+
+    /// Return `true` if and equivalent to `key` exists in the map.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
+        where Q: Hash + Equivalent<K>,
+    {
+        self.find(key).is_some()
+    }
+
+    /// Return a reference to the value stored for `key`, if it is present,
+    /// else `None`.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
+        where Q: Hash + Equivalent<K>,
+    {
+        self.get_full(key).map(third)
+    }
+
+    /// Return item index, key and value
+    pub fn get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)>
+        where Q: Hash + Equivalent<K>,
+    {
+        if let Some((_, found)) = self.find(key) {
+            let entry = &self.entries[found];
+            Some((found, &entry.key, &entry.value))
+        } else {
+            None
+        }
+    }
+
+    pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
+        where Q: Hash + Equivalent<K>,
+    {
+        self.get_full_mut(key).map(third)
+    }
+
+    pub fn get_full_mut<Q: ?Sized>(&mut self, key: &Q)
+        -> Option<(usize, &K, &mut V)>
+        where Q: Hash + Equivalent<K>,
+    {
+        self.get_full_mut2(key).map(|(i, k, v)| (i, &*k, v))
+    }
+
+    /// Return probe (indices) and position (entries)
+    fn find<Q: ?Sized>(&self, key: &Q) -> Option<(usize, usize)>
+        where Q: Hash + Equivalent<K>,
+    {
+        if self.len() == 0 { return None; }
+        let h = hash_elem_using(&self.hash_builder, key);
+        self.find_using(h, move |entry| { Q::equivalent(key, &entry.key) })
+    }
+
+    /// NOTE: Same as .swap_remove
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
+        where Q: Hash + Equivalent<K>,
+    {
+        self.swap_remove(key)
+    }
+
+    /// Remove the key-value pair equivalent to `key` and return
+    /// its value.
+    ///
+    /// Like `Vec::swap_remove`, the pair is removed by swapping it with the
+    /// last element of the map and popping it off. **This perturbs
+    /// the postion of what used to be the last element!**
+    ///
+    /// Return `None` if `key` is not in map.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn swap_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
+        where Q: Hash + Equivalent<K>,
+    {
+        self.swap_remove_full(key).map(third)
+    }
+
+    /// Remove the key-value pair equivalent to `key` and return it and
+    /// the index it had.
+    ///
+    /// Like `Vec::swap_remove`, the pair is removed by swapping it with the
+    /// last element of the map and popping it off. **This perturbs
+    /// the postion of what used to be the last element!**
+    ///
+    /// Return `None` if `key` is not in map.
+    pub fn swap_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)>
+        where Q: Hash + Equivalent<K>,
+    {
+        let (probe, found) = match self.find(key) {
+            None => return None,
+            Some(t) => t,
+        };
+        let (k, v) = self.remove_found(probe, found);
+        Some((found, k, v))
+    }
+
+    /// Remove the last key-value pair
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn pop(&mut self) -> Option<(K, V)> {
+        self.pop_impl()
+    }
+
+    /// Scan through each key-value pair in the map and keep those where the
+    /// closure `keep` returns `true`.
+    ///
+    /// The elements are visited in order, and remaining elements keep their
+    /// order.
+    ///
+    /// Computes in **O(n)** time (average).
+    pub fn retain<F>(&mut self, mut keep: F)
+        where F: FnMut(&K, &mut V) -> bool,
+    {
+        self.retain_mut(move |k, v| keep(k, v));
+    }
+
+    fn retain_mut<F>(&mut self, keep: F)
+        where F: FnMut(&mut K, &mut V) -> bool,
+    {
+        dispatch_32_vs_64!(self.retain_in_order_impl::<F>(keep));
+    }
+
+    fn retain_in_order_impl<Sz, F>(&mut self, mut keep: F)
+        where F: FnMut(&mut K, &mut V) -> bool,
+              Sz: Size,
+    {
+        // Like Vec::retain in self.entries; for each removed key-value pair,
+        // we clear its corresponding spot in self.indices, and run the
+        // usual backward shift in self.indices.
+        let len = self.entries.len();
+        let mut n_deleted = 0;
+        for i in 0..len {
+            let will_keep;
+            let hash;
+            {
+                let ent = &mut self.entries[i];
+                hash = ent.hash;
+                will_keep = keep(&mut ent.key, &mut ent.value);
+            };
+            let probe = find_existing_entry_at::<Sz>(&self.indices, hash, self.mask, i);
+            if !will_keep {
+                n_deleted += 1;
+                self.indices[probe] = Pos::none();
+                self.backward_shift_after_removal::<Sz>(probe);
+            } else if n_deleted > 0 {
+                self.indices[probe].set_pos::<Sz>(i - n_deleted);
+                self.entries.swap(i - n_deleted, i);
+            }
+        }
+        self.entries.truncate(len - n_deleted);
+    }
+
+    /// Sort the map’s key-value pairs by the default ordering of the keys.
+    ///
+    /// See `sort_by` for details.
+    pub fn sort_keys(&mut self)
+        where K: Ord,
+    {
+        self.sort_by(|k1, _, k2, _| Ord::cmp(k1, k2))
+    }
+
+    /// Sort the map’s key-value pairs in place using the comparison
+    /// function `compare`.
+    ///
+    /// The comparison function receives two key and value pairs to compare (you
+    /// can sort by keys or values or their combination as needed).
+    ///
+    /// Computes in **O(n log n + c)** time and **O(n)** space where *n* is
+    /// the length of the map and *c* the capacity. The sort is stable.
+    pub fn sort_by<F>(&mut self, mut compare: F)
+        where F: FnMut(&K, &V, &K, &V) -> Ordering,
+    {
+        // here we temporarily use the hash field in a bucket to store the old
+        // index instead.
+        //
+        // Save the old hash values in `side_index`.
+        // Then we can sort `self.entries` in place.
+        let mut side_index = Vec::from_iter(enumerate(&mut self.entries).map(|(i, elt)| {
+            replace(&mut elt.hash, HashValue(i)).get()
+        }));
+
+        self.entries.sort_by(move |ei, ej| compare(&ei.key, &ei.value, &ej.key, &ej.value));
+
+        // Here we write back the hash values from side_index and fill
+        // in side_index with a mapping from the old to the new index instead.
+        for (i, ent) in enumerate(&mut self.entries) {
+            let old_index = ent.hash.get();
+            ent.hash = HashValue(replace(&mut side_index[old_index], i));
+        }
+
+        // Apply new index to self.indices
+        dispatch_32_vs_64!(self.apply_new_index(&side_index));
+    }
+
+    fn apply_new_index<Sz>(&mut self, new_index: &[usize])
+        where Sz: Size
+    {
+        for pos in self.indices.iter_mut() {
+            if let Some((i, _)) = pos.resolve::<Sz>() {
+                pos.set_pos::<Sz>(new_index[i]);
+            }
+        }
+    }
+
+    /// Sort the key-value pairs of the map and return a by value iterator of
+    /// the key-value pairs with the result.
+    ///
+    /// The sort is stable.
+    pub fn sorted_by<F>(mut self, mut cmp: F) -> IntoIter<K, V>
+        where F: FnMut(&K, &V, &K, &V) -> Ordering
+    {
+        self.entries.sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value));
+        self.into_iter()
+    }
+
+    /// Clears the `OrderMap`, returning all key-value pairs as a drain iterator.
+    /// Keeps the allocated memory for reuse.
+    pub fn drain(&mut self, range: RangeFull) -> Drain<K, V> {
+        self.clear_indices();
+
+        Drain {
+            iter: self.entries.drain(range),
+        }
+    }
+}
+
+impl<K, V, S> OrderMap<K, V, S> {
+    /// Get a key-value pair by index
+    ///
+    /// Valid indices are *0 <= index < self.len()*
+    ///
+    /// Computes in **O(1)** time.
+    pub fn get_index(&self, index: usize) -> Option<(&K, &V)> {
+        self.entries.get(index).map(|ent| (&ent.key, &ent.value))
+    }
+
+    /// Get a key-value pair by index
+    ///
+    /// Valid indices are *0 <= index < self.len()*
+    ///
+    /// Computes in **O(1)** time.
+    pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> {
+        self.entries.get_mut(index).map(|ent| (&mut ent.key, &mut ent.value))
+    }
+
+    /// Remove the key-value pair by index
+    ///
+    /// Valid indices are *0 <= index < self.len()*
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> {
+        let (probe, found) = match self.entries.get(index)
+            .map(|e| self.find_existing_entry(e))
+        {
+            None => return None,
+            Some(t) => t,
+        };
+        Some(self.remove_found(probe, found))
+    }
+}
+
+// Methods that don't use any properties (Hash / Eq) of K.
+//
+// It's cleaner to separate them out, then the compiler checks that we are not
+// using Hash + Eq at all in these methods.
+//
+// However, we should probably not let this show in the public API or docs.
+impl<K, V, S> OrderMap<K, V, S> {
+    fn pop_impl(&mut self) -> Option<(K, V)> {
+        let (probe, found) = match self.entries.last()
+            .map(|e| self.find_existing_entry(e))
+        {
+            None => return None,
+            Some(t) => t,
+        };
+        debug_assert_eq!(found, self.entries.len() - 1);
+        Some(self.remove_found(probe, found))
+    }
+
+    /// phase 2 is post-insert where we forward-shift `Pos` in the indices.
+    fn insert_phase_2<Sz>(&mut self, mut probe: usize, mut old_pos: Pos)
+        where Sz: Size
+    {
+        probe_loop!(probe < self.indices.len(), {
+            let pos = &mut self.indices[probe];
+            if pos.is_none() {
+                *pos = old_pos;
+                break;
+            } else {
+                old_pos = replace(pos, old_pos);
+            }
+        });
+    }
+
+
+    /// Return probe (indices) and position (entries)
+    fn find_using<F>(&self, hash: HashValue, key_eq: F) -> Option<(usize, usize)>
+        where F: Fn(&Bucket<K, V>) -> bool,
+    {
+        dispatch_32_vs_64!(self.find_using_impl::<_>(hash, key_eq))
+    }
+
+    fn find_using_impl<Sz, F>(&self, hash: HashValue, key_eq: F) -> Option<(usize, usize)>
+        where F: Fn(&Bucket<K, V>) -> bool,
+              Sz: Size,
+    {
+        debug_assert!(self.len() > 0);
+        let mut probe = desired_pos(self.mask, hash);
+        let mut dist = 0;
+        probe_loop!(probe < self.indices.len(), {
+            if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() {
+                let entry_hash = hash_proxy.get_short_hash(&self.entries, i);
+                if dist > probe_distance(self.mask, entry_hash.into_hash(), probe) {
+                    // give up when probe distance is too long
+                    return None;
+                } else if entry_hash == hash && key_eq(&self.entries[i]) {
+                    return Some((probe, i));
+                }
+            } else {
+                return None;
+            }
+            dist += 1;
+        });
+    }
+
+    /// Find `entry` which is already placed inside self.entries;
+    /// return its probe and entry index.
+    fn find_existing_entry(&self, entry: &Bucket<K, V>) -> (usize, usize)
+    {
+        debug_assert!(self.len() > 0);
+        dispatch_32_vs_64!(self.find_existing_entry_impl(entry))
+    }
+
+    fn find_existing_entry_impl<Sz>(&self, entry: &Bucket<K, V>) -> (usize, usize)
+        where Sz: Size,
+    {
+        let hash = entry.hash;
+        let actual_pos = ptrdistance(&self.entries[0], entry);
+        let probe = find_existing_entry_at::<Sz>(&self.indices, hash, self.mask, actual_pos);
+        (probe, actual_pos)
+    }
+
+    fn remove_found(&mut self, probe: usize, found: usize) -> (K, V) {
+        dispatch_32_vs_64!(self.remove_found_impl(probe, found))
+    }
+
+    fn remove_found_impl<Sz>(&mut self, probe: usize, found: usize) -> (K, V)
+        where Sz: Size
+    {
+        // index `probe` and entry `found` is to be removed
+        // use swap_remove, but then we need to update the index that points
+        // to the other entry that has to move
+        self.indices[probe] = Pos::none();
+        let entry = self.entries.swap_remove(found);
+
+        // correct index that points to the entry that had to swap places
+        if let Some(entry) = self.entries.get(found) {
+            // was not last element
+            // examine new element in `found` and find it in indices
+            let mut probe = desired_pos(self.mask, entry.hash);
+            probe_loop!(probe < self.indices.len(), {
+                if let Some((i, _)) = self.indices[probe].resolve::<Sz>() {
+                    if i >= self.entries.len() {
+                        // found it
+                        self.indices[probe] = Pos::with_hash::<Sz>(found, entry.hash);
+                        break;
+                    }
+                }
+            });
+        }
+
+        self.backward_shift_after_removal::<Sz>(probe);
+
+        (entry.key, entry.value)
+    }
+
+    fn backward_shift_after_removal<Sz>(&mut self, probe_at_remove: usize)
+        where Sz: Size
+    {
+        // backward shift deletion in self.indices
+        // after probe, shift all non-ideally placed indices backward
+        let mut last_probe = probe_at_remove;
+        let mut probe = probe_at_remove + 1;
+        probe_loop!(probe < self.indices.len(), {
+            if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() {
+                let entry_hash = hash_proxy.get_short_hash(&self.entries, i);
+                if probe_distance(self.mask, entry_hash.into_hash(), probe) > 0 {
+                    self.indices[last_probe] = self.indices[probe];
+                    self.indices[probe] = Pos::none();
+                } else {
+                    break;
+                }
+            } else {
+                break;
+            }
+            last_probe = probe;
+        });
+    }
+
+}
+
+/// Find, in the indices, an entry that already exists at a known position
+/// inside self.entries in the OrderMap.
+///
+/// This is effectively reverse lookup, from the entries into the hash buckets.
+///
+/// Return the probe index (into self.indices)
+///
+/// + indices: The self.indices of the map,
+/// + hash: The full hash value from the bucket
+/// + mask: self.mask.
+/// + entry_index: The index of the entry in self.entries
+fn find_existing_entry_at<Sz>(indices: &[Pos], hash: HashValue,
+                              mask: usize, entry_index: usize) -> usize
+    where Sz: Size,
+{
+    let mut probe = desired_pos(mask, hash);
+    probe_loop!(probe < indices.len(), {
+        // the entry *must* be present; if we hit a Pos::none this was not true
+        // and there is a debug assertion in resolve_existing_index for that.
+        let i = indices[probe].resolve_existing_index::<Sz>();
+        if i == entry_index { return probe; }
+    });
+}
+
+use std::slice::Iter as SliceIter;
+use std::slice::IterMut as SliceIterMut;
+use std::vec::IntoIter as VecIntoIter;
+
+pub struct Keys<'a, K: 'a, V: 'a> {
+    iter: SliceIter<'a, Bucket<K, V>>,
+}
+
+impl<'a, K, V> Iterator for Keys<'a, K, V> {
+    type Item = &'a K;
+
+    iterator_methods!(|entry| &entry.key);
+}
+
+impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
+    fn next_back(&mut self) -> Option<&'a K> {
+        self.iter.next_back().map(|ent| &ent.key)
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct Values<'a, K: 'a, V: 'a> {
+    iter: SliceIter<'a, Bucket<K, V>>,
+}
+
+impl<'a, K, V> Iterator for Values<'a, K, V> {
+    type Item = &'a V;
+
+    iterator_methods!(|ent| &ent.value);
+}
+
+impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|ent| &ent.value)
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct ValuesMut<'a, K: 'a, V: 'a> {
+    iter: SliceIterMut<'a, Bucket<K, V>>,
+}
+
+impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
+    type Item = &'a mut V;
+
+    iterator_methods!(|ent| &mut ent.value);
+}
+
+impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|ent| &mut ent.value)
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct Iter<'a, K: 'a, V: 'a> {
+    iter: SliceIter<'a, Bucket<K, V>>,
+}
+
+impl<'a, K, V> Iterator for Iter<'a, K, V> {
+    type Item = (&'a K, &'a V);
+
+    iterator_methods!(|e| (&e.key, &e.value));
+}
+
+impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|e| (&e.key, &e.value))
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct IterMut<'a, K: 'a, V: 'a> {
+    iter: SliceIterMut<'a, Bucket<K, V>>,
+}
+
+impl<'a, K, V> Iterator for IterMut<'a, K, V> {
+    type Item = (&'a K, &'a mut V);
+
+    iterator_methods!(|e| (&e.key, &mut e.value));
+}
+
+impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|e| (&e.key, &mut e.value))
+    }
+}
+
+impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct IntoIter<K, V> {
+    iter: VecIntoIter<Bucket<K, V>>,
+}
+
+impl<K, V> Iterator for IntoIter<K, V> {
+    type Item = (K, V);
+
+    iterator_methods!(|entry| (entry.key, entry.value));
+}
+
+impl<'a, K, V> DoubleEndedIterator for IntoIter<K, V> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|entry| (entry.key, entry.value))
+    }
+}
+
+impl<K, V> ExactSizeIterator for IntoIter<K, V> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct Drain<'a, K, V> where K: 'a, V: 'a {
+    iter: ::std::vec::Drain<'a, Bucket<K, V>>
+}
+
+impl<'a, K, V> Iterator for Drain<'a, K, V> {
+    type Item = (K, V);
+
+    iterator_methods!(|bucket| (bucket.key, bucket.value));
+}
+
+impl<'a, K, V> DoubleEndedIterator for Drain<'a, K, V> {
+    double_ended_iterator_methods!(|bucket| (bucket.key, bucket.value));
+}
+
+
+impl<'a, K, V, S> IntoIterator for &'a OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher,
+{
+    type Item = (&'a K, &'a V);
+    type IntoIter = Iter<'a, K, V>;
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
+    }
+}
+
+impl<'a, K, V, S> IntoIterator for &'a mut OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher,
+{
+    type Item = (&'a K, &'a mut V);
+    type IntoIter = IterMut<'a, K, V>;
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter_mut()
+    }
+}
+
+impl<K, V, S> IntoIterator for OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher,
+{
+    type Item = (K, V);
+    type IntoIter = IntoIter<K, V>;
+    fn into_iter(self) -> Self::IntoIter {
+        IntoIter {
+            iter: self.entries.into_iter(),
+        }
+    }
+}
+
+use std::ops::{Index, IndexMut};
+
+impl<'a, K, V, Q: ?Sized, S> Index<&'a Q> for OrderMap<K, V, S>
+    where Q: Hash + Equivalent<K>,
+          K: Hash + Eq,
+          S: BuildHasher,
+{
+    type Output = V;
+
+    /// ***Panics*** if `key` is not present in the map.
+    fn index(&self, key: &'a Q) -> &V {
+        if let Some(v) = self.get(key) {
+            v
+        } else {
+            panic!("OrderMap: key not found")
+        }
+    }
+}
+
+/// Mutable indexing allows changing / updating values of key-value
+/// pairs that are already present.
+///
+/// You can **not** insert new pairs with index syntax, use `.insert()`.
+impl<'a, K, V, Q: ?Sized, S> IndexMut<&'a Q> for OrderMap<K, V, S>
+    where Q: Hash + Equivalent<K>,
+          K: Hash + Eq,
+          S: BuildHasher,
+{
+    /// ***Panics*** if `key` is not present in the map.
+    fn index_mut(&mut self, key: &'a Q) -> &mut V {
+        if let Some(v) = self.get_mut(key) {
+            v
+        } else {
+            panic!("OrderMap: key not found")
+        }
+    }
+}
+
+impl<K, V, S> FromIterator<(K, V)> for OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher + Default,
+{
+    /// Create an `OrderMap` from the sequence of key-value pairs in the
+    /// iterable.
+    ///
+    /// `from_iter` uses the same logic as `extend`. See
+    /// [`extend`](#method.extend) for more details.
+    fn from_iter<I: IntoIterator<Item=(K, V)>>(iterable: I) -> Self {
+        let iter = iterable.into_iter();
+        let (low, _) = iter.size_hint();
+        let mut map = Self::with_capacity_and_hasher(low, <_>::default());
+        map.extend(iter);
+        map
+    }
+}
+
+impl<K, V, S> Extend<(K, V)> for OrderMap<K, V, S>
+    where K: Hash + Eq,
+          S: BuildHasher,
+{
+    /// Extend the map with all key-value pairs in the iterable.
+    ///
+    /// This is equivalent to calling [`insert`](#method.insert) for each of
+    /// them in order, which means that for keys that already existed
+    /// in the map, their value is updated but it keeps the existing order.
+    ///
+    /// New keys are inserted inserted in the order in the sequence. If
+    /// equivalents of a key occur more than once, the last corresponding value
+    /// prevails.
+    fn extend<I: IntoIterator<Item=(K, V)>>(&mut self, iterable: I) {
+        for (k, v) in iterable { self.insert(k, v); }
+    }
+}
+
+impl<'a, K, V, S> Extend<(&'a K, &'a V)> for OrderMap<K, V, S>
+    where K: Hash + Eq + Copy,
+          V: Copy,
+          S: BuildHasher,
+{
+    /// Extend the map with all key-value pairs in the iterable.
+    ///
+    /// See the first extend method for more details.
+    fn extend<I: IntoIterator<Item=(&'a K, &'a V)>>(&mut self, iterable: I) {
+        self.extend(iterable.into_iter().map(|(&key, &value)| (key, value)));
+    }
+}
+
+impl<K, V, S> Default for OrderMap<K, V, S>
+    where S: BuildHasher + Default,
+{
+    /// Return an empty `OrderMap`
+    fn default() -> Self {
+        Self::with_capacity_and_hasher(0, S::default())
+    }
+}
+
+impl<K, V1, S1, V2, S2> PartialEq<OrderMap<K, V2, S2>> for OrderMap<K, V1, S1>
+    where K: Hash + Eq,
+          V1: PartialEq<V2>,
+          S1: BuildHasher,
+          S2: BuildHasher
+{
+    fn eq(&self, other: &OrderMap<K, V2, S2>) -> bool {
+        if self.len() != other.len() {
+            return false;
+        }
+
+        self.iter().all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
+    }
+}
+
+impl<K, V, S> Eq for OrderMap<K, V, S>
+    where K: Eq + Hash,
+          V: Eq,
+          S: BuildHasher
+{
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use util::enumerate;
+
+    #[test]
+    fn it_works() {
+        let mut map = OrderMap::new();
+        assert_eq!(map.is_empty(), true);
+        map.insert(1, ());
+        map.insert(1, ());
+        assert_eq!(map.len(), 1);
+        assert!(map.get(&1).is_some());
+        assert_eq!(map.is_empty(), false);
+    }
+
+    #[test]
+    fn new() {
+        let map = OrderMap::<String, String>::new();
+        println!("{:?}", map);
+        assert_eq!(map.capacity(), 0);
+        assert_eq!(map.len(), 0);
+        assert_eq!(map.is_empty(), true);
+    }
+
+    #[test]
+    fn insert() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5];
+        let not_present = [1, 3, 6, 9, 10];
+        let mut map = OrderMap::with_capacity(insert.len());
+
+        for (i, &elt) in enumerate(&insert) {
+            assert_eq!(map.len(), i);
+            map.insert(elt, elt);
+            assert_eq!(map.len(), i + 1);
+            assert_eq!(map.get(&elt), Some(&elt));
+            assert_eq!(map[&elt], elt);
+        }
+        println!("{:?}", map);
+
+        for &elt in &not_present {
+            assert!(map.get(&elt).is_none());
+        }
+    }
+
+    #[test]
+    fn insert_2() {
+        let mut map = OrderMap::with_capacity(16);
+
+        let mut keys = vec![];
+        keys.extend(0..16);
+        keys.extend(128..267);
+
+        for &i in &keys {
+            let old_map = map.clone();
+            map.insert(i, ());
+            for key in old_map.keys() {
+                if !map.get(key).is_some() {
+                    println!("old_map: {:?}", old_map);
+                    println!("map: {:?}", map);
+                    panic!("did not find {} in map", key);
+                }
+            }
+        }
+
+        for &i in &keys {
+            assert!(map.get(&i).is_some(), "did not find {}", i);
+        }
+    }
+
+    #[test]
+    fn insert_order() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut map = OrderMap::new();
+
+        for &elt in &insert {
+            map.insert(elt, ());
+        }
+
+        assert_eq!(map.keys().count(), map.len());
+        assert_eq!(map.keys().count(), insert.len());
+        for (a, b) in insert.iter().zip(map.keys()) {
+            assert_eq!(a, b);
+        }
+        for (i, k) in (0..insert.len()).zip(map.keys()) {
+            assert_eq!(map.get_index(i).unwrap().0, k);
+        }
+    }
+
+    #[test]
+    fn grow() {
+        let insert = [0, 4, 2, 12, 8, 7, 11];
+        let not_present = [1, 3, 6, 9, 10];
+        let mut map = OrderMap::with_capacity(insert.len());
+
+
+        for (i, &elt) in enumerate(&insert) {
+            assert_eq!(map.len(), i);
+            map.insert(elt, elt);
+            assert_eq!(map.len(), i + 1);
+            assert_eq!(map.get(&elt), Some(&elt));
+            assert_eq!(map[&elt], elt);
+        }
+
+        println!("{:?}", map);
+        for &elt in &insert {
+            map.insert(elt * 10, elt);
+        }
+        for &elt in &insert {
+            map.insert(elt * 100, elt);
+        }
+        for (i, &elt) in insert.iter().cycle().enumerate().take(100) {
+            map.insert(elt * 100 + i as i32, elt);
+        }
+        println!("{:?}", map);
+        for &elt in &not_present {
+            assert!(map.get(&elt).is_none());
+        }
+    }
+
+    #[test]
+    fn remove() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut map = OrderMap::new();
+
+        for &elt in &insert {
+            map.insert(elt, elt);
+        }
+
+        assert_eq!(map.keys().count(), map.len());
+        assert_eq!(map.keys().count(), insert.len());
+        for (a, b) in insert.iter().zip(map.keys()) {
+            assert_eq!(a, b);
+        }
+
+        let remove_fail = [99, 77];
+        let remove = [4, 12, 8, 7];
+
+        for &key in &remove_fail {
+            assert!(map.swap_remove_full(&key).is_none());
+        }
+        println!("{:?}", map);
+        for &key in &remove {
+        //println!("{:?}", map);
+            let index = map.get_full(&key).unwrap().0;
+            assert_eq!(map.swap_remove_full(&key), Some((index, key, key)));
+        }
+        println!("{:?}", map);
+
+        for key in &insert {
+            assert_eq!(map.get(key).is_some(), !remove.contains(key));
+        }
+        assert_eq!(map.len(), insert.len() - remove.len());
+        assert_eq!(map.keys().count(), insert.len() - remove.len());
+    }
+
+    #[test]
+    fn remove_to_empty() {
+        let mut map = ordermap! { 0 => 0, 4 => 4, 5 => 5 };
+        map.swap_remove(&5).unwrap();
+        map.swap_remove(&4).unwrap();
+        map.swap_remove(&0).unwrap();
+        assert!(map.is_empty());
+    }
+
+    #[test]
+    fn swap_remove_index() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut map = OrderMap::new();
+
+        for &elt in &insert {
+            map.insert(elt, elt * 2);
+        }
+
+        let mut vector = insert.to_vec();
+        let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1];
+
+        // check that the same swap remove sequence on vec and map
+        // have the same result.
+        for &rm in remove_sequence {
+            let out_vec = vector.swap_remove(rm);
+            let (out_map, _) = map.swap_remove_index(rm).unwrap();
+            assert_eq!(out_vec, out_map);
+        }
+        assert_eq!(vector.len(), map.len());
+        for (a, b) in vector.iter().zip(map.keys()) {
+            assert_eq!(a, b);
+        }
+    }
+
+    #[test]
+    fn partial_eq_and_eq() {
+        let mut map_a = OrderMap::new();
+        map_a.insert(1, "1");
+        map_a.insert(2, "2");
+        let mut map_b = map_a.clone();
+        assert_eq!(map_a, map_b);
+        map_b.remove(&1);
+        assert_ne!(map_a, map_b);
+
+        let map_c: OrderMap<_, String> = map_b.into_iter().map(|(k, v)| (k, v.to_owned())).collect();
+        assert_ne!(map_a, map_c);
+        assert_ne!(map_c, map_a);
+    }
+
+    #[test]
+    fn extend() {
+        let mut map = OrderMap::new();
+        map.extend(vec![(&1, &2), (&3, &4)]);
+        map.extend(vec![(5, 6)]);
+        assert_eq!(map.into_iter().collect::<Vec<_>>(), vec![(1, 2), (3, 4), (5, 6)]);
+    }
+
+    #[test]
+    fn entry() {
+        let mut map = OrderMap::new();
+        
+        map.insert(1, "1");
+        map.insert(2, "2");
+        {
+            let e = map.entry(3);
+            assert_eq!(e.index(), 2);
+            let e = e.or_insert("3");
+            assert_eq!(e, &"3");
+        }
+        
+        let e = map.entry(2);
+        assert_eq!(e.index(), 1);
+        assert_eq!(e.key(), &2);
+        match e {
+            Entry::Occupied(ref e) => assert_eq!(e.get(), &"2"),
+            Entry::Vacant(_) => panic!()
+        }
+        assert_eq!(e.or_insert("4"), &"2");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/macros.rs
@@ -0,0 +1,122 @@
+
+#[macro_export]
+/// Create an `OrderMap` from a list of key-value pairs
+///
+/// ## Example
+///
+/// ```
+/// #[macro_use] extern crate ordermap;
+/// # fn main() {
+///
+/// let map = ordermap!{
+///     "a" => 1,
+///     "b" => 2,
+/// };
+/// assert_eq!(map["a"], 1);
+/// assert_eq!(map["b"], 2);
+/// assert_eq!(map.get("c"), None);
+///
+/// // "a" is the first key
+/// assert_eq!(map.keys().next(), Some(&"a"));
+/// # }
+/// ```
+macro_rules! ordermap {
+    (@single $($x:tt)*) => (());
+    (@count $($rest:expr),*) => (<[()]>::len(&[$(ordermap!(@single $rest)),*]));
+
+    ($($key:expr => $value:expr,)+) => { ordermap!($($key => $value),+) };
+    ($($key:expr => $value:expr),*) => {
+        {
+            let _cap = ordermap!(@count $($key),*);
+            let mut _map = $crate::OrderMap::with_capacity(_cap);
+            $(
+                _map.insert($key, $value);
+            )*
+            _map
+        }
+    };
+}
+
+#[macro_export]
+/// Create an `OrderSet` from a list of values
+///
+/// ## Example
+///
+/// ```
+/// #[macro_use] extern crate ordermap;
+/// # fn main() {
+///
+/// let set = orderset!{
+///     "a",
+///     "b",
+/// };
+/// assert!(set.contains("a"));
+/// assert!(set.contains("b"));
+/// assert!(!set.contains("c"));
+///
+/// // "a" is the first value
+/// assert_eq!(set.iter().next(), Some(&"a"));
+/// # }
+/// ```
+macro_rules! orderset {
+    (@single $($x:tt)*) => (());
+    (@count $($rest:expr),*) => (<[()]>::len(&[$(orderset!(@single $rest)),*]));
+
+    ($($value:expr,)+) => { orderset!($($value),+) };
+    ($($value:expr),*) => {
+        {
+            let _cap = orderset!(@count $($value),*);
+            let mut _set = $crate::OrderSet::with_capacity(_cap);
+            $(
+                _set.insert($value);
+            )*
+            _set
+        }
+    };
+}
+
+// generate all the Iterator methods by just forwarding to the underlying
+// self.iter and mapping its element.
+macro_rules! iterator_methods {
+    // $map_elt is the mapping function from the underlying iterator's element
+    // same mapping function for both options and iterators
+    ($map_elt:expr) => {
+        fn next(&mut self) -> Option<Self::Item> {
+            self.iter.next().map($map_elt)
+        }
+
+        fn size_hint(&self) -> (usize, Option<usize>) {
+            self.iter.size_hint()
+        }
+
+        fn count(self) -> usize {
+            self.iter.len()
+        }
+
+        fn nth(&mut self, n: usize) -> Option<Self::Item> {
+            self.iter.nth(n).map($map_elt)
+        }
+
+        fn last(mut self) -> Option<Self::Item> {
+            self.next_back()
+        }
+
+        fn collect<C>(self) -> C
+            where C: FromIterator<Self::Item>
+        {
+            // NB: forwarding this directly to standard iterators will
+            // allow it to leverage unstable traits like `TrustedLen`.
+            self.iter.map($map_elt).collect()
+        }
+    }
+}
+
+macro_rules! double_ended_iterator_methods {
+    // $map_elt is the mapping function from the underlying iterator's element
+    // same mapping function for both options and iterators
+    ($map_elt:expr) => {
+        fn next_back(&mut self) -> Option<Self::Item> {
+            self.iter.next_back().map($map_elt)
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/mutable_keys.rs
@@ -0,0 +1,76 @@
+
+use std::hash::Hash;
+use std::hash::BuildHasher;
+
+use super::{OrderMap, Equivalent};
+
+pub struct PrivateMarker { }
+
+/// Opt-in mutable access to keys.
+///
+/// These methods expose `&mut K`, mutable references to the key as it is stored
+/// in the map.
+/// You are allowed to modify the keys in the hashmap **if the modifcation
+/// does not change the key’s hash and equality**.
+///
+/// If keys are modified erronously, you can no longer look them up.
+/// This is sound (memory safe) but a logical error hazard (just like
+/// implementing PartialEq, Eq, or Hash incorrectly would be).
+///
+/// `use` this trait to enable its methods for `OrderMap`.
+pub trait MutableKeys {
+    type Key;
+    type Value;
+    
+    /// Return item index, mutable reference to key and value
+    fn get_full_mut2<Q: ?Sized>(&mut self, key: &Q)
+        -> Option<(usize, &mut Self::Key, &mut Self::Value)>
+        where Q: Hash + Equivalent<Self::Key>;
+
+    /// Scan through each key-value pair in the map and keep those where the
+    /// closure `keep` returns `true`.
+    ///
+    /// The elements are visited in order, and remaining elements keep their
+    /// order.
+    ///
+    /// Computes in **O(n)** time (average).
+    fn retain2<F>(&mut self, keep: F)
+        where F: FnMut(&mut Self::Key, &mut Self::Value) -> bool;
+
+    /// This method is not useful in itself – it is there to “seal” the trait
+    /// for external implementation, so that we can add methods without
+    /// causing breaking changes.
+    fn __private_marker(&self) -> PrivateMarker;
+}
+
+/// Opt-in mutable access to keys.
+///
+/// See [`MutableKeys`](trait.MutableKeys.html) for more information.
+impl<K, V, S> MutableKeys for OrderMap<K, V, S>
+    where K: Eq + Hash,
+          S: BuildHasher,
+{
+    type Key = K;
+    type Value = V;
+    fn get_full_mut2<Q: ?Sized>(&mut self, key: &Q)
+        -> Option<(usize, &mut K, &mut V)>
+        where Q: Hash + Equivalent<K>,
+    {
+        if let Some((_, found)) = self.find(key) {
+            let entry = &mut self.entries[found];
+            Some((found, &mut entry.key, &mut entry.value))
+        } else {
+            None
+        }
+    }
+
+    fn retain2<F>(&mut self, keep: F)
+        where F: FnMut(&mut K, &mut V) -> bool,
+    {
+        self.retain_mut(keep)
+    }
+
+    fn __private_marker(&self) -> PrivateMarker {
+        PrivateMarker { }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/serde.rs
@@ -0,0 +1,123 @@
+
+extern crate serde;
+
+use self::serde::ser::{Serialize, Serializer, SerializeMap, SerializeSeq};
+use self::serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor};
+
+use std::fmt::{self, Formatter};
+use std::hash::{BuildHasher, Hash};
+use std::marker::PhantomData;
+
+use OrderMap;
+
+/// Requires crate feature `"serde-1"`
+impl<K, V, S> Serialize for OrderMap<K, V, S>
+    where K: Serialize + Hash + Eq,
+          V: Serialize,
+          S: BuildHasher
+{
+    fn serialize<T>(&self, serializer: T) -> Result<T::Ok, T::Error>
+        where T: Serializer
+    {
+        let mut map_serializer = try!(serializer.serialize_map(Some(self.len())));
+        for (key, value) in self {
+            try!(map_serializer.serialize_entry(key, value));
+        }
+        map_serializer.end()
+    }
+}
+
+struct OrderMapVisitor<K, V, S>(PhantomData<(K, V, S)>);
+
+impl<'de, K, V, S> Visitor<'de> for OrderMapVisitor<K, V, S>
+    where K: Deserialize<'de> + Eq + Hash,
+          V: Deserialize<'de>,
+          S: Default + BuildHasher
+{
+    type Value = OrderMap<K, V, S>;
+
+    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+        write!(formatter, "a map")
+    }
+
+    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
+        where A: MapAccess<'de>
+    {
+        let mut values = OrderMap::with_capacity_and_hasher(map.size_hint().unwrap_or(0), S::default());
+
+        while let Some((key, value)) = try!(map.next_entry()) {
+            values.insert(key, value);
+        }
+
+        Ok(values)
+    }
+}
+
+/// Requires crate feature `"serde-1"`
+impl<'de, K, V, S> Deserialize<'de> for OrderMap<K, V, S>
+    where K: Deserialize<'de> + Eq + Hash,
+          V: Deserialize<'de>,
+          S: Default + BuildHasher
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        deserializer.deserialize_map(OrderMapVisitor(PhantomData))
+    }
+}
+
+
+use OrderSet;
+
+/// Requires crate feature `"serde-1"`
+impl<T, S> Serialize for OrderSet<T, S>
+    where T: Serialize + Hash + Eq,
+          S: BuildHasher
+{
+    fn serialize<Se>(&self, serializer: Se) -> Result<Se::Ok, Se::Error>
+        where Se: Serializer
+    {
+        let mut set_serializer = try!(serializer.serialize_seq(Some(self.len())));
+        for value in self {
+            try!(set_serializer.serialize_element(value));
+        }
+        set_serializer.end()
+    }
+}
+
+struct OrderSetVisitor<T, S>(PhantomData<(T, S)>);
+
+impl<'de, T, S> Visitor<'de> for OrderSetVisitor<T, S>
+    where T: Deserialize<'de> + Eq + Hash,
+          S: Default + BuildHasher
+{
+    type Value = OrderSet<T, S>;
+
+    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+        write!(formatter, "a set")
+    }
+
+    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
+        where A: SeqAccess<'de>
+    {
+        let mut values = OrderSet::with_capacity_and_hasher(seq.size_hint().unwrap_or(0), S::default());
+
+        while let Some(value) = try!(seq.next_element()) {
+            values.insert(value);
+        }
+
+        Ok(values)
+    }
+}
+
+/// Requires crate feature `"serde-1"`
+impl<'de, T, S> Deserialize<'de> for OrderSet<T, S>
+    where T: Deserialize<'de> + Eq + Hash,
+          S: Default + BuildHasher
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        deserializer.deserialize_seq(OrderSetVisitor(PhantomData))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/set.rs
@@ -0,0 +1,1136 @@
+//! A hash set implemented using `OrderMap`
+
+use std::cmp::Ordering;
+use std::collections::hash_map::RandomState;
+use std::fmt;
+use std::iter::{FromIterator, Chain};
+use std::hash::{Hash, BuildHasher};
+use std::mem::replace;
+use std::ops::RangeFull;
+use std::ops::{BitAnd, BitOr, BitXor, Sub};
+use std::slice;
+use std::vec;
+
+use super::{OrderMap, Equivalent};
+
+type Bucket<T> = super::Bucket<T, ()>;
+
+/// A hash set where the iteration order of the values is independent of their
+/// hash values.
+///
+/// The interface is closely compatible with the standard `HashSet`, but also
+/// has additional features.
+///
+/// # Order
+///
+/// The values have a consistent order that is determined by the sequence of
+/// insertion and removal calls on the set. The order does not depend on the
+/// values or the hash function at all. Note that insertion order and value
+/// are not affected if a re-insertion is attempted once an element is
+/// already present.
+///
+/// All iterators traverse the set *in order*.  Set operation iterators like
+/// `union` produce a concatenated order, as do their matching "bitwise"
+/// operators.  See their documentation for specifics.
+///
+/// # Indices
+///
+/// The values are indexed in a compact range without holes in the range
+/// `0..self.len()`. For example, the method `.get_full` looks up the index for
+/// a value, and the method `.get_index` looks up the value by index.
+///
+/// # Examples
+///
+/// ```
+/// use ordermap::OrderSet;
+///
+/// // Collects which letters appear in a sentence.
+/// let letters: OrderSet<_> = "a short treatise on fungi".chars().collect();
+/// 
+/// assert!(letters.contains(&'s'));
+/// assert!(letters.contains(&'t'));
+/// assert!(letters.contains(&'u'));
+/// assert!(!letters.contains(&'y'));
+/// ```
+#[derive(Clone)]
+pub struct OrderSet<T, S = RandomState> {
+    map: OrderMap<T, (), S>,
+}
+
+impl<T, S> fmt::Debug for OrderSet<T, S>
+    where T: fmt::Debug + Hash + Eq,
+          S: BuildHasher,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if cfg!(not(feature = "test_debug")) {
+            f.debug_set().entries(self.iter()).finish()
+        } else {
+            // Let the inner `OrderMap` print all of its details
+            f.debug_struct("OrderSet").field("map", &self.map).finish()
+        }
+    }
+}
+
+impl<T> OrderSet<T> {
+    /// Create a new set. (Does not allocate.)
+    pub fn new() -> Self {
+        OrderSet { map: OrderMap::new() }
+    }
+
+    /// Create a new set with capacity for `n` elements.
+    /// (Does not allocate if `n` is zero.)
+    ///
+    /// Computes in **O(n)** time.
+    pub fn with_capacity(n: usize) -> Self {
+        OrderSet { map: OrderMap::with_capacity(n) }
+    }
+}
+
+impl<T, S> OrderSet<T, S> {
+    /// Create a new set with capacity for `n` elements.
+    /// (Does not allocate if `n` is zero.)
+    ///
+    /// Computes in **O(n)** time.
+    pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self
+        where S: BuildHasher
+    {
+        OrderSet { map: OrderMap::with_capacity_and_hasher(n, hash_builder) }
+    }
+
+    /// Return the number of elements in the set.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn len(&self) -> usize {
+        self.map.len()
+    }
+
+    /// Returns true if the set contains no elements.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn is_empty(&self) -> bool {
+        self.map.is_empty()
+    }
+
+    /// Create a new set with `hash_builder`
+    pub fn with_hasher(hash_builder: S) -> Self
+        where S: BuildHasher
+    {
+        OrderSet { map: OrderMap::with_hasher(hash_builder) }
+    }
+
+    /// Return a reference to the set's `BuildHasher`.
+    pub fn hasher(&self) -> &S
+        where S: BuildHasher
+    {
+        self.map.hasher()
+    }
+
+    /// Computes in **O(1)** time.
+    pub fn capacity(&self) -> usize {
+        self.map.capacity()
+    }
+}
+
+impl<T, S> OrderSet<T, S>
+    where T: Hash + Eq,
+          S: BuildHasher,
+{
+    /// Remove all elements in the set, while preserving its capacity.
+    ///
+    /// Computes in **O(n)** time.
+    pub fn clear(&mut self) {
+        self.map.clear();
+    }
+
+    /// FIXME Not implemented fully yet
+    pub fn reserve(&mut self, additional: usize) {
+        self.map.reserve(additional);
+    }
+
+    /// Insert the value into the set.
+    ///
+    /// If an equivalent item already exists in the set, it returns
+    /// `false` leaving the original value in the set and without
+    /// altering its insertion order. Otherwise, it inserts the new
+    /// item and returns `true`.
+    ///
+    /// Computes in **O(1)** time (amortized average).
+    pub fn insert(&mut self, value: T) -> bool {
+        self.map.insert(value, ()).is_none()
+    }
+
+    /// Return an iterator over the values of the set, in their order
+    pub fn iter(&self) -> Iter<T> {
+        Iter {
+            iter: self.map.keys().iter
+        }
+    }
+
+    /// Return an iterator over the values that are in `self` but not `other`.
+    ///
+    /// Values are produced in the same order that they appear in `self`.
+    pub fn difference<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Difference<'a, T, S2>
+        where S2: BuildHasher
+    {
+        Difference {
+            iter: self.iter(),
+            other: other,
+        }
+    }
+
+    /// Return an iterator over the values that are in `self` or `other`,
+    /// but not in both.
+    ///
+    /// Values from `self` are produced in their original order, followed by
+    /// values from `other` in their original order.
+    pub fn symmetric_difference<'a, S2>(&'a self, other: &'a OrderSet<T, S2>)
+        -> SymmetricDifference<'a, T, S, S2>
+        where S2: BuildHasher
+    {
+        SymmetricDifference {
+            iter: self.difference(other).chain(other.difference(self)),
+        }
+    }
+
+    /// Return an iterator over the values that are in both `self` and `other`.
+    ///
+    /// Values are produced in the same order that they appear in `self`.
+    pub fn intersection<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Intersection<'a, T, S2>
+        where S2: BuildHasher
+    {
+        Intersection {
+            iter: self.iter(),
+            other: other,
+        }
+    }
+
+    /// Return an iterator over all values that are in `self` or `other`.
+    ///
+    /// Values from `self` are produced in their original order, followed by
+    /// values that are unique to `other` in their original order.
+    pub fn union<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Union<'a, T, S>
+        where S2: BuildHasher
+    {
+        Union {
+            iter: self.iter().chain(other.difference(self)),
+        }
+    }
+
+    /// Return `true` if an equivalent to `value` exists in the set.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.contains_key(value)
+    }
+
+    /// Return a reference to the value stored in the set, if it is present,
+    /// else `None`.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.get_full(value).map(|(_, x, &())| x)
+    }
+
+    /// Return item index and value
+    pub fn get_full<Q: ?Sized>(&self, value: &Q) -> Option<(usize, &T)>
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.get_full(value).map(|(i, x, &())| (i, x))
+    }
+
+    /// Adds a value to the set, replacing the existing value, if any, that is
+    /// equal to the given one. Returns the replaced value.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn replace(&mut self, value: T) -> Option<T>
+    {
+        use super::Entry::*;
+
+        match self.map.entry(value) {
+            Vacant(e) => { e.insert(()); None },
+            Occupied(e) => {
+                // FIXME uses private fields!
+                let old_key = &mut e.map.entries[e.index].key;
+                Some(replace(old_key, e.key))
+            }
+        }
+    }
+
+    /// FIXME Same as .swap_remove
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
+        where Q: Hash + Equivalent<T>,
+    {
+        self.swap_remove(value)
+    }
+
+    /// Remove the value from the set, and return `true` if it was present.
+    ///
+    /// Like `Vec::swap_remove`, the value is removed by swapping it with the
+    /// last element of the set and popping it off. **This perturbs
+    /// the postion of what used to be the last element!**
+    ///
+    /// Return `false` if `value` was not in the set.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.swap_remove(value).is_some()
+    }
+
+    /// FIXME Same as .swap_take
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
+        where Q: Hash + Equivalent<T>,
+    {
+        self.swap_take(value)
+    }
+
+    /// Removes and returns the value in the set, if any, that is equal to the
+    /// given one.
+    ///
+    /// Like `Vec::swap_remove`, the value is removed by swapping it with the
+    /// last element of the set and popping it off. **This perturbs
+    /// the postion of what used to be the last element!**
+    ///
+    /// Return `None` if `value` was not in the set.
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn swap_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.swap_remove_full(value).map(|(_, x, ())| x)
+    }
+
+    /// Remove the value from the set return it and the index it had.
+    ///
+    /// Like `Vec::swap_remove`, the value is removed by swapping it with the
+    /// last element of the set and popping it off. **This perturbs
+    /// the postion of what used to be the last element!**
+    ///
+    /// Return `None` if `value` was not in the set.
+    pub fn swap_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)>
+        where Q: Hash + Equivalent<T>,
+    {
+        self.map.swap_remove_full(value).map(|(i, x, ())| (i, x))
+    }
+
+    /// Remove the last value
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn pop(&mut self) -> Option<T> {
+        self.map.pop().map(|(x, ())| x)
+    }
+
+    /// Scan through each value in the set and keep those where the
+    /// closure `keep` returns `true`.
+    ///
+    /// The elements are visited in order, and remaining elements keep their
+    /// order.
+    ///
+    /// Computes in **O(n)** time (average).
+    pub fn retain<F>(&mut self, mut keep: F)
+        where F: FnMut(&T) -> bool,
+    {
+        self.map.retain(move |x, &mut ()| keep(x))
+    }
+
+    /// Sort the set’s values by their default ordering.
+    ///
+    /// See `sort_by` for details.
+    pub fn sort(&mut self)
+        where T: Ord,
+    {
+        self.map.sort_keys()
+    }
+
+    /// Sort the set’s values in place using the comparison function `compare`.
+    ///
+    /// Computes in **O(n log n)** time and **O(n)** space. The sort is stable.
+    pub fn sort_by<F>(&mut self, mut compare: F)
+        where F: FnMut(&T, &T) -> Ordering,
+    {
+        self.map.sort_by(move |a, _, b, _| compare(a, b));
+    }
+
+    /// Sort the values of the set and return a by value iterator of
+    /// the values with the result.
+    ///
+    /// The sort is stable.
+    pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<T>
+        where F: FnMut(&T, &T) -> Ordering
+    {
+        IntoIter {
+            iter: self.map.sorted_by(move |a, &(), b, &()| cmp(a, b)).iter,
+        }
+    }
+
+    /// Clears the `OrderSet`, returning all values as a drain iterator.
+    /// Keeps the allocated memory for reuse.
+    pub fn drain(&mut self, range: RangeFull) -> Drain<T> {
+        Drain {
+            iter: self.map.drain(range).iter,
+        }
+    }
+}
+
+impl<T, S> OrderSet<T, S> {
+    /// Get a value by index
+    ///
+    /// Valid indices are *0 <= index < self.len()*
+    ///
+    /// Computes in **O(1)** time.
+    pub fn get_index(&self, index: usize) -> Option<&T> {
+        self.map.get_index(index).map(|(x, &())| x)
+    }
+
+    /// Remove the key-value pair by index
+    ///
+    /// Valid indices are *0 <= index < self.len()*
+    ///
+    /// Computes in **O(1)** time (average).
+    pub fn swap_remove_index(&mut self, index: usize) -> Option<T> {
+        self.map.swap_remove_index(index).map(|(x, ())| x)
+    }
+}
+
+
+pub struct IntoIter<T> {
+    iter: vec::IntoIter<Bucket<T>>,
+}
+
+impl<T> Iterator for IntoIter<T> {
+    type Item = T;
+
+    iterator_methods!(|entry| entry.key);
+}
+
+impl<T> DoubleEndedIterator for IntoIter<T> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|entry| entry.key)
+    }
+}
+
+impl<T> ExactSizeIterator for IntoIter<T> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+
+pub struct Iter<'a, T: 'a> {
+    iter: slice::Iter<'a, Bucket<T>>,
+}
+
+impl<'a, T> Iterator for Iter<'a, T> {
+    type Item = &'a T;
+
+    iterator_methods!(|entry| &entry.key);
+}
+
+impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|entry| &entry.key)
+    }
+}
+
+impl<'a, T> ExactSizeIterator for Iter<'a, T> {
+    fn len(&self) -> usize {
+        self.iter.len()
+    }
+}
+
+pub struct Drain<'a, T: 'a> {
+    iter: vec::Drain<'a, Bucket<T>>,
+}
+
+impl<'a, T> Iterator for Drain<'a, T> {
+    type Item = T;
+
+    iterator_methods!(|bucket| bucket.key);
+}
+
+impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
+    double_ended_iterator_methods!(|bucket| bucket.key);
+}
+
+impl<'a, T, S> IntoIterator for &'a OrderSet<T, S>
+    where T: Hash + Eq,
+          S: BuildHasher,
+{
+    type Item = &'a T;
+    type IntoIter = Iter<'a, T>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.iter()
+    }
+}
+
+impl<T, S> IntoIterator for OrderSet<T, S>
+    where T: Hash + Eq,
+          S: BuildHasher,
+{
+    type Item = T;
+    type IntoIter = IntoIter<T>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        IntoIter {
+            iter: self.map.into_iter().iter,
+        }
+    }
+}
+
+impl<T, S> FromIterator<T> for OrderSet<T, S>
+    where T: Hash + Eq,
+          S: BuildHasher + Default,
+{
+    fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> Self {
+        let iter = iterable.into_iter().map(|x| (x, ()));
+        OrderSet { map: OrderMap::from_iter(iter) }
+    }
+}
+
+impl<T, S> Extend<T> for OrderSet<T, S>
+    where T: Hash + Eq,
+          S: BuildHasher,
+{
+    fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
+        let iter = iterable.into_iter().map(|x| (x, ()));
+        self.map.extend(iter);
+    }
+}
+
+impl<'a, T, S> Extend<&'a T> for OrderSet<T, S>
+    where T: Hash + Eq + Copy,
+          S: BuildHasher,
+{
+    fn extend<I: IntoIterator<Item=&'a T>>(&mut self, iterable: I) {
+        let iter = iterable.into_iter().map(|&x| x);
+        self.extend(iter);
+    }
+}
+
+
+impl<T, S> Default for OrderSet<T, S>
+    where S: BuildHasher + Default,
+{
+    /// Return an empty `OrderSet`
+    fn default() -> Self {
+        OrderSet { map: OrderMap::default() }
+    }
+}
+
+impl<T, S1, S2> PartialEq<OrderSet<T, S2>> for OrderSet<T, S1>
+    where T: Hash + Eq,
+          S1: BuildHasher,
+          S2: BuildHasher
+{
+    fn eq(&self, other: &OrderSet<T, S2>) -> bool {
+        self.len() == other.len() && self.is_subset(other)
+    }
+}
+
+impl<T, S> Eq for OrderSet<T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+}
+
+impl<T, S> OrderSet<T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+    /// Returns `true` if `self` has no elements in common with `other`.
+    pub fn is_disjoint<S2>(&self, other: &OrderSet<T, S2>) -> bool
+        where S2: BuildHasher
+    {
+        if self.len() <= other.len() {
+            self.iter().all(move |value| !other.contains(value))
+        } else {
+            other.iter().all(move |value| !self.contains(value))
+        }
+    }
+
+    /// Returns `true` if all elements of `self` are contained in `other`.
+    pub fn is_subset<S2>(&self, other: &OrderSet<T, S2>) -> bool
+        where S2: BuildHasher
+    {
+        self.len() <= other.len() && self.iter().all(move |value| other.contains(value))
+    }
+
+    /// Returns `true` if all elements of `other` are contained in `self`.
+    pub fn is_superset<S2>(&self, other: &OrderSet<T, S2>) -> bool
+        where S2: BuildHasher
+    {
+        other.is_subset(self)
+    }
+}
+
+
+pub struct Difference<'a, T: 'a, S: 'a> {
+    iter: Iter<'a, T>,
+    other: &'a OrderSet<T, S>,
+}
+
+impl<'a, T, S> Iterator for Difference<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+    type Item = &'a T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        while let Some(item) = self.iter.next() {
+            if !self.other.contains(item) {
+                return Some(item);
+            }
+        }
+        None
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (0, self.iter.size_hint().1)
+    }
+}
+
+impl<'a, T, S> DoubleEndedIterator for Difference<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        while let Some(item) = self.iter.next_back() {
+            if !self.other.contains(item) {
+                return Some(item);
+            }
+        }
+        None
+    }
+}
+
+
+pub struct Intersection<'a, T: 'a, S: 'a> {
+    iter: Iter<'a, T>,
+    other: &'a OrderSet<T, S>,
+}
+
+impl<'a, T, S> Iterator for Intersection<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+    type Item = &'a T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        while let Some(item) = self.iter.next() {
+            if self.other.contains(item) {
+                return Some(item);
+            }
+        }
+        None
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        (0, self.iter.size_hint().1)
+    }
+}
+
+impl<'a, T, S> DoubleEndedIterator for Intersection<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        while let Some(item) = self.iter.next_back() {
+            if self.other.contains(item) {
+                return Some(item);
+            }
+        }
+        None
+    }
+}
+
+
+pub struct SymmetricDifference<'a, T: 'a, S1: 'a, S2: 'a> {
+    iter: Chain<Difference<'a, T, S2>, Difference<'a, T, S1>>,
+}
+
+impl<'a, T, S1, S2> Iterator for SymmetricDifference<'a, T, S1, S2>
+    where T: Eq + Hash,
+          S1: BuildHasher,
+          S2: BuildHasher,
+{
+    type Item = &'a T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next()
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+
+    fn fold<B, F>(self, init: B, f: F) -> B
+        where F: FnMut(B, Self::Item) -> B
+    {
+        self.iter.fold(init, f)
+    }
+}
+
+impl<'a, T, S1, S2> DoubleEndedIterator for SymmetricDifference<'a, T, S1, S2>
+    where T: Eq + Hash,
+          S1: BuildHasher,
+          S2: BuildHasher,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back()
+    }
+}
+
+
+pub struct Union<'a, T: 'a, S: 'a> {
+    iter: Chain<Iter<'a, T>, Difference<'a, T, S>>,
+}
+
+impl<'a, T, S> Iterator for Union<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher,
+{
+    type Item = &'a T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next()
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+
+    fn fold<B, F>(self, init: B, f: F) -> B
+        where F: FnMut(B, Self::Item) -> B
+    {
+        self.iter.fold(init, f)
+    }
+}
+
+impl<'a, T, S> DoubleEndedIterator for Union<'a, T, S>
+    where T: Eq + Hash,
+          S: BuildHasher,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back()
+    }
+}
+
+
+impl<'a, 'b, T, S1, S2> BitAnd<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1>
+    where T: Eq + Hash + Clone,
+          S1: BuildHasher + Default,
+          S2: BuildHasher,
+{
+    type Output = OrderSet<T, S1>;
+
+    /// Returns the set intersection, cloned into a new set.
+    ///
+    /// Values are collected in the same order that they appear in `self`.
+    fn bitand(self, other: &'b OrderSet<T, S2>) -> Self::Output {
+        self.intersection(other).cloned().collect()
+    }
+}
+
+impl<'a, 'b, T, S1, S2> BitOr<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1>
+    where T: Eq + Hash + Clone,
+          S1: BuildHasher + Default,
+          S2: BuildHasher,
+{
+    type Output = OrderSet<T, S1>;
+
+    /// Returns the set union, cloned into a new set.
+    ///
+    /// Values from `self` are collected in their original order, followed by
+    /// values that are unique to `other` in their original order.
+    fn bitor(self, other: &'b OrderSet<T, S2>) -> Self::Output {
+        self.union(other).cloned().collect()
+    }
+}
+
+impl<'a, 'b, T, S1, S2> BitXor<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1>
+    where T: Eq + Hash + Clone,
+          S1: BuildHasher + Default,
+          S2: BuildHasher,
+{
+    type Output = OrderSet<T, S1>;
+
+    /// Returns the set symmetric-difference, cloned into a new set.
+    ///
+    /// Values from `self` are collected in their original order, followed by
+    /// values from `other` in their original order.
+    fn bitxor(self, other: &'b OrderSet<T, S2>) -> Self::Output {
+        self.symmetric_difference(other).cloned().collect()
+    }
+}
+
+impl<'a, 'b, T, S1, S2> Sub<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1>
+    where T: Eq + Hash + Clone,
+          S1: BuildHasher + Default,
+          S2: BuildHasher,
+{
+    type Output = OrderSet<T, S1>;
+
+    /// Returns the set difference, cloned into a new set.
+    ///
+    /// Values are collected in the same order that they appear in `self`.
+    fn sub(self, other: &'b OrderSet<T, S2>) -> Self::Output {
+        self.difference(other).cloned().collect()
+    }
+}
+
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use util::enumerate;
+
+    #[test]
+    fn it_works() {
+        let mut set = OrderSet::new();
+        assert_eq!(set.is_empty(), true);
+        set.insert(1);
+        set.insert(1);
+        assert_eq!(set.len(), 1);
+        assert!(set.get(&1).is_some());
+        assert_eq!(set.is_empty(), false);
+    }
+
+    #[test]
+    fn new() {
+        let set = OrderSet::<String>::new();
+        println!("{:?}", set);
+        assert_eq!(set.capacity(), 0);
+        assert_eq!(set.len(), 0);
+        assert_eq!(set.is_empty(), true);
+    }
+
+    #[test]
+    fn insert() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5];
+        let not_present = [1, 3, 6, 9, 10];
+        let mut set = OrderSet::with_capacity(insert.len());
+
+        for (i, &elt) in enumerate(&insert) {
+            assert_eq!(set.len(), i);
+            set.insert(elt);
+            assert_eq!(set.len(), i + 1);
+            assert_eq!(set.get(&elt), Some(&elt));
+        }
+        println!("{:?}", set);
+
+        for &elt in &not_present {
+            assert!(set.get(&elt).is_none());
+        }
+    }
+
+    #[test]
+    fn insert_2() {
+        let mut set = OrderSet::with_capacity(16);
+
+        let mut values = vec![];
+        values.extend(0..16);
+        values.extend(128..267);
+
+        for &i in &values {
+            let old_set = set.clone();
+            set.insert(i);
+            for value in old_set.iter() {
+                if !set.get(value).is_some() {
+                    println!("old_set: {:?}", old_set);
+                    println!("set: {:?}", set);
+                    panic!("did not find {} in set", value);
+                }
+            }
+        }
+
+        for &i in &values {
+            assert!(set.get(&i).is_some(), "did not find {}", i);
+        }
+    }
+
+    #[test]
+    fn insert_dup() {
+        let mut elements = vec![0, 2, 4, 6, 8];
+        let mut set: OrderSet<u8> = elements.drain(..).collect();
+        {
+            let (i, v) = set.get_full(&0).unwrap();
+            assert_eq!(set.len(), 5);
+            assert_eq!(i, 0);
+            assert_eq!(*v, 0);
+        }
+        {
+            let inserted = set.insert(0);
+            let (i, v) = set.get_full(&0).unwrap();
+            assert_eq!(set.len(), 5);
+            assert_eq!(inserted, false);
+            assert_eq!(i, 0);
+            assert_eq!(*v, 0);
+        }
+    }
+
+    #[test]
+    fn insert_order() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut set = OrderSet::new();
+
+        for &elt in &insert {
+            set.insert(elt);
+        }
+
+        assert_eq!(set.iter().count(), set.len());
+        assert_eq!(set.iter().count(), insert.len());
+        for (a, b) in insert.iter().zip(set.iter()) {
+            assert_eq!(a, b);
+        }
+        for (i, v) in (0..insert.len()).zip(set.iter()) {
+            assert_eq!(set.get_index(i).unwrap(), v);
+        }
+    }
+
+    #[test]
+    fn grow() {
+        let insert = [0, 4, 2, 12, 8, 7, 11];
+        let not_present = [1, 3, 6, 9, 10];
+        let mut set = OrderSet::with_capacity(insert.len());
+
+
+        for (i, &elt) in enumerate(&insert) {
+            assert_eq!(set.len(), i);
+            set.insert(elt);
+            assert_eq!(set.len(), i + 1);
+            assert_eq!(set.get(&elt), Some(&elt));
+        }
+
+        println!("{:?}", set);
+        for &elt in &insert {
+            set.insert(elt * 10);
+        }
+        for &elt in &insert {
+            set.insert(elt * 100);
+        }
+        for (i, &elt) in insert.iter().cycle().enumerate().take(100) {
+            set.insert(elt * 100 + i as i32);
+        }
+        println!("{:?}", set);
+        for &elt in &not_present {
+            assert!(set.get(&elt).is_none());
+        }
+    }
+
+    #[test]
+    fn remove() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut set = OrderSet::new();
+
+        for &elt in &insert {
+            set.insert(elt);
+        }
+
+        assert_eq!(set.iter().count(), set.len());
+        assert_eq!(set.iter().count(), insert.len());
+        for (a, b) in insert.iter().zip(set.iter()) {
+            assert_eq!(a, b);
+        }
+
+        let remove_fail = [99, 77];
+        let remove = [4, 12, 8, 7];
+
+        for &value in &remove_fail {
+            assert!(set.swap_remove_full(&value).is_none());
+        }
+        println!("{:?}", set);
+        for &value in &remove {
+        //println!("{:?}", set);
+            let index = set.get_full(&value).unwrap().0;
+            assert_eq!(set.swap_remove_full(&value), Some((index, value)));
+        }
+        println!("{:?}", set);
+
+        for value in &insert {
+            assert_eq!(set.get(value).is_some(), !remove.contains(value));
+        }
+        assert_eq!(set.len(), insert.len() - remove.len());
+        assert_eq!(set.iter().count(), insert.len() - remove.len());
+    }
+
+    #[test]
+    fn swap_remove_index() {
+        let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
+        let mut set = OrderSet::new();
+
+        for &elt in &insert {
+            set.insert(elt);
+        }
+
+        let mut vector = insert.to_vec();
+        let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1];
+
+        // check that the same swap remove sequence on vec and set
+        // have the same result.
+        for &rm in remove_sequence {
+            let out_vec = vector.swap_remove(rm);
+            let out_set = set.swap_remove_index(rm).unwrap();
+            assert_eq!(out_vec, out_set);
+        }
+        assert_eq!(vector.len(), set.len());
+        for (a, b) in vector.iter().zip(set.iter()) {
+            assert_eq!(a, b);
+        }
+    }
+
+    #[test]
+    fn partial_eq_and_eq() {
+        let mut set_a = OrderSet::new();
+        set_a.insert(1);
+        set_a.insert(2);
+        let mut set_b = set_a.clone();
+        assert_eq!(set_a, set_b);
+        set_b.remove(&1);
+        assert_ne!(set_a, set_b);
+
+        let set_c: OrderSet<_> = set_b.into_iter().collect();
+        assert_ne!(set_a, set_c);
+        assert_ne!(set_c, set_a);
+    }
+
+    #[test]
+    fn extend() {
+        let mut set = OrderSet::new();
+        set.extend(vec![&1, &2, &3, &4]);
+        set.extend(vec![5, 6]);
+        assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6]);
+    }
+
+    #[test]
+    fn comparisons() {
+        let set_a: OrderSet<_> = (0..3).collect();
+        let set_b: OrderSet<_> = (3..6).collect();
+        let set_c: OrderSet<_> = (0..6).collect();
+        let set_d: OrderSet<_> = (3..9).collect();
+
+        assert!(!set_a.is_disjoint(&set_a));
+        assert!(set_a.is_subset(&set_a));
+        assert!(set_a.is_superset(&set_a));
+
+        assert!(set_a.is_disjoint(&set_b));
+        assert!(set_b.is_disjoint(&set_a));
+        assert!(!set_a.is_subset(&set_b));
+        assert!(!set_b.is_subset(&set_a));
+        assert!(!set_a.is_superset(&set_b));
+        assert!(!set_b.is_superset(&set_a));
+
+        assert!(!set_a.is_disjoint(&set_c));
+        assert!(!set_c.is_disjoint(&set_a));
+        assert!(set_a.is_subset(&set_c));
+        assert!(!set_c.is_subset(&set_a));
+        assert!(!set_a.is_superset(&set_c));
+        assert!(set_c.is_superset(&set_a));
+
+        assert!(!set_c.is_disjoint(&set_d));
+        assert!(!set_d.is_disjoint(&set_c));
+        assert!(!set_c.is_subset(&set_d));
+        assert!(!set_d.is_subset(&set_c));
+        assert!(!set_c.is_superset(&set_d));
+        assert!(!set_d.is_superset(&set_c));
+    }
+
+    #[test]
+    fn iter_comparisons() {
+        use std::iter::empty;
+
+        fn check<'a, I1, I2>(iter1: I1, iter2: I2)
+            where I1: Iterator<Item = &'a i32>,
+                  I2: Iterator<Item = i32>,
+        {
+            assert!(iter1.cloned().eq(iter2));
+        }
+
+        let set_a: OrderSet<_> = (0..3).collect();
+        let set_b: OrderSet<_> = (3..6).collect();
+        let set_c: OrderSet<_> = (0..6).collect();
+        let set_d: OrderSet<_> = (3..9).rev().collect();
+
+        check(set_a.difference(&set_a), empty());
+        check(set_a.symmetric_difference(&set_a), empty());
+        check(set_a.intersection(&set_a), 0..3);
+        check(set_a.union(&set_a), 0..3);
+
+        check(set_a.difference(&set_b), 0..3);
+        check(set_b.difference(&set_a), 3..6);
+        check(set_a.symmetric_difference(&set_b), 0..6);
+        check(set_b.symmetric_difference(&set_a), (3..6).chain(0..3));
+        check(set_a.intersection(&set_b), empty());
+        check(set_b.intersection(&set_a), empty());
+        check(set_a.union(&set_b), 0..6);
+        check(set_b.union(&set_a), (3..6).chain(0..3));
+
+        check(set_a.difference(&set_c), empty());
+        check(set_c.difference(&set_a), 3..6);
+        check(set_a.symmetric_difference(&set_c), 3..6);
+        check(set_c.symmetric_difference(&set_a), 3..6);
+        check(set_a.intersection(&set_c), 0..3);
+        check(set_c.intersection(&set_a), 0..3);
+        check(set_a.union(&set_c), 0..6);
+        check(set_c.union(&set_a), 0..6);
+
+        check(set_c.difference(&set_d), 0..3);
+        check(set_d.difference(&set_c), (6..9).rev());
+        check(set_c.symmetric_difference(&set_d), (0..3).chain((6..9).rev()));
+        check(set_d.symmetric_difference(&set_c), (6..9).rev().chain(0..3));
+        check(set_c.intersection(&set_d), 3..6);
+        check(set_d.intersection(&set_c), (3..6).rev());
+        check(set_c.union(&set_d), (0..6).chain((6..9).rev()));
+        check(set_d.union(&set_c), (3..9).rev().chain(0..3));
+    }
+
+    #[test]
+    fn ops() {
+        let empty = OrderSet::<i32>::new();
+        let set_a: OrderSet<_> = (0..3).collect();
+        let set_b: OrderSet<_> = (3..6).collect();
+        let set_c: OrderSet<_> = (0..6).collect();
+        let set_d: OrderSet<_> = (3..9).rev().collect();
+
+        assert_eq!(&set_a & &set_a, set_a);
+        assert_eq!(&set_a | &set_a, set_a);
+        assert_eq!(&set_a ^ &set_a, empty);
+        assert_eq!(&set_a - &set_a, empty);
+
+        assert_eq!(&set_a & &set_b, empty);
+        assert_eq!(&set_b & &set_a, empty);
+        assert_eq!(&set_a | &set_b, set_c);
+        assert_eq!(&set_b | &set_a, set_c);
+        assert_eq!(&set_a ^ &set_b, set_c);
+        assert_eq!(&set_b ^ &set_a, set_c);
+        assert_eq!(&set_a - &set_b, set_a);
+        assert_eq!(&set_b - &set_a, set_b);
+
+        assert_eq!(&set_a & &set_c, set_a);
+        assert_eq!(&set_c & &set_a, set_a);
+        assert_eq!(&set_a | &set_c, set_c);
+        assert_eq!(&set_c | &set_a, set_c);
+        assert_eq!(&set_a ^ &set_c, set_b);
+        assert_eq!(&set_c ^ &set_a, set_b);
+        assert_eq!(&set_a - &set_c, empty);
+        assert_eq!(&set_c - &set_a, set_b);
+
+        assert_eq!(&set_c & &set_d, set_b);
+        assert_eq!(&set_d & &set_c, set_b);
+        assert_eq!(&set_c | &set_d, &set_a | &set_d);
+        assert_eq!(&set_d | &set_c, &set_a | &set_d);
+        assert_eq!(&set_c ^ &set_d, &set_a | &(&set_d - &set_b));
+        assert_eq!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b));
+        assert_eq!(&set_c - &set_d, set_a);
+        assert_eq!(&set_d - &set_c, &set_d - &set_b);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/src/util.rs
@@ -0,0 +1,17 @@
+
+use std::iter::Enumerate;
+use std::mem::size_of;
+
+pub fn third<A, B, C>(t: (A, B, C)) -> C { t.2 }
+
+pub fn enumerate<I>(iterable: I) -> Enumerate<I::IntoIter>
+    where I: IntoIterator
+{
+    iterable.into_iter().enumerate()
+}
+
+/// return the number of steps from a to b
+pub fn ptrdistance<T>(a: *const T, b: *const T) -> usize {
+    debug_assert!(a as usize <= b as usize);
+    (b as usize - a as usize) / size_of::<T>()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/tests/equivalent_trait.rs
@@ -0,0 +1,55 @@
+
+#[macro_use] extern crate ordermap;
+
+use ordermap::Equivalent;
+
+use std::hash::Hash;
+
+#[derive(Debug, Hash)]
+pub struct Pair<A, B>(pub A, pub B);
+
+impl<A, B, C, D> PartialEq<(A, B)> for Pair<C, D>
+    where C: PartialEq<A>,
+          D: PartialEq<B>,
+{
+    fn eq(&self, rhs: &(A, B)) -> bool {
+        self.0 == rhs.0 &&
+        self.1 == rhs.1 &&
+        true
+    }
+}
+
+impl<A, B, X> Equivalent<X> for Pair<A, B>
+    where Pair<A, B>: PartialEq<X>,
+          A: Hash + Eq,
+          B: Hash + Eq,
+{
+    fn equivalent(&self, other: &X) -> bool {
+        *self == *other
+    }
+}
+
+#[test]
+fn test_lookup() {
+    let s = String::from;
+    let map = ordermap! {
+        (s("a"), s("b")) => 1,
+        (s("a"), s("x")) => 2,
+    };
+
+    assert!(map.contains_key(&Pair("a", "b")));
+    assert!(!map.contains_key(&Pair("b", "a")));
+}
+
+#[test]
+fn test_string_str() {
+    let s = String::from;
+    let mut map = ordermap! {
+        s("a") => 1, s("b") => 2,
+        s("x") => 3, s("y") => 4,
+    };
+
+    assert!(map.contains_key("a"));
+    assert!(!map.contains_key("z"));
+    assert_eq!(map.remove("b"), Some(2));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/tests/quick.rs
@@ -0,0 +1,365 @@
+
+extern crate ordermap;
+extern crate itertools;
+#[macro_use]
+extern crate quickcheck;
+
+extern crate fnv;
+
+use ordermap::OrderMap;
+use itertools::Itertools;
+
+use quickcheck::Arbitrary;
+use quickcheck::Gen;
+
+use fnv::FnvHasher;
+use std::hash::{BuildHasher, BuildHasherDefault};
+type FnvBuilder = BuildHasherDefault<FnvHasher>;
+type OrderMapFnv<K, V> = OrderMap<K, V, FnvBuilder>;
+
+use std::collections::HashSet;
+use std::collections::HashMap;
+use std::iter::FromIterator;
+use std::hash::Hash;
+use std::fmt::Debug;
+use std::ops::Deref;
+use std::cmp::min;
+
+
+use ordermap::Entry as OEntry;
+use std::collections::hash_map::Entry as HEntry;
+
+
+fn set<'a, T: 'a, I>(iter: I) -> HashSet<T>
+    where I: IntoIterator<Item=&'a T>,
+    T: Copy + Hash + Eq
+{
+    iter.into_iter().cloned().collect()
+}
+
+fn ordermap<'a, T: 'a, I>(iter: I) -> OrderMap<T, ()>
+    where I: IntoIterator<Item=&'a T>,
+          T: Copy + Hash + Eq,
+{
+    OrderMap::from_iter(iter.into_iter().cloned().map(|k| (k, ())))
+}
+
+quickcheck! {
+    fn contains(insert: Vec<u32>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        insert.iter().all(|&key| map.get(&key).is_some())
+    }
+
+    fn contains_not(insert: Vec<u8>, not: Vec<u8>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        let nots = &set(&not) - &set(&insert);
+        nots.iter().all(|&key| map.get(&key).is_none())
+    }
+
+    fn insert_remove(insert: Vec<u8>, remove: Vec<u8>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        for &key in &remove {
+            map.swap_remove(&key);
+        }
+        let elements = &set(&insert) - &set(&remove);
+        map.len() == elements.len() && map.iter().count() == elements.len() &&
+            elements.iter().all(|k| map.get(k).is_some())
+    }
+
+    fn insertion_order(insert: Vec<u32>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        itertools::assert_equal(insert.iter().unique(), map.keys());
+        true
+    }
+
+    fn pop(insert: Vec<u8>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        let mut pops = Vec::new();
+        while let Some((key, _v)) = map.pop() {
+            pops.push(key);
+        }
+        pops.reverse();
+
+        itertools::assert_equal(insert.iter().unique(), &pops);
+        true
+    }
+
+    fn with_cap(cap: usize) -> bool {
+        let map: OrderMap<u8, u8> = OrderMap::with_capacity(cap);
+        println!("wish: {}, got: {} (diff: {})", cap, map.capacity(), map.capacity() as isize - cap as isize);
+        map.capacity() >= cap
+    }
+
+    fn drain(insert: Vec<u8>) -> bool {
+        let mut map = OrderMap::new();
+        for &key in &insert {
+            map.insert(key, ());
+        }
+        let mut clone = map.clone();
+        let drained = clone.drain(..);
+        for (key, _) in drained {
+            map.remove(&key);
+        }
+        map.is_empty()
+    }
+}
+
+use Op::*;
+#[derive(Copy, Clone, Debug)]
+enum Op<K, V> {
+    Add(K, V),
+    Remove(K),
+    AddEntry(K, V),
+    RemoveEntry(K),
+}
+
+impl<K, V> Arbitrary for Op<K, V>
+    where K: Arbitrary,
+          V: Arbitrary,
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        match g.gen::<u32>() % 4 {
+            0 => Add(K::arbitrary(g), V::arbitrary(g)),
+            1 => AddEntry(K::arbitrary(g), V::arbitrary(g)),
+            2 => Remove(K::arbitrary(g)),
+            _ => RemoveEntry(K::arbitrary(g)),
+        }
+    }
+}
+
+fn do_ops<K, V, S>(ops: &[Op<K, V>], a: &mut OrderMap<K, V, S>, b: &mut HashMap<K, V>)
+    where K: Hash + Eq + Clone,
+          V: Clone,
+          S: BuildHasher,
+{
+    for op in ops {
+        match *op {
+            Add(ref k, ref v) => {
+                a.insert(k.clone(), v.clone());
+                b.insert(k.clone(), v.clone());
+            }
+            AddEntry(ref k, ref v) => {
+                a.entry(k.clone()).or_insert(v.clone());
+                b.entry(k.clone()).or_insert(v.clone());
+            }
+            Remove(ref k) => {
+                a.swap_remove(k);
+                b.remove(k);
+            }
+            RemoveEntry(ref k) => {
+                match a.entry(k.clone()) {
+                    OEntry::Occupied(ent) => { ent.remove_entry(); },
+                    _ => { }
+                }
+                match b.entry(k.clone()) {
+                    HEntry::Occupied(ent) => { ent.remove_entry(); },
+                    _ => { }
+                }
+            }
+        }
+        //println!("{:?}", a);
+    }
+}
+
+fn assert_maps_equivalent<K, V>(a: &OrderMap<K, V>, b: &HashMap<K, V>) -> bool
+    where K: Hash + Eq + Debug,
+          V: Eq + Debug,
+{
+    assert_eq!(a.len(), b.len());
+    assert_eq!(a.iter().next().is_some(), b.iter().next().is_some());
+    for key in a.keys() {
+        assert!(b.contains_key(key), "b does not contain {:?}", key);
+    }
+    for key in b.keys() {
+        assert!(a.get(key).is_some(), "a does not contain {:?}", key);
+    }
+    for key in a.keys() {
+        assert_eq!(a[key], b[key]);
+    }
+    true
+}
+
+quickcheck! {
+    fn operations_i8(ops: Large<Vec<Op<i8, i8>>>) -> bool {
+        let mut map = OrderMap::new();
+        let mut reference = HashMap::new();
+        do_ops(&ops, &mut map, &mut reference);
+        assert_maps_equivalent(&map, &reference)
+    }
+
+    fn operations_string(ops: Vec<Op<Alpha, i8>>) -> bool {
+        let mut map = OrderMap::new();
+        let mut reference = HashMap::new();
+        do_ops(&ops, &mut map, &mut reference);
+        assert_maps_equivalent(&map, &reference)
+    }
+
+    fn keys_values(ops: Large<Vec<Op<i8, i8>>>) -> bool {
+        let mut map = OrderMap::new();
+        let mut reference = HashMap::new();
+        do_ops(&ops, &mut map, &mut reference);
+        let mut visit = OrderMap::new();
+        for (k, v) in map.keys().zip(map.values()) {
+            assert_eq!(&map[k], v);
+            assert!(!visit.contains_key(k));
+            visit.insert(*k, *v);
+        }
+        assert_eq!(visit.len(), reference.len());
+        true
+    }
+
+    fn keys_values_mut(ops: Large<Vec<Op<i8, i8>>>) -> bool {
+        let mut map = OrderMap::new();
+        let mut reference = HashMap::new();
+        do_ops(&ops, &mut map, &mut reference);
+        let mut visit = OrderMap::new();
+        let keys = Vec::from_iter(map.keys().cloned());
+        for (k, v) in keys.iter().zip(map.values_mut()) {
+            assert_eq!(&reference[k], v);
+            assert!(!visit.contains_key(k));
+            visit.insert(*k, *v);
+        }
+        assert_eq!(visit.len(), reference.len());
+        true
+    }
+
+    fn equality(ops1: Vec<Op<i8, i8>>, removes: Vec<usize>) -> bool {
+        let mut map = OrderMap::new();
+        let mut reference = HashMap::new();
+        do_ops(&ops1, &mut map, &mut reference);
+        let mut ops2 = ops1.clone();
+        for &r in &removes {
+            if !ops2.is_empty() {
+                let i = r % ops2.len();
+                ops2.remove(i);
+            }
+        }
+        let mut map2 = OrderMapFnv::default();
+        let mut reference2 = HashMap::new();
+        do_ops(&ops2, &mut map2, &mut reference2);
+        assert_eq!(map == map2, reference == reference2);
+        true
+    }
+
+    fn retain_ordered(keys: Large<Vec<i8>>, remove: Large<Vec<i8>>) -> () {
+        let mut map = ordermap(keys.iter());
+        let initial_map = map.clone(); // deduplicated in-order input
+        let remove_map = ordermap(remove.iter());
+        let keys_s = set(keys.iter());
+        let remove_s = set(remove.iter());
+        let answer = &keys_s - &remove_s;
+        map.retain(|k, _| !remove_map.contains_key(k));
+
+        // check the values
+        assert_eq!(map.len(), answer.len());
+        for key in &answer {
+            assert!(map.contains_key(key));
+        }
+        // check the order
+        itertools::assert_equal(map.keys(), initial_map.keys().filter(|&k| !remove_map.contains_key(k)));
+    }
+
+    fn sort_1(keyvals: Large<Vec<(i8, i8)>>) -> () {
+        let mut map: OrderMap<_, _> = OrderMap::from_iter(keyvals.to_vec());
+        let mut answer = keyvals.0;
+        answer.sort_by_key(|t| t.0);
+
+        // reverse dedup: Because OrderMap::from_iter keeps the last value for
+        // identical keys
+        answer.reverse();
+        answer.dedup_by_key(|t| t.0);
+        answer.reverse();
+
+        map.sort_by(|k1, _, k2, _| Ord::cmp(k1, k2));
+
+        // check it contains all the values it should
+        for &(key, val) in &answer {
+            assert_eq!(map[&key], val);
+        }
+
+        // check the order
+
+        let mapv = Vec::from_iter(map);
+        assert_eq!(answer, mapv);
+
+    }
+
+    fn sort_2(keyvals: Large<Vec<(i8, i8)>>) -> () {
+        let mut map: OrderMap<_, _> = OrderMap::from_iter(keyvals.to_vec());
+        map.sort_by(|_, v1, _, v2| Ord::cmp(v1, v2));
+        assert_sorted_by_key(map, |t| t.1);
+    }
+}
+
+fn assert_sorted_by_key<I, Key, X>(iterable: I, key: Key)
+    where I: IntoIterator,
+          I::Item: Ord + Clone + Debug,
+          Key: Fn(&I::Item) -> X,
+          X: Ord,
+{
+    let input = Vec::from_iter(iterable);
+    let mut sorted = input.clone();
+    sorted.sort_by_key(key);
+    assert_eq!(input, sorted);
+}
+
+#[derive(Clone, Debug, Hash, PartialEq, Eq)]
+struct Alpha(String);
+
+impl Deref for Alpha {
+    type Target = String;
+    fn deref(&self) -> &String { &self.0 }
+}
+
+const ALPHABET: &'static [u8] = b"abcdefghijklmnopqrstuvwxyz";
+
+impl Arbitrary for Alpha {
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let len = g.next_u32() % g.size() as u32;
+        let len = min(len, 16);
+        Alpha((0..len).map(|_| {
+            ALPHABET[g.next_u32() as usize % ALPHABET.len()] as char
+        }).collect())
+    }
+
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        Box::new((**self).shrink().map(Alpha))
+    }
+}
+
+/// quickcheck Arbitrary adaptor -- make a larger vec
+#[derive(Clone, Debug)]
+struct Large<T>(T);
+
+impl<T> Deref for Large<T> {
+    type Target = T;
+    fn deref(&self) -> &T { &self.0 }
+}
+
+impl<T> Arbitrary for Large<Vec<T>>
+    where T: Arbitrary
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let len = g.next_u32() % (g.size() * 10) as u32;
+        Large((0..len).map(|_| T::arbitrary(g)).collect())
+    }
+
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        Box::new((**self).shrink().map(Large))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/tests/serde.rs
@@ -0,0 +1,59 @@
+#![cfg(feature = "serde-1")]
+
+#[macro_use]
+extern crate ordermap;
+extern crate serde_test;
+extern crate fnv;
+
+use serde_test::{Token, assert_tokens};
+
+#[test]
+fn test_serde() {
+    let map = ordermap! { 1 => 2, 3 => 4 };
+    assert_tokens(&map,
+                  &[Token::Map { len: Some(2) },
+                    Token::I32(1),
+                    Token::I32(2),
+                    Token::I32(3),
+                    Token::I32(4),
+                    Token::MapEnd]);
+}
+
+#[test]
+fn test_serde_set() {
+    let set = orderset! { 1, 2, 3, 4 };
+    assert_tokens(&set,
+                  &[Token::Seq { len: Some(4) },
+                    Token::I32(1),
+                    Token::I32(2),
+                    Token::I32(3),
+                    Token::I32(4),
+                    Token::SeqEnd]);
+}
+
+#[test]
+fn test_serde_fnv_hasher() {
+    let mut map: ::ordermap::OrderMap<i32, i32, ::fnv::FnvBuildHasher> = Default::default();
+    map.insert(1, 2);
+    map.insert(3, 4);
+    assert_tokens(&map,
+                  &[Token::Map { len: Some(2) },
+                    Token::I32(1),
+                    Token::I32(2),
+                    Token::I32(3),
+                    Token::I32(4),
+                    Token::MapEnd]);
+}
+
+#[test]
+fn test_serde_map_fnv_hasher() {
+    let mut set: ::ordermap::OrderSet<i32, ::fnv::FnvBuildHasher> = Default::default();
+    set.extend(1..5);
+    assert_tokens(&set,
+                  &[Token::Seq { len: Some(4) },
+                    Token::I32(1),
+                    Token::I32(2),
+                    Token::I32(3),
+                    Token::I32(4),
+                    Token::SeqEnd]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ordermap/tests/tests.rs
@@ -0,0 +1,32 @@
+
+#[macro_use]
+extern crate ordermap;
+extern crate itertools;
+
+
+#[test]
+fn test_sort() {
+    let m = ordermap! {
+        1 => 2,
+        7 => 1,
+        2 => 2,
+        3 => 3,
+    };
+
+    itertools::assert_equal(m.sorted_by(|_k1, v1, _k2, v2| v1.cmp(v2)),
+                            vec![(7, 1), (1, 2), (2, 2), (3, 3)]);
+}
+
+
+#[test]
+fn test_sort_set() {
+    let s = orderset! {
+        1,
+        7,
+        2,
+        3,
+    };
+
+    itertools::assert_equal(s.sorted_by(|v1, v2| v1.cmp(v2)),
+                            vec![1, 2, 3, 7]);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"c5719782397bb3082e5408d73564b973342a9b14843f9a1b471a23a1a63ac884","Cargo.toml":"002ff28fea3886433227f4a2914f7b80dfd29ecb673901c4c10fb9f1e6994176","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","Makefile":"00085165f17f84dca52e95d3ef0890ce91004225938c39c5b20c237ba0265828","README.rst":"aec42ecb1121a95b0954ebf2ba42745596a17191ca83377a1c8b3196bd25e71a","benches/iso.rs":"fa2bb166e29936bb6956593fd814cb4851b450e9a9bf5a8cca5aacb97e36c517","benches/ograph.rs":"d16a926528360b30ceddfb33b2db545ff5c33ebb69ed8ed66de395f35fa8fc2d","benches/stable_graph.rs":"c1e98da2ee12f3dfb51d409d7ed58d29e78dce5a548084b3d438b817130db08e","custom.css":"e6f2cd299392337b4e2959c52f422e5b7be11920ea98d10db44d10ddef5ed47c","graph-example.dot":"9db00c096f61632bfba85a5a46b125cc5151583b6dbed89b75fa711ed4f649f2","src/algo/dominators.rs":"6521285e2efe6674b9b4785fb11a572ece530c9529d9b9544df4708425bc70c6","src/algo/mod.rs":"28b3e0b7c5f3c1a38135d2c283866f60c86e284400c4ebec0da679d1de0d6a65","src/astar.rs":"1d9b0a83a41dce347fe9ecd72dd30e869d91df3940a5a33cda2737dc7dd08958","src/csr.rs":"7952ea3ee689ce4e1828cfe4b564e8054d426b2e4817aaaf0db03e78714dd763","src/data.rs":"095cef6658eb66d7e5ae0e96174010ce6b718c9f8ebd94e862faca7bc51266b1","src/dijkstra.rs":"4385735dfa489ac8369adb45502d282242252164a8ed7e8abdb6b6f9126ab233","src/dot.rs":"49a0c7dfa0da25cbd1f580645a70c8c2187956469f6f9d5766e71d595e519112","src/generate.rs":"d4070d083c940021e67803f057270a03ecb6091c59e408fe6d4a44a356395725","src/graph_impl/frozen.rs":"1e8f76d15ed1e2cbb8e52d657a1b324b6633c5ea8c05d7f01d42744e2b5798fb","src/graph_impl/mod.rs":"23983adb22d8ff5132e68bb287d3af05875ca86f9cd00bd849578357f657f4ca","src/graph_impl/serialization.rs":"69171f8c0ab8a4ef0c90585241e112cfb22b45c2bd131b2186f8e32bad0b0287","src/graph_impl/stable_graph/mod.rs":"79fe89434def89e48da9b092bf90fd374040d7534b2b7d11f7ac035f16db2c82","src/graph_impl/stable_graph/serialization.rs":"127d547644fdf209f513f4eb3f5d0707c4b780842e8eb3758f2148f1e8635a09","src/graphmap.rs":"5508c4bdec16cdf68ac2c1ded54844156c0b701154834f35bbb8ff066366a1e3","src/isomorphism.rs":"be6145a9ce6b9123cd8efe384ae23bede25deec00ff4b5d98a95cabc0637c136","src/iter_format.rs":"c9d24f5004db96e722ffe51fd13aed4983d271f8dc7199e6c83d0f696b3275bd","src/iter_utils.rs":"5c33ba8c10d3ee5706a2de68639192cb88c7ce5e278afc5d3c0f6abd713732e4","src/lib.rs":"d1a2651f73c8908181eb85fc4e8697071030a04893cb0231b28f2a9c53154084","src/macros.rs":"04c1409ea1a7df8580cbfae834db700448b19f76d9640820919e0117ebe867b1","src/prelude.rs":"7675b4d37fab7ac506506e82cb3952d9912568f4a7a75e5504d085ca856d320a","src/quickcheck.rs":"e50f0d5fb9024832d7a68992f52d12cadabe0189da8ebce24524a2acba25aa6e","src/scored.rs":"5848275fe1ddbcec3cf324ef80f7356375082d9a4eb9ab69d0dc2be21f80a17d","src/serde_utils.rs":"abace257edfd72ae29af72e349e050d6a55f1e5dc62d3c72fb388393581d202e","src/traits_graph.rs":"074a0f6a68aed4ed23ba8a96111383eb905e0be0243b3c2162046bf89ee9875f","src/unionfind.rs":"3716ab724047b8ac574f822ce083952254274db6c6fbe69f61a00bcfd74ff65c","src/util.rs":"15a37dddb26dc65b866dbcfb01d95b8eb54a0f5d56adaf826ef0dd4203de4eec","src/visit/dfsvisit.rs":"d5437616e83da5625782806122669ca6b3a19203a67fd4c1cef2eb4c7080147c","src/visit/filter.rs":"3e8b444c975e8530f1e0b5b399ea4070069fff1a4601ba82f1ec95e98171cdb7","src/visit/macros.rs":"a8cea86e4e065c11fc975e7a3791399c44cc4fc92e5325723d09683ddf360d61","src/visit/mod.rs":"59d610c0b1c99189a78d9a00a294d2e08475e59b75de12ad3b9e324ec5371a39","src/visit/reversed.rs":"caa722a49c79466aa86730d8de08c2422ba10979ed23b26d9f8601a349020145","src/visit/traversal.rs":"8fac82082beff264d203d5780fcfa64a32a260c18ccae2298e4c79399a3651a6","tests/graph.rs":"3a0b8c5da35b607bd79b1c268e09fde8d41a008b36d01fd78cc94db56842c90c","tests/graphmap.rs":"2e95ff80781513cb91fceea2041dc56401b2782c4882de1a6f41e6b617653d6b","tests/iso.rs":"4be4820947697bc531f9e0655a0b3a0f1b5240b9fede3cea433f0ae6431920cb","tests/quickcheck.rs":"3a4626c581d013ddbfcbe7a16bf00d5e04309fe7e91cbdd7c80220601ddd4887","tests/stable_graph.rs":"ee756cdf6dbea9c5405ad17e4e7e396bdf61799f833eea11e015d0aec34da75c","tests/unionfind.rs":"fb203dacf27d7d62503b6933dc73cd0e4da9d8b46a106ce3ee253c09781e2fe7","tests/utils/mod.rs":"2838784ba2fb2a01c901321a0680a030c99268e8b0afe197a4e8550556f0807d","tests/utils/qc.rs":"bb01df05da6f9d5aa61800f711176dcd22729fee8b1e0b6f3b708fa45194e9a4"},"package":"7a7e5234c228fbfa874c86a77f685886127f82e0aef602ad1d48333fcac6ad61"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/.travis.yml
@@ -0,0 +1,25 @@
+language: rust
+sudo: false
+matrix:
+  include:
+    - rust: 1.12.0
+      env:
+      - ALL=' '
+    - rust: stable
+      env:
+      - FEATURES='unstable quickcheck'
+    - rust: beta
+    - rust: nightly
+    - rust: nightly
+      env:
+       - FEATURES='unstable quickcheck'
+       - BENCH=1
+branches:
+  only:
+    - master
+script:
+  - |
+      cargo build --verbose --no-default-features &&
+      cargo test --verbose --no-default-features &&
+      cargo build --verbose --features "$FEATURES" &&
+      cargo test ${ALL:---all} --verbose --features "$FEATURES"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/Cargo.toml
@@ -0,0 +1,75 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "petgraph"
+version = "0.4.11"
+authors = ["bluss", "mitchmindtree"]
+description = "Graph data structure library. Provides graph types and graph algorithms."
+documentation = "https://docs.rs/petgraph/"
+keywords = ["data-structure", "graph", "unionfind", "graph-algorithms"]
+categories = ["data-structures"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/bluss/petgraph"
+[package.metadata.docs.rs]
+features = ["serde-1", "quickcheck"]
+
+[package.metadata.release]
+no-dev-version = true
+[profile.bench]
+debug = true
+
+[profile.release]
+
+[lib]
+name = "petgraph"
+bench = false
+[dependencies.fixedbitset]
+version = "0.1.4"
+
+[dependencies.ordermap]
+version = "0.3.0"
+optional = true
+
+[dependencies.quickcheck]
+version = "0.4"
+optional = true
+default-features = false
+
+[dependencies.serde]
+version = "1.0"
+optional = true
+
+[dependencies.serde_derive]
+version = "1.0"
+optional = true
+[dev-dependencies.defmac]
+version = "0.1"
+
+[dev-dependencies.itertools]
+version = "0.7.0"
+default-features = false
+
+[dev-dependencies.odds]
+version = "0.2.19"
+
+[dev-dependencies.rand]
+version = "0.3"
+
+[features]
+all = ["unstable", "quickcheck", "stable_graph", "graphmap"]
+default = ["graphmap", "stable_graph"]
+generate = []
+graphmap = ["ordermap"]
+serde-1 = ["serde", "serde_derive"]
+stable_graph = []
+unstable = ["generate"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/Makefile
@@ -0,0 +1,38 @@
+DOCCRATES = petgraph fixedbitset
+
+# deps to delete the generated docs
+RMDOCS =
+
+FEATURES = unstable
+
+VERSIONS = $(patsubst %,target/VERS/%,$(DOCCRATES))
+
+docs: mkdocs mksvgs subst $(RMDOCS)
+
+# https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
+$(VERSIONS): Cargo.toml
+	mkdir -p $(@D)
+	cargo pkgid $(@F) | sed -e "s/.*#\(\|.*:\)//" > "$@"
+
+$(DOCCRATES): %: target/VERS/%
+	# Put in the crate version into the docs
+	find ./doc/$@ -name "*.html" -exec sed -i -e "s/<title>\(.*\) - Rust/<title>$@ $(shell cat $<) - \1 - Rust/g" {} \;
+
+subst: $(DOCCRATES)
+
+mkdocs: Cargo.toml
+	cargo doc --features=$(FEATURES)
+	rm -rf ./doc
+	cp -r ./target/doc ./doc
+	- cat ./custom.css >> doc/main.css
+
+$(RMDOCS): mkdocs
+	rm -r ./doc/$@
+	sed -i "/searchIndex\['$@'\]/d" doc/search-index.js
+
+mksvgs: mkdocs graph-example.dot
+	dot -Tsvg < ./graph-example.dot > graph-example.svg
+	mv graph-example.svg ./doc/petgraph/graph/
+
+
+.PHONY: docs mkdocs mksvgs subst $(DOCCRATES) $(RMDOCS)
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/README.rst
@@ -0,0 +1,372 @@
+
+petgraph
+========
+
+Graph data structure library. Requires Rust 1.12.
+
+Please read the `API documentation here`__
+
+__ https://docs.rs/petgraph/
+
+|build_status|_ |crates|_
+
+.. |build_status| image:: https://travis-ci.org/bluss/petgraph.svg?branch=master
+.. _build_status: https://travis-ci.org/bluss/petgraph
+
+.. |crates| image:: http://meritbadge.herokuapp.com/petgraph
+.. _crates: https://crates.io/crates/petgraph
+
+Crate feature flags:
+
+- ``graphmap`` (default) enable ``GraphMap``.
+- ``stable_graph`` (default) enable ``StableGraph``.
+- ``serde-1`` (optional) enable serialization for ``Graph, StableGraph`` using
+  serde 1.0. Requires Rust version as required by serde.
+
+Recent Changes
+--------------
+
+- 0.4.11
+
+  - Fix ``petgraph::graph::NodeReferences`` to be publically visible
+  - Small doc typo and code style files by @shepmaster and @waywardmonkeys
+  - Fix a future compat warning with pointer casts
+
+- 0.4.10
+
+  - Add graph trait ``IntoEdgesDirected``
+  - Update dependencies
+
+- 0.4.9
+
+  - Fix ``bellman_ford`` to work correctly with undirected graphs (#152) by
+    @carrutstick
+  - Performance improvements for ``Graph, Stablegraph``'s ``.map()``.
+
+- 0.4.8
+
+  - ``StableGraph`` learned new methods nearing parity with ``Graph``.  Note
+    that the ``StableGraph`` methods preserve index stability even in the batch
+    removal methods like ``filter_map`` and ``retain_edges``.
+
+    + Added ``.filter_map()``, which maps associated node and edge data
+    + Added ``.retain_edges()``, ``.edge_indices()`` and ``.clear_edges()``
+
+  - Existing ``Graph`` iterators gained some trait impls:
+
+    + ``.node_indices(), .edge_indices()`` are ``ExactSizeIterator``
+    + ``.node_references()`` is now
+      ``DoubleEndedIterator + ExactSizeIterator``.
+    + ``.edge_references()`` is now ``ExactSizeIterator``.
+
+  - Implemented ``From<StableGraph>`` for ``Graph``.
+
+- 0.4.7
+
+  - New algorithm by @jmcomets: A* search algorithm in ``petgraph::algo::astar``
+  - One ``StableGraph`` bug fix whose patch was supposed to be in the previous
+    version:
+
+    + ``add_edge(m, n, _)`` now properly always panics if nodes m or n don't
+      exist in the graph.
+
+- 0.4.6
+
+  - New optional crate feature: ``"serde-1"``, which enables serialization
+    for ``Graph`` and ``StableGraph`` using serde.
+  - Add methods ``new``, ``add_node`` to ``Csr`` by @jmcomets
+  - Add indexing with ``[]`` by node index, ``NodeCompactIndexable`` for
+    ``Csr`` by @jmcomets
+  - Amend doc for ``GraphMap::into_graph`` (it has a case where it can panic)
+  - Add implementation of ``From<Graph>`` for ``StableGraph``.
+  - Add implementation of ``IntoNodeReferences`` for ``&StableGraph``.
+  - Add method ``StableGraph::map`` that maps associated data
+  - Add method ``StableGraph::find_edge_undirected``
+  - Many ``StableGraph`` bug fixes involving node vacancies (holes left by
+    deletions):
+
+    + ``neighbors(n)`` and similar neighbor and edge iterator methods now
+      handle n being a vacancy properly. (This produces an empty iterator.)
+    + ``find_edge(m, n)`` now handles m being a vacancy correctly too
+    + ``StableGraph::node_bound`` was fixed for empty graphs and returns 0
+
+  - Add implementation of ``DoubleEndedIterator`` to ``Graph, StableGraph``'s
+    edge references iterators.
+  - Debug output for ``Graph`` now shows node and edge count. ``Graph, StableGraph``
+    show nothing for the edges list if it's empty (no label).
+  - ``Arbitrary`` implementation for ``StableGraph`` now can produce graphs with
+    vacancies (used by quickcheck)
+
+- 0.4.5
+
+  - Fix ``max`` ambiguity error with current rust nightly by @daboross (#153)
+
+- 0.4.4
+
+  - Add ``GraphMap::all_edges_mut()`` iterator by @Binero
+  - Add ``StableGraph::retain_nodes`` by @Rupsbant
+  - Add ``StableGraph::index_twice_mut`` by @christolliday
+
+- 0.4.3
+
+  - Add crate categories
+
+- 0.4.2
+
+  - Move the ``visit.rs`` file due to changed rules for a module’s directory
+    ownership in Rust, resolving a future compat warning.
+  - The error types ``Cycle, NegativeCycle`` now implement ``PartialEq``.
+
+- 0.4.1
+
+  - Add new algorithm ``simple_fast`` for computing dominators in a control-flow
+    graph.
+
+- 0.4.0
+
+  - Breaking changes in ``Graph``:
+
+    - ``Graph::edges`` and the other edges methods now return an iterator of
+      edge references
+
+  - Other breaking changes:
+
+    - ``toposort`` now returns an error if the graph had a cycle.
+    - ``is_cyclic_directed`` no longer takes a dfs space argument. It is
+      now recursive.
+    - ``scc`` was renamed to ``kosaraju_scc``.
+    - ``min_spanning_tree`` now returns an iterator that needs to be
+      made into a specific graph type deliberately.
+    - ``dijkstra`` now uses the ``IntoEdges`` trait.
+    - ``NodeIndexable`` changed its method signatures.
+    - ``IntoExternals`` was removed, and many other smaller adjustments
+      in graph traits. ``NodeId`` must now implement ``PartialEq``, for example.
+    - ``DfsIter, BfsIter`` were removed in favour of a more general approach
+      with the ``Walker`` trait and its iterator conversion.
+
+  - New features:
+
+    - New graph traits, for example ``IntoEdges`` which returns
+      an iterator of edge references. Everything implements the graph traits
+      much more consistently.
+    - Traits for associated data access and building graphs: ``DataMap``,
+      ``Build, Create, FromElements``.
+    - Graph adaptors: ``EdgeFiltered``. ``Filtered`` was renamed to ``NodeFiltered``.
+    - New algorithms: bellman-ford
+    - New graph: compressed sparse row (``Csr``).
+    - ``GraphMap`` implements ``NodeIndexable``.
+    - ``Dot`` was generalized
+
+- 0.3.2
+
+  - Add ``depth_first_search``, a recursive dfs visitor that emits discovery,
+    finishing and edge classification events.
+  - Add graph adaptor ``Filtered``.
+  - impl ``Debug, NodeIndexable`` for ``Reversed``.
+
+- 0.3.1
+
+  - Add ``.edges(), .edges_directed()`` to ``StableGraph``. Note that these
+    differ from ``Graph``, because this is the signature they will all use
+    in the future.
+  - Add ``.update_edge()`` to ``StableGraph``.
+  - Add reexports of common items in ``stable_graph`` module (for example
+    ``NodeIndex``).
+  - Minor performance improvements to graph iteration
+  - Improved docs for ``visit`` module.
+
+- 0.3.0
+
+  - Overhaul all graph visitor traits so that they use the ``IntoIterator``
+    style. This makes them composable.
+
+    - Multiple graph algorithms use new visitor traits.
+    - **Help is welcome to port more algorithms (and create new graph traits in
+      the process)!**
+
+  - ``GraphMap`` can now have directed edges. ``GraphMap::new`` is now generic
+    in the edge type. ``DiGraphMap`` and ``UnGraphMap`` are new type aliases.
+  - Add type aliases ``DiGraph, UnGraph, StableDiGraph, StableUnGraph``
+  - ``GraphMap`` is based on the ordermap crate. Deterministic iteration
+    order, faster iteration, no side tables needed to convert to ``Graph``.
+  - Improved docs for a lot of types and functions.
+  - Add graph visitor ``DfsPostOrder``
+  - ``Dfs`` gained new methods ``from_parts`` and ``reset``.
+  - New algo ``has_path_connecting``.
+  - New algo ``tarjan_scc``, a second scc implementation.
+  - Document traversal order in ``Dfs, DfsPostOrder, scc, tarjan_scc``.
+  - Optional graph visitor workspace reuse in ``has_path_connecting``,
+    ``is_cyclic_directed, toposort``.
+  - Improved ``Debug`` formatting for ``Graph, StableGraph``.
+  - Add a prelude module
+  - ``GraphMap`` now has a method ``.into_graph()`` that makes a ``Graph``.
+  - ``Graph::retain_nodes, retain_edges`` now expose the self graph only
+    as wrapped in ``Frozen``, so that weights can be mutated but the
+    graph structure not.
+  - Enable ``StableGraph`` by default
+  - Add method ``Graph::contains_edge``.
+  - Renamed ``EdgeDirection`` → ``Direction``.
+  - Remove ``SubTopo``.
+  - Require Rust 1.12 or later
+
+- 0.2.10
+
+  - Fix compilation with rust nightly
+
+- 0.2.9
+
+  - Fix a bug in SubTopo (#81)
+
+- 0.2.8
+
+  - Add Graph methods reserve_nodes, reserve_edges, reserve_exact_nodes,
+    reserve_exact_edges, shrink_to_fit_edges, shrink_to_fit_nodes, shrink_to_fit
+
+- 0.2.7
+
+  - Update URLs
+
+- 0.2.6
+
+  - Fix warning about type parameter defaults (no functional change)
+
+- 0.2.5
+
+  - Add SubTopo, a topo walker for the subgraph reachable from a starting point.
+  - Add condensation, which forms the graph of a graph’s strongly connected
+    components.
+
+- 0.2.4
+
+  - Fix an algorithm error in scc (#61). This time we have a test that
+    crosschecks the result of the algorithm vs another implementation, for
+    greater confidence in its correctness.
+
+- 0.2.3
+
+  - Require Rust 1.6: Due to changes in how rust uses type parameter defaults.
+  - Implement Graph::clone_from.
+
+- 0.2.2
+
+  - Require Rust 1.5
+  - ``Dot`` passes on the alternate flag to node and edge label formatting
+  - Add ``Clone`` impl for some iterators
+  - Document edge iteration order for ``Graph::neighbors``
+  - Add *experimental feature* ``StableGraph``, using feature flag ``stable_graph``
+
+- 0.2.1
+
+  - Add algorithm ``is_isomorphic_matching``
+
+- 0.2.0
+
+  - New Features
+
+    - Add Graph::neighbors().detach() to step edges without borrowing.
+      This is more general than, and replaces now deprecated
+      walk_edges_directed. (#39)
+    - Implement Default for Graph, GraphMap
+    - Add method EdgeDirection::opposite()
+
+  - Breaking changes
+
+    - Graph::neighbors() for undirected graphs and Graph::neighbors_undirected
+      for any graph now visit self loop edges once, not twice. (#31)
+    - Renamed Graph::without_edges to Graph::externals
+    - Removed Graph::edges_both
+    - GraphMap::add_edge now returns ``Option<E>``
+    - Element type of ``GraphMap<N, E>::all_edges()`` changed to ``(N, N, &E)``
+
+  - Minor breaking changes
+
+    - IntoWeightedEdge changed a type parameter to associated type
+    - IndexType is now an unsafe trait
+    - Removed IndexType::{one, zero}, use method new instead.
+    - Removed MinScored
+    - Ptr moved to the graphmap module.
+    - Directed, Undirected are now void enums.
+    - Fields of graphmap::Edges are now private (#19)
+
+- 0.1.18
+
+  - Fix bug on calling GraphMap::add_edge with existing edge (#35)
+
+- 0.1.17
+
+  - Add Graph::capacity(), GraphMap::capacity()
+  - Fix bug in Graph::reverse()
+  - Graph and GraphMap have `quickcheck::Arbitrary` implementations,
+    if optional feature `quickcheck` is enabled.
+
+- 0.1.16
+
+  - Add Graph::node_indices(), Graph::edge_indices()
+  - Add Graph::retain_nodes(), Graph::retain_edges()
+  - Add Graph::extend_with_edges(), Graph::from_edges()
+  - Add functions petgraph::graph::{edge_index, node_index};
+  - Add GraphMap::extend(), GraphMap::from_edges()
+  - Add petgraph::dot::Dot for simple graphviz dot output
+
+- 0.1.15
+
+  - Add Graph::clear_edges()
+  - Add Graph::edge_endpoints()
+  - Add Graph::map() and Graph::filter_map()
+
+- 0.1.14
+
+  - Add new topological order visitor Topo
+  - New graph traits NeighborsDirected, Externals, Revisitable
+
+- 0.1.13
+
+  - Add iterator GraphMap::all_edges
+
+- 0.1.12
+
+  - Fix an algorithm error in scc (#14)
+
+- 0.1.11
+
+  - Update for well-formedness warnings (Rust RFC 1214), adding
+    new lifetime bounds on NeighborIter and Dfs, impact should be minimal.
+
+- 0.1.10
+  
+  - Fix bug in WalkEdges::next_neighbor()
+
+- 0.1.9
+
+  - Fix Dfs/Bfs for a rustc bugfix that disallowed them
+  - Add method next_neighbor() to WalkEdges
+
+- 0.1.8
+
+  - Add Graph::walk_edges_directed()
+  - Add Graph::index_twice_mut()
+
+- 0.1.7
+
+  - Add Graph::edges_directed()
+
+- 0.1.6
+
+  - Add Graph::node_weights_mut and Graph::edge_weights_mut
+
+- 0.1.4
+
+  - Add back DfsIter, BfsIter
+
+License
+-------
+
+Dual-licensed to be compatible with the Rust project.
+
+Licensed under the Apache License, Version 2.0
+http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
+http://opensource.org/licenses/MIT, at your
+option. This file may not be copied, modified, or distributed
+except according to those terms.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/benches/iso.rs
@@ -0,0 +1,224 @@
+#![feature(test)]
+
+extern crate test;
+extern crate petgraph;
+
+use petgraph::prelude::*;
+use petgraph::{
+    EdgeType,
+};
+use petgraph::graph::{
+    node_index,
+};
+
+/// Petersen A and B are isomorphic
+///
+/// http://www.dharwadker.org/tevet/isomorphism/
+const PETERSEN_A: &'static str = "
+ 0 1 0 0 1 0 1 0 0 0 
+ 1 0 1 0 0 0 0 1 0 0 
+ 0 1 0 1 0 0 0 0 1 0 
+ 0 0 1 0 1 0 0 0 0 1 
+ 1 0 0 1 0 1 0 0 0 0 
+ 0 0 0 0 1 0 0 1 1 0 
+ 1 0 0 0 0 0 0 0 1 1 
+ 0 1 0 0 0 1 0 0 0 1 
+ 0 0 1 0 0 1 1 0 0 0 
+ 0 0 0 1 0 0 1 1 0 0
+";
+
+const PETERSEN_B: &'static str = "
+ 0 0 0 1 0 1 0 0 0 1 
+ 0 0 0 1 1 0 1 0 0 0 
+ 0 0 0 0 0 0 1 1 0 1 
+ 1 1 0 0 0 0 0 1 0 0
+ 0 1 0 0 0 0 0 0 1 1 
+ 1 0 0 0 0 0 1 0 1 0 
+ 0 1 1 0 0 1 0 0 0 0 
+ 0 0 1 1 0 0 0 0 1 0 
+ 0 0 0 0 1 1 0 1 0 0 
+ 1 0 1 0 1 0 0 0 0 0
+";
+
+/// An almost full set, isomorphic
+const FULL_A: &'static str = "
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 0 1 1 1 0 1 
+ 1 1 1 1 1 1 1 1 1 1
+";
+
+const FULL_B: &'static str = "
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 0 1 1 1 0 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1
+";
+
+/// Praust A and B are not isomorphic
+const PRAUST_A: &'static str = "
+ 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+ 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 
+ 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 
+ 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 
+ 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 
+ 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 
+ 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 
+ 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0
+";
+
+const PRAUST_B: &'static str = "
+ 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+ 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 
+ 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 
+ 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 
+ 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 
+ 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 
+ 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 
+";
+
+/// Parse a text adjacency matrix format into a directed graph
+fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty>
+{
+    let mut gr = Graph::with_capacity(0, 0);
+    let s = s.trim();
+    let lines = s.lines().filter(|l| !l.is_empty());
+    for (row, line) in lines.enumerate() {
+        for (col, word) in line.split(' ')
+                                .filter(|s| s.len() > 0)
+                                .enumerate()
+        {
+            let has_edge = word.parse::<i32>().unwrap();
+            assert!(has_edge == 0 || has_edge == 1);
+            if has_edge == 0 {
+                continue;
+            }
+            while col >= gr.node_count() || row >= gr.node_count() {
+                gr.add_node(());
+            }
+            gr.update_edge(node_index(row), node_index(col), ());
+        }
+    }
+    gr
+}
+
+fn str_to_graph(s: &str) -> Graph<(), (), Undirected> {
+    parse_graph(s)
+}
+
+fn str_to_digraph(s: &str) -> Graph<(), (), Directed> {
+    parse_graph(s)
+}
+
+/*
+fn graph_to_ad_matrix<N, E, Ty: EdgeType>(g: &Graph<N,E,Ty>)
+{
+    let n = g.node_count();
+    for i in (0..n) {
+        for j in (0..n) {
+            let ix = NodeIndex::new(i);
+            let jx = NodeIndex::new(j);
+            let out = match g.find_edge(ix, jx) {
+                None => "0",
+                Some(_) => "1",
+            };
+            print!("{} ", out);
+        }
+        println!("");
+    }
+}
+*/
+
+#[bench]
+fn petersen_iso_bench(bench: &mut test::Bencher)
+{
+    let a = str_to_digraph(PETERSEN_A);
+    let b = str_to_digraph(PETERSEN_B);
+
+    bench.iter(|| petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[bench]
+fn petersen_undir_iso_bench(bench: &mut test::Bencher)
+{
+    let a = str_to_graph(PETERSEN_A);
+    let b = str_to_graph(PETERSEN_B);
+
+    bench.iter(|| petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[bench]
+fn full_iso_bench(bench: &mut test::Bencher)
+{
+    let a = str_to_graph(FULL_A);
+    let b = str_to_graph(FULL_B);
+
+    bench.iter(|| petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[bench]
+fn praust_dir_no_iso_bench(bench: &mut test::Bencher)
+{
+    let a = str_to_digraph(PRAUST_A);
+    let b = str_to_digraph(PRAUST_B);
+
+    bench.iter(|| petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[bench]
+fn praust_undir_no_iso_bench(bench: &mut test::Bencher)
+{
+    let a = str_to_graph(PRAUST_A);
+    let b = str_to_graph(PRAUST_B);
+
+    bench.iter(|| petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[bench]
+fn bench_praust_mst(bb: &mut test::Bencher)
+{
+    let a = str_to_digraph(PRAUST_A);
+    let b = str_to_digraph(PRAUST_B);
+
+    bb.iter(|| {
+        (petgraph::algo::min_spanning_tree(&a),
+        petgraph::algo::min_spanning_tree(&b))
+    });
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/benches/ograph.rs
@@ -0,0 +1,54 @@
+#![feature(test)]
+
+extern crate petgraph;
+extern crate test;
+
+use petgraph::graph::Graph;
+
+#[bench]
+fn bench_inser(b: &mut test::Bencher) {
+    let mut og = Graph::new();
+    let fst = og.add_node(0i32);
+    for x in 1..125 {
+        let n = og.add_node(x);
+        og.add_edge(fst, n, ());
+    }
+    b.iter(|| {
+        og.add_node(1)
+    })
+}
+
+#[bench]
+fn bench_add_edge(b: &mut test::Bencher) {
+    let mut og = Graph::new();
+    for _ in 0..100 {
+        og.add_node(());
+    }
+
+    b.iter(|| {
+        for (a, b) in og.node_indices().zip(og.node_indices().skip(1)) {
+            og.add_edge(a, b, ());
+        }
+        og.clear_edges();
+    })
+}
+
+#[bench]
+fn bench_remove(b: &mut test::Bencher) {
+    // removal is very slow in a big graph.
+    // and this one doesn't even have many nodes.
+    let mut og = Graph::new();
+    let fst = og.add_node(0i32);
+    let mut prev = fst;
+    for x in 1..1250 {
+        let n = og.add_node(x);
+        og.add_edge(prev, n, ());
+        prev = n;
+    }
+    //println!("{}", og);
+    b.iter(|| {
+        for _ in 0 .. 100 {
+            og.remove_node(fst);
+        }
+    })
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/benches/stable_graph.rs
@@ -0,0 +1,206 @@
+#![feature(test)]
+
+extern crate petgraph;
+extern crate test;
+
+use test::Bencher;
+use petgraph::prelude::*;
+
+use petgraph::{EdgeType};
+use petgraph::stable_graph::{
+    node_index,
+};
+
+/// An almost full set
+const FULL_A: &'static str = "
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 0 1 1 1 0 1 
+ 1 1 1 1 1 1 1 1 1 1
+";
+
+const BIGGER: &'static str = "
+ 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 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 1 0 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 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 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1
+ 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0
+ 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 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 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0
+ 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0
+ 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1
+ 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0
+ 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1
+ 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1
+ 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1
+ 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0
+";
+
+#[bench]
+fn full_edges_default(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+
+    bench.iter(|| a.edges(node_index(1)).count())
+}
+
+#[bench]
+fn full_edges_out(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+    bench.iter(|| a.edges_directed(node_index(1), Outgoing).count())
+}
+#[bench]
+fn full_edges_in(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+
+    bench.iter(|| a.edges_directed(node_index(1), Incoming).count())
+}
+
+#[bench]
+fn neighbors_default(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+
+    bench.iter(|| a.neighbors(node_index(1)).count())
+}
+
+#[bench]
+fn neighbors_out(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+    bench.iter(|| a.neighbors_directed(node_index(1), Outgoing).count())
+}
+#[bench]
+fn neighbors_in(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(FULL_A);
+
+    bench.iter(|| a.neighbors_directed(node_index(1), Incoming).count())
+}
+
+#[bench]
+fn sccs_stable_graph(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(BIGGER);
+    bench.iter(|| petgraph::algo::kosaraju_scc(&a));
+}
+
+#[bench]
+fn sccs_graph(bench: &mut Bencher)
+{
+    let a = parse_graph::<Directed>(BIGGER);
+    bench.iter(|| petgraph::algo::kosaraju_scc(&a));
+}
+
+/// Parse a text adjacency matrix format into a directed graph
+fn parse_stable_graph<Ty: EdgeType>(s: &str) -> StableGraph<(), (), Ty>
+{
+    let mut gr = StableGraph::default();
+    let s = s.trim();
+    let lines = s.lines().filter(|l| !l.is_empty());
+    for (row, line) in lines.enumerate() {
+        for (col, word) in line.split(' ')
+                                .filter(|s| s.len() > 0)
+                                .enumerate()
+        {
+            let has_edge = word.parse::<i32>().unwrap();
+            assert!(has_edge == 0 || has_edge == 1);
+            if has_edge == 0 {
+                continue;
+            }
+            while col >= gr.node_count() || row >= gr.node_count() {
+                gr.add_node(());
+            }
+            gr.update_edge(node_index(row), node_index(col), ());
+        }
+    }
+    gr
+}
+
+/// Parse a text adjacency matrix format into a directed graph
+fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty>
+{
+    let mut gr = Graph::with_capacity(0, 0);
+    let s = s.trim();
+    let lines = s.lines().filter(|l| !l.is_empty());
+    for (row, line) in lines.enumerate() {
+        for (col, word) in line.split(' ')
+                                .filter(|s| s.len() > 0)
+                                .enumerate()
+        {
+            let has_edge = word.parse::<i32>().unwrap();
+            assert!(has_edge == 0 || has_edge == 1);
+            if has_edge == 0 {
+                continue;
+            }
+            while col >= gr.node_count() || row >= gr.node_count() {
+                gr.add_node(());
+            }
+            gr.update_edge(node_index(row), node_index(col), ());
+        }
+    }
+    gr
+}
+
+
+#[bench]
+fn stable_graph_map(bench: &mut Bencher)
+{
+    let a = parse_stable_graph::<Directed>(BIGGER);
+    bench.iter(|| a.map(|i, _| i, |i, _| i));
+}
+
+#[bench]
+fn graph_map(bench: &mut Bencher)
+{
+    let a = parse_graph::<Directed>(BIGGER);
+    bench.iter(|| a.map(|i, _| i, |i, _| i));
+}
+
+#[bench]
+fn stable_graph_retain_nodes(bench: &mut Bencher)
+{
+    let mut a = parse_stable_graph::<Directed>(BIGGER);
+    bench.iter(|| a.retain_nodes(|gr, i| (i.index() + 1) % 3700 != 0));
+}
+
+#[bench]
+fn stable_graph_retain_edges(bench: &mut Bencher)
+{
+    let mut a = parse_stable_graph::<Directed>(BIGGER);
+    bench.iter(|| a.retain_edges(|gr, i| (i.index() + 1) % 3700 != 0));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/custom.css
@@ -0,0 +1,25 @@
+
+.docblock pre.rust { background: #eeeeff; }
+pre.trait, pre.fn, pre.struct, pre.enum, pre.typedef { background: #fcfefc; }
+
+/* Small “example” label for doc examples */
+.docblock pre.rust::before {
+    content: "example";
+    float: right;
+    font-style: italic;
+    font-size: 0.8em;
+    margin-top: -10px;
+    margin-right: -5px;
+}
+
+
+/* Fixup where display in trait listing */
+pre.trait .where::before {
+content: '\a         ';
+}
+
+.docblock code {
+    background-color: inherit;
+    font-weight: bold;
+    padding: 0 0.1em;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/graph-example.dot
@@ -0,0 +1,15 @@
+digraph {
+rankdir = "LR";
+splines = true;
+
+    0 [label="petgraph"]
+    1 [label="fixedbitset"]
+    2 [label="quickcheck"]
+    3 [label="rand"]
+    4 [label="libc"]
+    0 -> 1
+    0 -> 2
+    2 -> 3
+    3 -> 4
+    2 -> 4
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/algo/dominators.rs
@@ -0,0 +1,267 @@
+//! Compute dominators of a control-flow graph.
+//!
+//! # The Dominance Relation
+//!
+//! In a directed graph with a root node **R**, a node **A** is said to *dominate* a
+//! node **B** iff every path from **R** to **B** contains **A**.
+//!
+//! The node **A** is said to *strictly dominate* the node **B** iff **A** dominates
+//! **B** and **A ≠ B**.
+//!
+//! The node **A** is said to be the *immediate dominator* of a node **B** iff it
+//! strictly dominates **B** and there does not exist any node **C** where **A**
+//! dominates **C** and **C** dominates **B**.
+
+use std::collections::{HashMap, HashSet};
+use std::hash::Hash;
+
+use visit::{DfsPostOrder, GraphBase, IntoNeighbors, Visitable, Walker};
+
+/// The dominance relation for some graph and root.
+#[derive(Debug, Clone)]
+pub struct Dominators<N>
+    where N: Copy + Eq + Hash
+{
+    root: N,
+    dominators: HashMap<N, N>,
+}
+
+impl<N> Dominators<N>
+    where N: Copy + Eq + Hash
+{
+    /// Get the root node used to construct these dominance relations.
+    pub fn root(&self) -> N {
+        self.root
+    }
+
+    /// Get the immediate dominator of the given node.
+    ///
+    /// Returns `None` for any node that is not reachable from the root, and for
+    /// the root itself.
+    pub fn immediate_dominator(&self, node: N) -> Option<N> {
+        if node == self.root {
+            None
+        } else {
+            self.dominators.get(&node).cloned()
+        }
+    }
+
+    /// Iterate over the given node's that strict dominators.
+    ///
+    /// If the given node is not reachable from the root, then `None` is
+    /// returned.
+    pub fn strict_dominators(&self, node: N) -> Option<DominatorsIter<N>> {
+        if self.dominators.contains_key(&node) {
+            Some(DominatorsIter {
+                dominators: self,
+                node: self.immediate_dominator(node),
+            })
+        } else {
+            None
+        }
+    }
+
+    /// Iterate over all of the given node's dominators (including the given
+    /// node itself).
+    ///
+    /// If the given node is not reachable from the root, then `None` is
+    /// returned.
+    pub fn dominators(&self, node: N) -> Option<DominatorsIter<N>> {
+        if self.dominators.contains_key(&node) {
+            Some(DominatorsIter {
+                dominators: self,
+                node: Some(node),
+            })
+        } else {
+            None
+        }
+    }
+}
+
+/// Iterator for a node's dominators.
+pub struct DominatorsIter<'a, N>
+    where N: 'a + Copy + Eq + Hash
+{
+    dominators: &'a Dominators<N>,
+    node: Option<N>,
+}
+
+impl<'a, N> Iterator for DominatorsIter<'a, N>
+    where N: 'a + Copy + Eq + Hash
+{
+    type Item = N;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let next = self.node.take();
+        if let Some(next) = next {
+            self.node = self.dominators.immediate_dominator(next);
+        }
+        next
+    }
+}
+
+/// The undefined dominator sentinel, for when we have not yet discovered a
+/// node's dominator.
+const UNDEFINED: usize = ::std::usize::MAX;
+
+/// This is an implementation of the engineered ["Simple, Fast Dominance
+/// Algorithm"][0] discovered by Cooper et al.
+///
+/// This algorithm is **O(|V|²)**, and therefore has slower theoretical running time
+/// than the Lenguaer-Tarjan algorithm (which is **O(|E| log |V|)**. However,
+/// Cooper et al found it to be faster in practice on control flow graphs of up
+/// to ~30,000 vertices.
+///
+/// [0]: http://www.cs.rice.edu/~keith/EMBED/dom.pdf
+pub fn simple_fast<G>(graph: G, root: G::NodeId) -> Dominators<G::NodeId>
+    where G: IntoNeighbors + Visitable,
+          <G as GraphBase>::NodeId: Eq + Hash
+{
+    let (post_order, predecessor_sets) = simple_fast_post_order(graph, root);
+    let length = post_order.len();
+    debug_assert!(length > 0);
+    debug_assert!(post_order.last() == Some(&root));
+
+    // From here on out we use indices into `post_order` instead of actual
+    // `NodeId`s wherever possible. This greatly improves the performance of
+    // this implementation, but we have to pay a little bit of upfront cost to
+    // convert our data structures to play along first.
+
+    // Maps a node to its index into `post_order`.
+    let node_to_post_order_idx: HashMap<_, _> = post_order.iter()
+        .enumerate()
+        .map(|(idx, &node)| (node, idx))
+        .collect();
+
+    // Maps a node's `post_order` index to its set of predecessors's indices
+    // into `post_order` (as a vec).
+    let idx_to_predecessor_vec =
+        predecessor_sets_to_idx_vecs(&post_order, &node_to_post_order_idx, predecessor_sets);
+
+    let mut dominators = vec![UNDEFINED; length];
+    dominators[length - 1] = length - 1;
+
+    let mut changed = true;
+    while changed {
+        changed = false;
+
+        // Iterate in reverse post order, skipping the root.
+
+        for idx in (0..length - 1).rev() {
+            debug_assert!(post_order[idx] != root);
+
+            // Take the intersection of every predecessor's dominator set; that
+            // is the current best guess at the immediate dominator for this
+            // node.
+
+            let new_idom_idx = {
+                let mut predecessors =
+                    idx_to_predecessor_vec[idx].iter().filter(|&&p| dominators[p] != UNDEFINED);
+                let new_idom_idx = predecessors.next()
+                    .expect("Because the root is initialized to dominate itself, and is the \
+                             first node in every path, there must exist a predecessor to this \
+                             node that also has a dominator");
+                predecessors.fold(*new_idom_idx, |new_idom_idx, &predecessor_idx| {
+                    intersect(&dominators, new_idom_idx, predecessor_idx)
+                })
+            };
+
+            debug_assert!(new_idom_idx < length);
+
+            if new_idom_idx != dominators[idx] {
+                dominators[idx] = new_idom_idx;
+                changed = true;
+            }
+        }
+    }
+
+    // All done! Translate the indices back into proper `G::NodeId`s.
+
+    debug_assert!(!dominators.iter().any(|&dom| dom == UNDEFINED));
+
+    Dominators {
+        root: root,
+        dominators: dominators.into_iter()
+            .enumerate()
+            .map(|(idx, dom_idx)| (post_order[idx], post_order[dom_idx]))
+            .collect(),
+    }
+}
+
+fn intersect(dominators: &[usize], mut finger1: usize, mut finger2: usize) -> usize {
+    while finger1 != finger2 {
+        if finger1 < finger2 {
+            finger1 = dominators[finger1];
+        } else if finger2 < finger1 {
+            finger2 = dominators[finger2];
+        }
+    }
+    finger1
+}
+
+fn predecessor_sets_to_idx_vecs<N>(post_order: &[N],
+                                   node_to_post_order_idx: &HashMap<N, usize>,
+                                   mut predecessor_sets: HashMap<N, HashSet<N>>)
+                                   -> Vec<Vec<usize>>
+    where N: Copy + Eq + Hash
+{
+    post_order.iter()
+        .map(|node| {
+            predecessor_sets.remove(node)
+                .map(|predecessors| {
+                    predecessors.into_iter()
+                        .map(|p| *node_to_post_order_idx.get(&p).unwrap())
+                        .collect()
+                })
+                .unwrap_or(vec![])
+        })
+        .collect()
+}
+
+fn simple_fast_post_order<G>(graph: G,
+                             root: G::NodeId)
+                             -> (Vec<G::NodeId>, HashMap<G::NodeId, HashSet<G::NodeId>>)
+    where G: IntoNeighbors + Visitable,
+          <G as GraphBase>::NodeId: Eq + Hash
+{
+    let mut post_order = vec![];
+    let mut predecessor_sets = HashMap::new();
+
+    for node in DfsPostOrder::new(graph, root).iter(graph) {
+        post_order.push(node);
+
+        for successor in graph.neighbors(node) {
+            predecessor_sets.entry(successor)
+                .or_insert_with(HashSet::new)
+                .insert(node);
+        }
+    }
+
+    (post_order, predecessor_sets)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_iter_dominators() {
+        let doms: Dominators<u32> = Dominators {
+            root: 0,
+            dominators: [(2, 1), (1, 0), (0, 0)]
+                .iter()
+                .cloned()
+                .collect(),
+        };
+
+        let all_doms: Vec<_> = doms.dominators(2).unwrap().collect();
+        assert_eq!(vec![2, 1, 0], all_doms);
+
+        assert_eq!(None::<()>, doms.dominators(99).map(|_| unreachable!()));
+
+        let strict_doms: Vec<_> = doms.strict_dominators(2).unwrap().collect();
+        assert_eq!(vec![1, 0], strict_doms);
+
+        assert_eq!(None::<()>, doms.strict_dominators(99).map(|_| unreachable!()));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/algo/mod.rs
@@ -0,0 +1,626 @@
+//! Graph algorithms.
+//!
+//! It is a goal to gradually migrate the algorithms to be based on graph traits
+//! so that they are generally applicable. For now, some of these still require
+//! the `Graph` type.
+
+pub mod dominators;
+
+use std::collections::BinaryHeap;
+use std::cmp::min;
+
+use prelude::*;
+
+use super::{
+    EdgeType,
+};
+use scored::MinScored;
+use super::visit::{
+    GraphRef,
+    GraphBase,
+    Visitable,
+    VisitMap,
+    IntoNeighbors,
+    IntoNeighborsDirected,
+    IntoNodeIdentifiers,
+    NodeCount,
+    NodeIndexable,
+    NodeCompactIndexable,
+    IntoEdgeReferences,
+    IntoEdges,
+    Reversed,
+};
+use super::unionfind::UnionFind;
+use super::graph::{
+    IndexType,
+};
+use visit::{Data, NodeRef, IntoNodeReferences};
+use data::{
+    Element,
+};
+
+pub use super::isomorphism::{
+    is_isomorphic,
+    is_isomorphic_matching,
+};
+pub use super::dijkstra::dijkstra;
+pub use super::astar::astar;
+
+/// [Generic] Return the number of connected components of the graph.
+///
+/// For a directed graph, this is the *weakly* connected components.
+pub fn connected_components<G>(g: G) -> usize
+    where G: NodeCompactIndexable + IntoEdgeReferences,
+{
+    let mut vertex_sets = UnionFind::new(g.node_bound());
+    for edge in g.edge_references() {
+        let (a, b) = (edge.source(), edge.target());
+
+        // union the two vertices of the edge
+        vertex_sets.union(g.to_index(a), g.to_index(b));
+    }
+    let mut labels = vertex_sets.into_labeling();
+    labels.sort();
+    labels.dedup();
+    labels.len()
+}
+
+
+/// [Generic] Return `true` if the input graph contains a cycle.
+///
+/// Always treats the input graph as if undirected.
+pub fn is_cyclic_undirected<G>(g: G) -> bool
+    where G: NodeIndexable + IntoEdgeReferences
+{
+    let mut edge_sets = UnionFind::new(g.node_bound());
+    for edge in g.edge_references() {
+        let (a, b) = (edge.source(), edge.target());
+
+        // union the two vertices of the edge
+        //  -- if they were already the same, then we have a cycle
+        if !edge_sets.union(g.to_index(a), g.to_index(b)) {
+            return true
+        }
+    }
+    false
+}
+
+
+/// [Generic] Perform a topological sort of a directed graph.
+///
+/// If the graph was acyclic, return a vector of nodes in topological order:
+/// each node is ordered before its successors.
+/// Otherwise, it will return a `Cycle` error. Self loops are also cycles.
+///
+/// To handle graphs with cycles, use the scc algorithms or `DfsPostOrder`
+/// instead of this function.
+///
+/// If `space` is not `None`, it is used instead of creating a new workspace for
+/// graph traversal. The implementation is iterative.
+pub fn toposort<G>(g: G, space: Option<&mut DfsSpace<G::NodeId, G::Map>>)
+    -> Result<Vec<G::NodeId>, Cycle<G::NodeId>>
+    where G: IntoNeighborsDirected + IntoNodeIdentifiers + Visitable,
+{
+    // based on kosaraju scc
+    with_dfs(g, space, |dfs| {
+        dfs.reset(g);
+        let mut finished = g.visit_map();
+
+        let mut finish_stack = Vec::new();
+        for i in g.node_identifiers() {
+            if dfs.discovered.is_visited(&i) {
+                continue;
+            }
+            dfs.stack.push(i);
+            while let Some(&nx) = dfs.stack.last() {
+                if dfs.discovered.visit(nx) {
+                    // First time visiting `nx`: Push neighbors, don't pop `nx`
+                    for succ in g.neighbors(nx) {
+                        if succ == nx {
+                            // self cycle
+                            return Err(Cycle(nx));
+                        }
+                        if !dfs.discovered.is_visited(&succ) {
+                            dfs.stack.push(succ);
+                        } 
+                    }
+                } else {
+                    dfs.stack.pop();
+                    if finished.visit(nx) {
+                        // Second time: All reachable nodes must have been finished
+                        finish_stack.push(nx);
+                    }
+                }
+            }
+        }
+        finish_stack.reverse();
+
+        dfs.reset(g);
+        for &i in &finish_stack {
+            dfs.move_to(i);
+            let mut cycle = false;
+            while let Some(j) = dfs.next(Reversed(g)) {
+                if cycle {
+                    return Err(Cycle(j));
+                }
+                cycle = true;
+            }
+        }
+
+        Ok(finish_stack)
+    })
+}
+
+/// [Generic] Return `true` if the input directed graph contains a cycle.
+///
+/// This implementation is recursive; use `toposort` if an alternative is
+/// needed.
+pub fn is_cyclic_directed<G>(g: G) -> bool
+    where G: IntoNodeIdentifiers + IntoNeighbors + Visitable,
+{
+    use visit::{depth_first_search, DfsEvent};
+
+    depth_first_search(g, g.node_identifiers(), |event| {
+        match event {
+            DfsEvent::BackEdge(_, _) => Err(()),
+            _ => Ok(()),
+        }
+    }).is_err()
+}
+
+type DfsSpaceType<G> = DfsSpace<<G as GraphBase>::NodeId, <G as Visitable>::Map>;
+
+/// Workspace for a graph traversal.
+#[derive(Clone, Debug)]
+pub struct DfsSpace<N, VM> {
+    dfs: Dfs<N, VM>,
+}
+
+impl<N, VM> DfsSpace<N, VM>
+    where N: Copy + PartialEq,
+          VM: VisitMap<N>,
+{
+    pub fn new<G>(g: G) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>,
+    {
+        DfsSpace {
+            dfs: Dfs::empty(g)
+        }
+    }
+}
+
+impl<N, VM> Default for DfsSpace<N, VM>
+    where VM: VisitMap<N> + Default,
+{
+    fn default() -> Self {
+        DfsSpace {
+            dfs: Dfs {
+                stack: <_>::default(),
+                discovered: <_>::default(),
+            }
+        }
+    }
+}
+
+/// Create a Dfs if it's needed
+fn with_dfs<G, F, R>(g: G, space: Option<&mut DfsSpaceType<G>>, f: F) -> R
+    where G: GraphRef + Visitable,
+          F: FnOnce(&mut Dfs<G::NodeId, G::Map>) -> R
+{
+    let mut local_visitor;
+    let dfs = if let Some(v) = space { &mut v.dfs } else {
+        local_visitor = Dfs::empty(g);
+        &mut local_visitor
+    };
+    f(dfs)
+}
+
+/// [Generic] Check if there exists a path starting at `from` and reaching `to`.
+///
+/// If `from` and `to` are equal, this function returns true.
+///
+/// If `space` is not `None`, it is used instead of creating a new workspace for
+/// graph traversal.
+pub fn has_path_connecting<G>(g: G, from: G::NodeId, to: G::NodeId,
+                              space: Option<&mut DfsSpace<G::NodeId, G::Map>>)
+    -> bool
+    where G: IntoNeighbors + Visitable,
+{
+    with_dfs(g, space, |dfs| {
+        dfs.reset(g);
+        dfs.move_to(from);
+        while let Some(x) = dfs.next(g) {
+            if x == to {
+                return true;
+            }
+        }
+        false
+    })
+}
+
+/// Renamed to `kosaraju_scc`.
+#[deprecated(note = "renamed to kosaraju_scc")]
+pub fn scc<G>(g: G) -> Vec<Vec<G::NodeId>>
+    where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
+{
+    kosaraju_scc(g)
+}
+
+/// [Generic] Compute the *strongly connected components* using [Kosaraju's algorithm][1].
+///
+/// [1]: https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm
+///
+/// Return a vector where each element is a strongly connected component (scc).
+/// The order of node ids within each scc is arbitrary, but the order of
+/// the sccs is their postorder (reverse topological sort).
+///
+/// For an undirected graph, the sccs are simply the connected components.
+///
+/// This implementation is iterative and does two passes over the nodes.
+pub fn kosaraju_scc<G>(g: G) -> Vec<Vec<G::NodeId>>
+    where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
+{
+    let mut dfs = DfsPostOrder::empty(g);
+
+    // First phase, reverse dfs pass, compute finishing times.
+    // http://stackoverflow.com/a/26780899/161659
+    let mut finish_order = Vec::with_capacity(0);
+    for i in g.node_identifiers() {
+        if dfs.discovered.is_visited(&i) {
+            continue
+        }
+
+        dfs.move_to(i);
+        while let Some(nx) = dfs.next(Reversed(g)) {
+            finish_order.push(nx);
+        }
+    }
+
+    let mut dfs = Dfs::from_parts(dfs.stack, dfs.discovered);
+    dfs.reset(g);
+    let mut sccs = Vec::new();
+
+    // Second phase
+    // Process in decreasing finishing time order
+    for i in finish_order.into_iter().rev() {
+        if dfs.discovered.is_visited(&i) {
+            continue;
+        }
+        // Move to the leader node `i`.
+        dfs.move_to(i);
+        let mut scc = Vec::new();
+        while let Some(nx) = dfs.next(g) {
+            scc.push(nx);
+        }
+        sccs.push(scc);
+    }
+    sccs
+}
+
+/// [Generic] Compute the *strongly connected components* using [Tarjan's algorithm][1].
+///
+/// [1]: https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+///
+/// Return a vector where each element is a strongly connected component (scc).
+/// The order of node ids within each scc is arbitrary, but the order of
+/// the sccs is their postorder (reverse topological sort).
+///
+/// For an undirected graph, the sccs are simply the connected components.
+///
+/// This implementation is recursive and does one pass over the nodes.
+pub fn tarjan_scc<G>(g: G) -> Vec<Vec<G::NodeId>>
+    where G: IntoNodeIdentifiers + IntoNeighbors + NodeIndexable
+{
+    #[derive(Copy, Clone)]
+    #[derive(Debug)]
+    struct NodeData {
+        index: Option<usize>,
+        lowlink: usize,
+        on_stack: bool,
+    }
+
+    #[derive(Debug)]
+    struct Data<'a, G>
+        where G: NodeIndexable, 
+          G::NodeId: 'a
+    {
+        index: usize,
+        nodes: Vec<NodeData>,
+        stack: Vec<G::NodeId>,
+        sccs: &'a mut Vec<Vec<G::NodeId>>,
+    }
+
+    fn scc_visit<G>(v: G::NodeId, g: G, data: &mut Data<G>) 
+        where G: IntoNeighbors + NodeIndexable
+    {
+        macro_rules! node {
+            ($node:expr) => (data.nodes[g.to_index($node)])
+        }
+
+        if node![v].index.is_some() {
+            // already visited
+            return;
+        }
+
+        let v_index = data.index;
+        node![v].index = Some(v_index);
+        node![v].lowlink = v_index;
+        node![v].on_stack = true;
+        data.stack.push(v);
+        data.index += 1;
+
+        for w in g.neighbors(v) {
+            match node![w].index {
+                None => {
+                    scc_visit(w, g, data);
+                    node![v].lowlink = min(node![v].lowlink, node![w].lowlink);
+                }
+                Some(w_index) => {
+                    if node![w].on_stack {
+                        // Successor w is in stack S and hence in the current SCC
+                        let v_lowlink = &mut node![v].lowlink;
+                        *v_lowlink = min(*v_lowlink, w_index);
+                    }
+                }
+            }
+        }
+
+        // If v is a root node, pop the stack and generate an SCC
+        if let Some(v_index) = node![v].index {
+            if node![v].lowlink == v_index {
+                let mut cur_scc = Vec::new();
+                loop {
+                    let w = data.stack.pop().unwrap();
+                    node![w].on_stack = false;
+                    cur_scc.push(w);
+                    if g.to_index(w) == g.to_index(v) { break; }
+                }
+                data.sccs.push(cur_scc);
+            }
+        }
+    }
+
+    let mut sccs = Vec::new();
+    {
+        let map = vec![NodeData { index: None, lowlink: !0, on_stack: false }; g.node_bound()];
+
+        let mut data = Data {
+            index: 0,
+            nodes: map,
+            stack: Vec::new(),
+            sccs: &mut sccs,
+        };
+
+        for n in g.node_identifiers() {
+            scc_visit(n, g, &mut data);
+        }
+    }
+    sccs
+}
+
+/// [Graph] Condense every strongly connected component into a single node and return the result.
+///
+/// If `make_acyclic` is true, self-loops and multi edges are ignored, guaranteeing that
+/// the output is acyclic.
+pub fn condensation<N, E, Ty, Ix>(g: Graph<N, E, Ty, Ix>, make_acyclic: bool) -> Graph<Vec<N>, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    let sccs = kosaraju_scc(&g);
+    let mut condensed: Graph<Vec<N>, E, Ty, Ix> = Graph::with_capacity(sccs.len(), g.edge_count());
+
+    // Build a map from old indices to new ones.
+    let mut node_map = vec![NodeIndex::end(); g.node_count()];
+    for comp in sccs {
+        let new_nix = condensed.add_node(Vec::new());
+        for nix in comp {
+            node_map[nix.index()] = new_nix;
+        }
+    }
+
+    // Consume nodes and edges of the old graph and insert them into the new one.
+    let (nodes, edges) = g.into_nodes_edges();
+    for (nix, node) in nodes.into_iter().enumerate() {
+        condensed[node_map[nix]].push(node.weight);
+    }
+    for edge in edges {
+        let source = node_map[edge.source().index()];
+        let target = node_map[edge.target().index()];
+        if make_acyclic {
+            if source != target {
+                condensed.update_edge(source, target, edge.weight);
+            }
+        } else {
+            condensed.add_edge(source, target, edge.weight);
+        }
+    }
+    condensed
+}
+
+/// [Generic] Compute a *minimum spanning tree* of a graph.
+///
+/// The input graph is treated as if undirected.
+///
+/// Using Kruskal's algorithm with runtime **O(|E| log |E|)**. We actually
+/// return a minimum spanning forest, i.e. a minimum spanning tree for each connected
+/// component of the graph.
+///
+/// The resulting graph has all the vertices of the input graph (with identical node indices),
+/// and **|V| - c** edges, where **c** is the number of connected components in `g`.
+///
+/// Use `from_elements` to create a graph from the resulting iterator.
+pub fn min_spanning_tree<G>(g: G) -> MinSpanningTree<G>
+    where G::NodeWeight: Clone,
+          G::EdgeWeight: Clone + PartialOrd,
+          G: IntoNodeReferences + IntoEdgeReferences + NodeIndexable,
+{
+
+    // Initially each vertex is its own disjoint subgraph, track the connectedness
+    // of the pre-MST with a union & find datastructure.
+    let subgraphs = UnionFind::new(g.node_bound());
+
+    let edges = g.edge_references();
+    let mut sort_edges = BinaryHeap::with_capacity(edges.size_hint().0);
+    for edge in edges {
+        sort_edges.push(MinScored(edge.weight().clone(), (edge.source(), edge.target())));
+    }
+
+    MinSpanningTree {
+        graph: g,
+        node_ids: Some(g.node_references()),
+        subgraphs: subgraphs,
+        sort_edges: sort_edges,
+    }
+
+}
+
+/// An iterator producing a minimum spanning forest of a graph.
+pub struct MinSpanningTree<G>
+    where G: Data + IntoNodeReferences,
+{
+    graph: G,
+    node_ids: Option<G::NodeReferences>,
+    subgraphs: UnionFind<usize>,
+    sort_edges: BinaryHeap<MinScored<G::EdgeWeight, (G::NodeId, G::NodeId)>>,
+}
+
+
+impl<G> Iterator for MinSpanningTree<G>
+    where G: IntoNodeReferences + NodeIndexable,
+          G::NodeWeight: Clone,
+          G::EdgeWeight: PartialOrd,
+{
+    type Item = Element<G::NodeWeight, G::EdgeWeight>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        if let Some(ref mut iter) = self.node_ids {
+            if let Some(node) = iter.next() {
+                return Some(Element::Node { weight: node.weight().clone() });
+            }
+        }
+        self.node_ids = None;
+
+        // Kruskal's algorithm.
+        // Algorithm is this:
+        //
+        // 1. Create a pre-MST with all the vertices and no edges.
+        // 2. Repeat:
+        //
+        //  a. Remove the shortest edge from the original graph.
+        //  b. If the edge connects two disjoint trees in the pre-MST,
+        //     add the edge.
+        while let Some(MinScored(score, (a, b))) = self.sort_edges.pop() {
+            let g = self.graph;
+            // check if the edge would connect two disjoint parts
+            if self.subgraphs.union(g.to_index(a), g.to_index(b)) {
+                return Some(Element::Edge {
+                    source: g.to_index(a),
+                    target: g.to_index(b),
+                    weight: score,
+                });
+            }
+        }
+        None
+    }
+}
+
+/// An algorithm error: a cycle was found in the graph.
+#[derive(Clone, Debug, PartialEq)]
+pub struct Cycle<N>(N);
+
+impl<N> Cycle<N> {
+    /// Return a node id that participates in the cycle
+    pub fn node_id(&self) -> N
+        where N: Copy
+    {
+        self.0
+    }
+}
+/// An algorithm error: a cycle of negative weights was found in the graph.
+#[derive(Clone, Debug, PartialEq)]
+pub struct NegativeCycle(());
+
+/// [Generic] Compute shortest paths from node `source` to all other.
+///
+/// Using the [Bellman–Ford algorithm][bf]; negative edge costs are
+/// permitted, but the graph must not have a cycle of negative weights
+/// (in that case it will return an error).
+///
+/// On success, return one vec with path costs, and another one which points
+/// out the predecessor of a node along a shortest path. The vectors
+/// are indexed by the graph's node indices.
+///
+/// [bf]: https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm
+pub fn bellman_ford<G>(g: G, source: G::NodeId)
+    -> Result<(Vec<G::EdgeWeight>, Vec<Option<G::NodeId>>), NegativeCycle>
+    where G: NodeCount + IntoNodeIdentifiers + IntoEdges + NodeIndexable,
+          G::EdgeWeight: FloatMeasure,
+{
+    let mut predecessor = vec![None; g.node_bound()];
+    let mut distance = vec![<_>::infinite(); g.node_bound()];
+
+    let ix = |i| g.to_index(i);
+
+    distance[ix(source)] = <_>::zero();
+    // scan up to |V| - 1 times.
+    for _ in 1..g.node_count() {
+        let mut did_update = false;
+        for i in g.node_identifiers() {
+            for edge in g.edges(i) {
+                let i = edge.source();
+                let j = edge.target();
+                let w = *edge.weight();
+                if distance[ix(i)] + w < distance[ix(j)] {
+                    distance[ix(j)] = distance[ix(i)] + w;
+                    predecessor[ix(j)] = Some(i);
+                    did_update = true;
+                }
+            }
+        }
+        if !did_update {
+            break;
+        }
+    }
+
+    // check for negative weight cycle
+    for i in g.node_identifiers() {
+        for edge in g.edges(i) {
+            let j = edge.target();
+            let w = *edge.weight();
+            if distance[ix(i)] + w < distance[ix(j)] {
+                //println!("neg cycle, detected from {} to {}, weight={}", i, j, w);
+                return Err(NegativeCycle(()));
+            }
+        }
+    }
+
+    Ok((distance, predecessor))
+}
+
+use std::ops::Add;
+use std::fmt::Debug;
+
+/// Associated data that can be used for measures (such as length).
+pub trait Measure : Debug + PartialOrd + Add<Self, Output=Self> + Default + Clone {
+}
+
+impl<M> Measure for M
+    where M: Debug + PartialOrd + Add<M, Output=M> + Default + Clone,
+{ }
+
+/// A floating-point measure.
+pub trait FloatMeasure : Measure + Copy {
+    fn zero() -> Self;
+    fn infinite() -> Self;
+}
+
+impl FloatMeasure for f32 {
+    fn zero() -> Self { 0. }
+    fn infinite() -> Self { 1./0. }
+}
+
+impl FloatMeasure for f64 {
+    fn zero() -> Self { 0. }
+    fn infinite() -> Self { 1./0. }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/astar.rs
@@ -0,0 +1,173 @@
+use std::collections::{
+    HashMap,
+    BinaryHeap,
+};
+use std::collections::hash_map::Entry::{
+    Occupied,
+    Vacant,
+};
+
+use std::hash::Hash;
+
+use scored::MinScored;
+use super::visit::{
+    EdgeRef,
+    GraphBase,
+    IntoEdges,
+    VisitMap,
+    Visitable,
+};
+
+use algo::Measure;
+
+/// [Generic] A* shortest path algorithm.
+///
+/// Computes the shortest path from `start` to `finish`, including the total path cost.
+///
+/// `finish` is implicitly given via the `is_goal` callback, which should return `true` if the
+/// given node is the finish node.
+///
+/// The function `edge_cost` should return the cost for a particular edge. Edge costs must be
+/// non-negative.
+///
+/// The function `estimate_cost` should return the estimated cost to the finish for a particular
+/// node. For the algorithm to find the actual shortest path, it should be admissible, meaning that
+/// it should never overestimate the actual cost to get to the nearest goal node. Estimate costs
+/// must also be non-negative.
+///
+/// The graph should be `Visitable` and implement `IntoEdges`.
+///
+/// ```
+/// use petgraph::Graph;
+/// use petgraph::algo::astar;
+///
+/// let mut g = Graph::new();
+/// let a = g.add_node((0., 0.));
+/// let b = g.add_node((2., 0.));
+/// let c = g.add_node((1., 1.));
+/// let d = g.add_node((0., 2.));
+/// let e = g.add_node((3., 3.));
+/// let f = g.add_node((4., 2.));
+/// g.extend_with_edges(&[
+///     (a, b, 2),
+///     (a, d, 4),
+///     (b, c, 1),
+///     (b, f, 7),
+///     (c, e, 5),
+///     (e, f, 1),
+///     (d, e, 1),
+/// ]);
+///
+/// let path = astar(&g, a, |finish| finish == f, |e| *e.weight(), |_| 0);
+/// assert_eq!(path, Some((6, vec![a, d, e, f])));
+/// ```
+///
+/// Returns the total cost + the path of subsequent `NodeId` from start to finish, if one was
+/// found.
+pub fn astar<G, F, H, K, IsGoal>(graph: G, start: G::NodeId, mut is_goal: IsGoal,
+                                     mut edge_cost: F, mut estimate_cost: H)
+    -> Option<(K, Vec<G::NodeId>)>
+    where G: IntoEdges + Visitable,
+          IsGoal: FnMut(G::NodeId) -> bool,
+          G::NodeId: Eq + Hash,
+          F: FnMut(G::EdgeRef) -> K,
+          H: FnMut(G::NodeId) -> K,
+          K: Measure + Copy,
+{
+    let mut visited = graph.visit_map();
+    let mut visit_next = BinaryHeap::new();
+    let mut scores = HashMap::new();
+    let mut path_tracker = PathTracker::<G>::new();
+
+    let zero_score = K::default();
+    scores.insert(start, zero_score);
+    visit_next.push(MinScored(estimate_cost(start), start));
+
+    while let Some(MinScored(_, node)) = visit_next.pop() {
+        if is_goal(node) {
+            let path = path_tracker.reconstruct_path_to(node);
+            let cost = scores[&node];
+            return Some((cost, path));
+        }
+
+        // Don't visit the same node several times, as the first time it was visited it was using
+        // the shortest available path.
+        if !visited.visit(node) {
+            continue
+        }
+
+        // This lookup can be unwrapped without fear of panic since the node was necessarily scored
+        // before adding him to `visit_next`.
+        let node_score = scores[&node];
+
+        for edge in graph.edges(node) {
+            let next = edge.target();
+            if visited.is_visited(&next) {
+                continue
+            }
+
+            let mut next_score = node_score + edge_cost(edge);
+
+            match scores.entry(next) {
+                Occupied(ent) => {
+                    let old_score = *ent.get();
+                    if next_score < old_score {
+                        *ent.into_mut() = next_score;
+                        path_tracker.set_predecessor(next, node);
+                    } else {
+                        next_score = old_score;
+                    }
+                },
+                Vacant(ent) => {
+                    ent.insert(next_score);
+                    path_tracker.set_predecessor(next, node);
+                }
+            }
+
+            let next_estimate_score = next_score + estimate_cost(next);
+            visit_next.push(MinScored(next_estimate_score, next));
+        }
+    }
+
+    None
+}
+
+struct PathTracker<G>
+    where G: GraphBase,
+          G::NodeId: Eq + Hash,
+{
+    came_from: HashMap<G::NodeId, G::NodeId>,
+}
+
+impl<G> PathTracker<G>
+    where G: GraphBase,
+          G::NodeId: Eq + Hash,
+{
+    fn new() -> PathTracker<G> {
+        PathTracker {
+            came_from: HashMap::new(),
+        }
+    }
+
+    fn set_predecessor(&mut self, node: G::NodeId, previous: G::NodeId) {
+        self.came_from.insert(node, previous);
+    }
+
+    fn reconstruct_path_to(&self, last: G::NodeId) -> Vec<G::NodeId> {
+        let mut path = vec![last];
+
+        let mut current = last;
+        loop {
+            if let Some(&previous) = self.came_from.get(&current) {
+                path.push(previous);
+                current = previous;
+            } else {
+                break
+            }
+        }
+
+        path.reverse();
+
+        path
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/csr.rs
@@ -0,0 +1,897 @@
+//! Compressed Sparse Row (CSR) is a sparse adjacency matrix graph.
+
+use std::marker::PhantomData;
+use std::cmp::max;
+use std::ops::{Range, Index, IndexMut};
+use std::iter::{Enumerate, Zip};
+use std::slice::Windows;
+
+use visit::{EdgeRef, GraphBase, IntoNeighbors, NodeIndexable, IntoEdges};
+use visit::{NodeCompactIndexable, IntoNodeIdentifiers, Visitable};
+use visit::{Data, IntoEdgeReferences, NodeCount, GraphProp};
+
+use util::zip;
+
+#[doc(no_inline)]
+pub use graph::{IndexType, DefaultIx};
+
+use {
+    EdgeType,
+    Directed,
+    IntoWeightedEdge,
+};
+
+/// Csr node index type, a plain integer.
+pub type NodeIndex<Ix = DefaultIx> = Ix;
+/// Csr edge index type, a plain integer.
+pub type EdgeIndex = usize;
+
+const BINARY_SEARCH_CUTOFF: usize = 32;
+
+/// Compressed Sparse Row (CSR) is a sparse adjacency matrix graph.
+///
+/// Using **O(|E| + |V|)** space.
+///
+/// Self loops are allowed, no parallel edges.
+///
+/// Fast iteration of the outgoing edges of a vertex.
+#[derive(Debug)]
+pub struct Csr<N = (), E = (), Ty = Directed, Ix = DefaultIx> {
+    /// Column of next edge
+    column: Vec<NodeIndex<Ix>>,
+    /// weight of each edge; lock step with column
+    edges: Vec<E>,
+    /// Index of start of row Always node_count + 1 long.
+    /// Last element is always equal to column.len()
+    row: Vec<usize>,
+    node_weights: Vec<N>,
+    edge_count: usize,
+    ty: PhantomData<Ty>,
+}
+
+impl<N, E, Ty, Ix> Default for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl<N: Clone, E: Clone, Ty, Ix: Clone> Clone for Csr<N, E, Ty, Ix> {
+    fn clone(&self) -> Self {
+        Csr {
+            column: self.column.clone(),
+            edges: self.edges.clone(),
+            row: self.row.clone(),
+            node_weights: self.node_weights.clone(),
+            edge_count: self.edge_count,
+            ty: self.ty,
+        }
+    }
+}
+
+impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// Create an empty `Csr`.
+    pub fn new() -> Self {
+        Csr {
+            column: vec![],
+            edges: vec![],
+            row: vec![0; 1],
+            node_weights: vec![],
+            edge_count: 0,
+            ty: PhantomData,
+        }
+    }
+
+    /// Create a new `Csr` with `n` nodes.
+    pub fn with_nodes(n: usize) -> Self
+        where N: Default,
+    {
+        Csr {
+            column: Vec::new(),
+            edges: Vec::new(),
+            row: vec![0; n + 1],
+            node_weights: (0..n).map(|_| N::default()).collect(),
+            edge_count: 0,
+            ty: PhantomData,
+        }
+    }
+}
+
+/// Csr creation error: edges were not in sorted order.
+#[derive(Clone, Debug)]
+pub struct EdgesNotSorted {
+    first_error: (usize, usize),
+}
+
+impl<N, E, Ix> Csr<N, E, Directed, Ix>
+    where Ix: IndexType,
+{
+
+    /// Create a new `Csr` from a sorted sequence of edges
+    ///
+    /// Edges **must** be sorted and unique, where the sort order is the default
+    /// order for the pair *(u, v)* in Rust (*u* has priority).
+    ///
+    /// Computes in **O(|E| + |V|)** time.
+    pub fn from_sorted_edges<Edge>(edges: &[Edge]) -> Result<Self, EdgesNotSorted>
+        where Edge: Clone + IntoWeightedEdge<E, NodeId=NodeIndex<Ix>>,
+              N: Default,
+    {
+        let max_node_id = match edges.iter().map(|edge|
+            match edge.clone().into_weighted_edge() {
+                (x, y, _) => max(x.index(), y.index())
+            }).max() {
+            None => return Ok(Self::with_nodes(0)),
+            Some(x) => x,
+        };
+        let mut self_ = Self::with_nodes(max_node_id + 1);
+        let mut iter = edges.iter().cloned().peekable();
+        {
+            let mut rows = self_.row.iter_mut();
+
+            let mut node = 0;
+            let mut rstart = 0;
+            let mut last_target;
+            'outer: for r in &mut rows {
+                *r = rstart;
+                last_target = None;
+                'inner: loop {
+                    if let Some(edge) = iter.peek() {
+                        let (n, m, weight) = edge.clone().into_weighted_edge();
+                        // check that the edges are in increasing sequence
+                        if node > n.index() {
+                            return Err(EdgesNotSorted {
+                                first_error: (n.index(), m.index()),
+                            });
+                        }
+                        /*
+                        debug_assert!(node <= n.index(),
+                                      concat!("edges are not sorted, ",
+                                              "failed assertion source {:?} <= {:?} ",
+                                              "for edge {:?}"),
+                                      node, n, (n, m));
+                                      */
+                        if n.index() != node {
+                            break 'inner;
+                        }
+                        // check that the edges are in increasing sequence
+                        /*
+                        debug_assert!(last_target.map_or(true, |x| m > x),
+                                      "edges are not sorted, failed assertion {:?} < {:?}",
+                                      last_target, m);
+                                      */
+                        if !last_target.map_or(true, |x| m > x) {
+                            return Err(EdgesNotSorted {
+                                first_error: (n.index(), m.index()),
+                            });
+                        }
+                        last_target = Some(m);
+                        self_.column.push(m);
+                        self_.edges.push(weight);
+                        rstart += 1;
+                    } else {
+                        break 'outer;
+                    }
+                    iter.next();
+                }
+                node += 1;
+            }
+            for r in rows {
+                *r = rstart;
+            }
+        }
+
+        Ok(self_)
+    }
+}
+
+impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+
+    pub fn node_count(&self) -> usize {
+        self.row.len() - 1
+    }
+
+    pub fn edge_count(&self) -> usize {
+        if self.is_directed() {
+            self.column.len()
+        } else {
+            self.edge_count
+        }
+    }
+
+    pub fn is_directed(&self) -> bool {
+        Ty::is_directed()
+    }
+
+    /// Remove all edges
+    pub fn clear_edges(&mut self) {
+        self.column.clear();
+        self.edges.clear();
+        for r in &mut self.row {
+            *r = 0;
+        }
+        if !self.is_directed() {
+            self.edge_count = 0;
+        }
+    }
+
+    /// Adds a new node with the given weight, returning the corresponding node index.
+    pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
+        let i = self.row.len() - 1;
+        self.row.insert(i, 0);
+        self.node_weights.insert(i, weight);
+        Ix::new(i)
+    }
+
+    /// Return `true` if the edge was added
+    ///
+    /// If you add all edges in row-major order, the time complexity
+    /// is **O(|V|·|E|)** for the whole operation.
+    ///
+    /// **Panics** if `a` or `b` are out of bounds.
+    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> bool
+        where E: Clone,
+    {
+        let ret = self.add_edge_(a, b, weight.clone());
+        if ret && !self.is_directed() {
+            self.edge_count += 1;
+        }
+        if ret && !self.is_directed() && a != b {
+            let _ret2 = self.add_edge_(b, a, weight);
+            debug_assert_eq!(ret, _ret2);
+        }
+        ret
+    }
+
+    // Return false if the edge already exists
+    fn add_edge_(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> bool {
+        assert!(a.index() < self.node_count() && b.index() < self.node_count());
+        // a x b is at (a, b) in the matrix
+
+        // find current range of edges from a
+        let pos = match self.find_edge_pos(a, b) {
+            Ok(_) => return false, /* already exists */
+            Err(i) => i,
+        };
+        self.column.insert(pos, b);
+        self.edges.insert(pos, weight);
+        // update row vector
+        for r in &mut self.row[a.index() + 1..] {
+            *r += 1;
+        }
+        true
+    }
+
+    fn find_edge_pos(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Result<usize, usize> {
+        let (index, neighbors) = self.neighbors_of(a);
+        if neighbors.len() < BINARY_SEARCH_CUTOFF {
+            for (i, elt) in neighbors.iter().enumerate() {
+                if b == *elt {
+                    return Ok(i + index);
+                } else if *elt > b {
+                    return Err(i + index);
+                }
+            }
+            Err(neighbors.len() + index)
+        } else {
+            match neighbors.binary_search(&b) {
+                Ok(i) => Ok(i + index),
+                Err(i) => Err(i + index),
+            }
+        }
+    }
+
+    /// Computes in **O(log |V|)** time.
+    ///
+    /// **Panics** if the node `a` does not exist.
+    pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
+        self.find_edge_pos(a, b).is_ok()
+    }
+
+    fn neighbors_range(&self, a: NodeIndex<Ix>) -> Range<usize> {
+        let index = self.row[a.index()];
+        let end = self.row.get(a.index() + 1).cloned().unwrap_or(self.column.len());
+        index..end
+    }
+
+    fn neighbors_of(&self, a: NodeIndex<Ix>) -> (usize, &[Ix]) {
+        let r = self.neighbors_range(a);
+        (r.start, &self.column[r])
+    }
+
+    /// Computes in **O(1)** time.
+    ///
+    /// **Panics** if the node `a` does not exist.
+    pub fn out_degree(&self, a: NodeIndex<Ix>) -> usize {
+        let r = self.neighbors_range(a);
+        r.end - r.start
+    }
+
+    /// Computes in **O(1)** time.
+    ///
+    /// **Panics** if the node `a` does not exist.
+    pub fn neighbors_slice(&self, a: NodeIndex<Ix>) -> &[NodeIndex<Ix>] {
+        self.neighbors_of(a).1
+    }
+
+    /// Computes in **O(1)** time.
+    ///
+    /// **Panics** if the node `a` does not exist.
+    pub fn edges_slice(&self, a: NodeIndex<Ix>) -> &[E] {
+        &self.edges[self.neighbors_range(a)]
+    }
+
+    /// Return an iterator of all edges of `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// **Panics** if the node `a` does not exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ty, Ix>`.
+    pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
+        let r = self.neighbors_range(a);
+        Edges {
+            index: r.start,
+            source: a,
+            iter: zip(&self.column[r.clone()], &self.edges[r]),
+            ty: self.ty,
+        }
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct Edges<'a, E: 'a, Ty = Directed, Ix: 'a = DefaultIx> {
+    index: usize,
+    source: NodeIndex<Ix>,
+    iter: Zip<SliceIter<'a, NodeIndex<Ix>>, SliceIter<'a, E>>,
+    ty: PhantomData<Ty>,
+}
+
+#[derive(Debug)]
+pub struct EdgeReference<'a, E: 'a, Ty, Ix: 'a = DefaultIx> {
+    index: EdgeIndex,
+    source: NodeIndex<Ix>,
+    target: NodeIndex<Ix>,
+    weight: &'a E,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, E, Ty, Ix: Copy> Clone for EdgeReference<'a, E, Ty, Ix> {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+impl<'a, E, Ty, Ix: Copy> Copy for EdgeReference<'a, E, Ty, Ix> { }
+
+impl<'a, Ty, E, Ix> EdgeReference<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+{
+    /// Access the edge’s weight.
+    ///
+    /// **NOTE** that this method offers a longer lifetime
+    /// than the trait (unfortunately they don't match yet).
+    pub fn weight(&self) -> &'a E { self.weight }
+}
+
+impl<'a, E, Ty, Ix> EdgeRef for EdgeReference<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeId = NodeIndex<Ix>;
+    type EdgeId = EdgeIndex;
+    type Weight = E;
+
+    fn source(&self) -> Self::NodeId { self.source }
+    fn target(&self) -> Self::NodeId { self.target }
+    fn weight(&self) -> &E { self.weight }
+    fn id(&self) -> Self::EdgeId { self.index }
+}
+
+impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Item = EdgeReference<'a, E, Ty, Ix>;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(move |(&j, w)| {
+            let index = self.index;
+            self.index += 1;
+            EdgeReference {
+                index: index,
+                source: self.source,
+                target: j,
+                weight: w,
+                ty: PhantomData,
+            }
+        })
+    }
+}
+
+impl<N, E, Ty, Ix> Data for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeWeight = N;
+    type EdgeWeight = E;
+}
+
+impl<'a, N, E, Ty, Ix> IntoEdgeReferences for &'a Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeRef = EdgeReference<'a, E, Ty, Ix>;
+    type EdgeReferences = EdgeReferences<'a, E, Ty, Ix>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        EdgeReferences {
+            index: 0,
+            source_index: Ix::new(0),
+            edge_ranges: self.row.windows(2).enumerate(),
+            column: &self.column,
+            edges: &self.edges,
+            iter: zip(&[], &[]),
+            ty: self.ty,
+        }
+    }
+}
+
+pub struct EdgeReferences<'a, E: 'a, Ty, Ix: 'a> {
+    source_index: NodeIndex<Ix>,
+    index: usize,
+    edge_ranges: Enumerate<Windows<'a, usize>>,
+    column: &'a [NodeIndex<Ix>],
+    edges: &'a [E],
+    iter: Zip<SliceIter<'a, NodeIndex<Ix>>, SliceIter<'a, E>>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, E, Ty, Ix> Iterator for EdgeReferences<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Item = EdgeReference<'a, E, Ty, Ix>;
+    fn next(&mut self) -> Option<Self::Item> {
+        loop {
+            if let Some((&j, w)) = self.iter.next() {
+                let index = self.index;
+                self.index += 1;
+                return Some(EdgeReference {
+                    index: index,
+                    source: self.source_index,
+                    target: j,
+                    weight: w,
+                    ty: PhantomData,
+                })
+            }
+            if let Some((i, w)) = self.edge_ranges.next() {
+                let a = w[0];
+                let b = w[1];
+                self.iter = zip(&self.column[a..b], &self.edges[a..b]);
+                self.source_index = Ix::new(i);
+            } else {
+                return None;
+            }
+        }
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoEdges for &'a Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Edges = Edges<'a, E, Ty, Ix>;
+    fn edges(self, a: Self::NodeId) -> Self::Edges {
+        self.edges(a)
+    }
+}
+
+impl<N, E, Ty, Ix> GraphBase for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeId = NodeIndex<Ix>;
+    type EdgeId = EdgeIndex; // index into edges vector
+}
+
+use fixedbitset::FixedBitSet;
+
+impl<N, E, Ty, Ix> Visitable for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Map = FixedBitSet;
+    fn visit_map(&self) -> FixedBitSet {
+        FixedBitSet::with_capacity(self.node_count())
+    }
+    fn reset_map(&self, map: &mut Self::Map) {
+        map.clear();
+        map.grow(self.node_count());
+    }
+}
+
+use std::slice::Iter as SliceIter;
+
+#[derive(Clone, Debug)]
+pub struct Neighbors<'a, Ix: 'a = DefaultIx> {
+    iter: SliceIter<'a, NodeIndex<Ix>>,
+}
+
+impl<'a, Ix> Iterator for Neighbors<'a, Ix>
+    where Ix: IndexType,
+{
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().cloned()
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoNeighbors for &'a Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Neighbors = Neighbors<'a, Ix>;
+
+    /// Return an iterator of all neighbors of `a`.
+    ///
+    /// - `Directed`: Targets of outgoing edges from `a`.
+    /// - `Undirected`: Opposing endpoints of all edges connected to `a`.
+    ///
+    /// **Panics** if the node `a` does not exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    fn neighbors(self, a: Self::NodeId) -> Self::Neighbors {
+        Neighbors {
+            iter: self.neighbors_slice(a).iter(),
+        }
+    }
+}
+
+impl<N, E, Ty, Ix> NodeIndexable for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn node_bound(&self) -> usize { self.node_count() }
+    fn to_index(&self, a: Self::NodeId) -> usize { a.index() }
+    fn from_index(&self, ix: usize) -> Self::NodeId { Ix::new(ix) }
+}
+
+impl<N, E, Ty, Ix> NodeCompactIndexable for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+}
+
+impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Output = N;
+
+    fn index(&self, ix: NodeIndex<Ix>) -> &N {
+        &self.node_weights[ix.index()]
+    }
+}
+
+impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn index_mut(&mut self, ix: NodeIndex<Ix>) -> &mut N {
+        &mut self.node_weights[ix.index()]
+    }
+}
+
+pub struct NodeIdentifiers<Ix = DefaultIx> {
+    r: Range<usize>,
+    ty: PhantomData<Ix>,
+}
+
+impl<Ix> Iterator for NodeIdentifiers<Ix>
+    where Ix: IndexType,
+{
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.r.next().map(Ix::new)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.r.size_hint()
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoNodeIdentifiers for &'a Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeIdentifiers = NodeIdentifiers<Ix>;
+    fn node_identifiers(self) -> Self::NodeIdentifiers {
+        NodeIdentifiers {
+            r: 0..self.node_count(),
+            ty: PhantomData,
+        }
+    }
+}
+
+impl<N, E, Ty, Ix> NodeCount for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn node_count(&self) -> usize {
+        (*self).node_count()
+    }
+}
+
+impl<N, E, Ty, Ix> GraphProp for Csr<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeType = Ty;
+}
+
+/*
+ *
+Example
+
+[ a 0 b
+  c d e
+  0 0 f ]
+
+Values: [a, b, c, d, e, f]
+Column: [0, 2, 0, 1, 2, 2]
+Row   : [0, 2, 5]   <- value index of row start
+
+ * */
+
+#[cfg(test)]
+mod tests {
+    use super::Csr;
+    use Undirected;
+    use visit::Dfs;
+    use visit::VisitMap;
+    use algo::tarjan_scc;
+    use algo::bellman_ford;
+
+    #[test]
+    fn csr1() {
+        let mut m: Csr = Csr::with_nodes(3);
+        m.add_edge(0, 0, ());
+        m.add_edge(1, 2, ());
+        m.add_edge(2, 2, ());
+        m.add_edge(0, 2, ());
+        m.add_edge(1, 0, ());
+        m.add_edge(1, 1, ());
+        println!("{:?}", m);
+        assert_eq!(&m.column, &[0, 2, 0, 1, 2, 2]);
+        assert_eq!(&m.row, &[0, 2, 5, 6]);
+
+        let added = m.add_edge(1, 2, ());
+        assert!(!added);
+        assert_eq!(&m.column, &[0, 2, 0, 1, 2, 2]);
+        assert_eq!(&m.row, &[0, 2, 5, 6]);
+
+        assert_eq!(m.neighbors_slice(1), &[0, 1, 2]);
+        assert_eq!(m.node_count(), 3);
+        assert_eq!(m.edge_count(), 6);
+    }
+
+    #[test]
+    fn csr_undirected() {
+    /*
+        [ 1 . 1
+          . . 1
+          1 1 1 ]
+     */
+
+        let mut m: Csr<(), (), Undirected> = Csr::with_nodes(3);
+        m.add_edge(0, 0, ());
+        m.add_edge(0, 2, ());
+        m.add_edge(1, 2, ());
+        m.add_edge(2, 2, ());
+        println!("{:?}", m);
+        assert_eq!(&m.column, &[0, 2, 2, 0, 1, 2]);
+        assert_eq!(&m.row, &[0, 2, 3, 6]);
+        assert_eq!(m.node_count(), 3);
+        assert_eq!(m.edge_count(), 4);
+    }
+
+    #[should_panic]
+    #[test]
+    fn csr_from_error_1() {
+        // not sorted in source
+        let m: Csr = Csr::from_sorted_edges(&[
+            (0, 1),
+            (1, 0),
+            (0, 2),
+        ]).unwrap();
+        println!("{:?}", m);
+    }
+
+    #[should_panic]
+    #[test]
+    fn csr_from_error_2() {
+        // not sorted in target
+        let m: Csr = Csr::from_sorted_edges(&[
+            (0, 1),
+            (1, 0),
+            (1, 2),
+            (1, 1),
+        ]).unwrap();
+        println!("{:?}", m);
+    }
+
+    #[test]
+    fn csr_from() {
+        let m: Csr = Csr::from_sorted_edges(&[
+            (0, 1),
+            (0, 2),
+            (1, 0),
+            (1, 1),
+            (2, 2),
+            (2, 4),
+        ]).unwrap();
+        println!("{:?}", m);
+        assert_eq!(m.neighbors_slice(0), &[1, 2]);
+        assert_eq!(m.neighbors_slice(1), &[0, 1]);
+        assert_eq!(m.neighbors_slice(2), &[2, 4]);
+        assert_eq!(m.node_count(), 5);
+        assert_eq!(m.edge_count(), 6);
+    }
+
+    #[test]
+    fn csr_dfs() {
+        let mut m: Csr = Csr::from_sorted_edges(&[
+            (0, 1),
+            (0, 2),
+            (1, 0),
+            (1, 1),
+            (1, 3),
+            (2, 2),
+
+            // disconnected subgraph
+            (4, 4),
+            (4, 5),
+        ]).unwrap();
+        println!("{:?}", m);
+        let mut dfs = Dfs::new(&m, 0);
+        while let Some(_) = dfs.next(&m) {
+        }
+        for i in 0..m.node_count() - 2 {
+            assert!(dfs.discovered.is_visited(&i), "visited {}", i)
+        }
+        assert!(!dfs.discovered[4]);
+        assert!(!dfs.discovered[5]);
+
+        m.add_edge(1, 4, ());
+        println!("{:?}", m);
+
+        dfs.reset(&m);
+        dfs.move_to(0);
+        while let Some(_) = dfs.next(&m) {
+        }
+
+        for i in 0..m.node_count() {
+            assert!(dfs.discovered[i], "visited {}", i)
+        }
+    }
+
+    #[test]
+    fn csr_tarjan() {
+        let m: Csr = Csr::from_sorted_edges(&[
+            (0, 1),
+            (0, 2),
+            (1, 0),
+            (1, 1),
+            (1, 3),
+            (2, 2),
+            (2, 4),
+            (4, 4),
+            (4, 5),
+            (5, 2),
+        ]).unwrap();
+        println!("{:?}", m);
+        println!("{:?}", tarjan_scc(&m));
+    }
+
+    #[test]
+    fn test_bellman_ford() {
+        let m: Csr<(), _> = Csr::from_sorted_edges(&[
+            (0, 1, 0.5),
+            (0, 2, 2.),
+            (1, 0, 1.),
+            (1, 1, 1.),
+            (1, 2, 1.),
+            (1, 3, 1.),
+            (2, 3, 3.),
+
+            (4, 5, 1.),
+            (5, 7, 2.),
+            (6, 7, 1.),
+            (7, 8, 3.),
+        ]).unwrap();
+        println!("{:?}", m);
+        let result = bellman_ford(&m, 0).unwrap();
+        println!("{:?}", result);
+        let answer = [0., 0.5, 1.5, 1.5];
+        assert_eq!(&answer, &result.0[..4]);
+        assert!(answer[4..].iter().all(|&x| f64::is_infinite(x)));
+    }
+
+    #[test]
+    fn test_bellman_ford_neg_cycle() {
+        let m: Csr<(), _> = Csr::from_sorted_edges(&[
+            (0, 1, 0.5),
+            (0, 2, 2.),
+            (1, 0, 1.),
+            (1, 1, -1.),
+            (1, 2, 1.),
+            (1, 3, 1.),
+            (2, 3, 3.),
+        ]).unwrap();
+        let result = bellman_ford(&m, 0);
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn test_edge_references() {
+        use visit::EdgeRef;
+        use visit::IntoEdgeReferences;
+        let m: Csr<(), _> = Csr::from_sorted_edges(&[
+            (0, 1, 0.5),
+            (0, 2, 2.),
+            (1, 0, 1.),
+            (1, 1, 1.),
+            (1, 2, 1.),
+            (1, 3, 1.),
+            (2, 3, 3.),
+
+            (4, 5, 1.),
+            (5, 7, 2.),
+            (6, 7, 1.),
+            (7, 8, 3.),
+        ]).unwrap();
+        let mut copy = Vec::new();
+        for e in m.edge_references() {
+            copy.push((e.source(), e.target(), *e.weight()));
+            println!("{:?}", e);
+        }
+        let m2: Csr<(), _> = Csr::from_sorted_edges(&copy).unwrap();
+        assert_eq!(&m.row, &m2.row);
+        assert_eq!(&m.column, &m2.column);
+        assert_eq!(&m.edges, &m2.edges);
+    }
+
+    #[test]
+    fn test_add_node() {
+        let mut g: Csr = Csr::new();
+        let a = g.add_node(());
+        let b = g.add_node(());
+        let c = g.add_node(());
+
+        assert!(g.add_edge(a, b, ()));
+        assert!(g.add_edge(b, c, ()));
+        assert!(g.add_edge(c, a, ()));
+
+        println!("{:?}", g);
+
+        assert_eq!(g.node_count(), 3);
+
+        assert_eq!(g.neighbors_slice(a), &[b]);
+        assert_eq!(g.neighbors_slice(b), &[c]);
+        assert_eq!(g.neighbors_slice(c), &[a]);
+
+        assert_eq!(g.edge_count(), 3);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/data.rs
@@ -0,0 +1,435 @@
+//! Graph traits for associated data and graph construction.
+
+
+use Graph;
+#[cfg(feature = "stable_graph")]
+use stable_graph::StableGraph;
+use ::{
+    EdgeType,
+};
+use graph::IndexType;
+#[cfg(feature = "graphmap")]
+use graphmap::{GraphMap, NodeTrait};
+use visit::{
+    Data,
+    NodeCount,
+    NodeIndexable,
+    Reversed,
+};
+
+trait_template!{
+    /// Access node and edge weights (associated data).
+pub trait DataMap : Data {
+    @section self
+    fn node_weight(self: &Self, id: Self::NodeId) -> Option<&Self::NodeWeight>;
+    fn edge_weight(self: &Self, id: Self::EdgeId) -> Option<&Self::EdgeWeight>;
+}
+}
+
+macro_rules! access0 {
+    ($e:expr) => ($e.0);
+}
+
+DataMap!{delegate_impl []}
+DataMap!{delegate_impl [['a, G], G, &'a mut G, deref_twice]}
+DataMap!{delegate_impl [[G], G, Reversed<G>, access0]}
+
+trait_template! {
+    /// Access node and edge weights mutably.
+pub trait DataMapMut : DataMap {
+    @section self
+    fn node_weight_mut(self: &mut Self, id: Self::NodeId) -> Option<&mut Self::NodeWeight>;
+    fn edge_weight_mut(self: &mut Self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight>;
+}
+}
+
+DataMapMut!{delegate_impl [['a, G], G, &'a mut G, deref_twice]}
+DataMapMut!{delegate_impl [[G], G, Reversed<G>, access0]}
+
+/// A graph that can be extended with further nodes and edges
+pub trait Build : Data + NodeCount {
+    fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId;
+    /// Add a new edge. If parallel edges (duplicate) are not allowed and
+    /// the edge already exists, return `None`.
+    fn add_edge(&mut self,
+                a: Self::NodeId,
+                b: Self::NodeId,
+                weight: Self::EdgeWeight) -> Option<Self::EdgeId> {
+        Some(self.update_edge(a, b, weight))
+    }
+    /// Add or update the edge from `a` to `b`. Return the id of the affected
+    /// edge.
+    fn update_edge(&mut self,
+                   a: Self::NodeId,
+                   b: Self::NodeId,
+                   weight: Self::EdgeWeight) -> Self::EdgeId;
+}
+
+/// A graph that can be created
+pub trait Create : Build + Default {
+    fn with_capacity(nodes: usize, edges: usize) -> Self;
+}
+
+impl<N, E, Ty, Ix> Data for Graph<N, E, Ty, Ix>
+    where Ix: IndexType
+{
+    type NodeWeight = N;
+    type EdgeWeight = E;
+}
+
+impl<N, E, Ty, Ix> DataMap for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType
+{
+    fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
+        self.node_weight(id)
+    }
+    fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> {
+        self.edge_weight(id)
+    }
+}
+
+impl<N, E, Ty, Ix> DataMapMut for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType
+{
+    fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> {
+        self.node_weight_mut(id)
+    }
+    fn edge_weight_mut(&mut self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight> {
+        self.edge_weight_mut(id)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> DataMap for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType
+{
+    fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
+        self.node_weight(id)
+    }
+    fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> {
+        self.edge_weight(id)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> DataMapMut for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType
+{
+    fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> {
+        self.node_weight_mut(id)
+    }
+    fn edge_weight_mut(&mut self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight> {
+        self.edge_weight_mut(id)
+    }
+}
+
+impl<N, E, Ty, Ix> Build for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
+        self.add_node(weight)
+    }
+    fn add_edge(&mut self,
+                a: Self::NodeId,
+                b: Self::NodeId,
+                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
+    {
+        Some(self.add_edge(a, b, weight))
+    }
+    fn update_edge(&mut self,
+                   a: Self::NodeId,
+                   b: Self::NodeId,
+                   weight: Self::EdgeWeight) -> Self::EdgeId
+    {
+        self.update_edge(a, b, weight)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> Build for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
+        self.add_node(weight)
+    }
+    fn add_edge(&mut self,
+                a: Self::NodeId,
+                b: Self::NodeId,
+                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
+    {
+        Some(self.add_edge(a, b, weight))
+    }
+    fn update_edge(&mut self,
+                   a: Self::NodeId,
+                   b: Self::NodeId,
+                   weight: Self::EdgeWeight) -> Self::EdgeId
+    {
+        self.update_edge(a, b, weight)
+    }
+}
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> Build for GraphMap<N, E, Ty>
+    where Ty: EdgeType,
+          N: NodeTrait,
+{
+    fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
+        self.add_node(weight)
+    }
+    fn add_edge(&mut self,
+                a: Self::NodeId,
+                b: Self::NodeId,
+                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
+    {
+        if self.contains_edge(a, b) {
+            None
+        } else {
+            let r = self.add_edge(a, b, weight);
+            debug_assert!(r.is_none());
+            Some((a, b))
+        }
+    }
+    fn update_edge(&mut self,
+                   a: Self::NodeId,
+                   b: Self::NodeId,
+                   weight: Self::EdgeWeight) -> Self::EdgeId
+    {
+        self.add_edge(a, b, weight);
+        (a, b)
+    }
+}
+
+
+impl<N, E, Ty, Ix> Create for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn with_capacity(nodes: usize, edges: usize) -> Self {
+        Self::with_capacity(nodes, edges)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> Create for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn with_capacity(nodes: usize, edges: usize) -> Self {
+        Self::with_capacity(nodes, edges)
+    }
+}
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> Create for GraphMap<N, E, Ty>
+    where Ty: EdgeType,
+          N: NodeTrait,
+{
+    fn with_capacity(nodes: usize, edges: usize) -> Self {
+        Self::with_capacity(nodes, edges)
+    }
+}
+
+/// A graph element.
+///
+/// A sequence of Elements, for example an iterator, is laid out as follows:
+/// Nodes are implicitly given the index of their appearance in the sequence.
+/// The edges’ source and target fields refer to these indices.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum Element<N, E> {
+    /// A graph node.
+    Node {
+        weight: N,
+    },
+    /// A graph edge.
+    Edge {
+        source: usize,
+        target: usize,
+        weight: E,
+    }
+}
+
+/// Create a graph from an iterator of elements.
+pub trait FromElements : Create {
+    fn from_elements<I>(iterable: I) -> Self
+        where Self: Sized,
+              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    {
+        let mut gr = Self::with_capacity(0, 0);
+        // usize -> NodeId map
+        let mut map = Vec::new();
+        for element in iterable {
+            match element {
+                Element::Node { weight } => {
+                    map.push(gr.add_node(weight));
+                }
+                Element::Edge { source, target, weight } => {
+                    gr.add_edge(map[source], map[target], weight);
+                }
+            }
+        }
+        gr
+    }
+        
+}
+
+fn from_elements_indexable<G, I>(iterable: I) -> G
+    where G: Create + NodeIndexable,
+          I: IntoIterator<Item=Element<G::NodeWeight, G::EdgeWeight>>,
+{
+    let mut gr = G::with_capacity(0, 0);
+    let map = |gr: &G, i| gr.from_index(i);
+    for element in iterable {
+        match element {
+            Element::Node { weight } => {
+                gr.add_node(weight);
+            }
+            Element::Edge { source, target, weight } => {
+                let from = map(&gr, source);
+                let to = map(&gr, target);
+                gr.add_edge(from, to, weight);
+            }
+        }
+    }
+    gr
+}
+
+impl<N, E, Ty, Ix> FromElements for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn from_elements<I>(iterable: I) -> Self
+        where Self: Sized,
+              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    {
+        from_elements_indexable(iterable)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> FromElements for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn from_elements<I>(iterable: I) -> Self
+        where Self: Sized,
+              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    {
+        from_elements_indexable(iterable)
+    }
+}
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> FromElements for GraphMap<N, E, Ty>
+    where Ty: EdgeType,
+          N: NodeTrait,
+{
+    fn from_elements<I>(iterable: I) -> Self
+        where Self: Sized,
+              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    {
+        from_elements_indexable(iterable)
+    }
+}
+
+/// Iterator adaptors for iterators of `Element`.
+pub trait ElementIterator<N, E> : Iterator<Item=Element<N, E>> {
+    /// Create an iterator adaptor that filters graph elements.
+    ///
+    /// The function `f` is called with each element and if its return value
+    /// is `true` the element is accepted and if `false` it is removed.
+    /// `f` is called with mutable references to the node and edge weights,
+    /// so that they can be mutated (but the edge endpoints can not).
+    ///
+    /// This filter adapts the edge source and target indices in the
+    /// stream so that they are correct after the removals.
+    fn filter_elements<F>(self, f: F) -> FilterElements<Self, F>
+        where Self: Sized,
+              F: FnMut(Element<&mut N, &mut E>) -> bool,
+    {
+        FilterElements {
+            iter: self,
+            node_index: 0,
+            map: Vec::new(),
+            f: f,
+        }
+    }
+}
+
+impl<N, E, I: ?Sized> ElementIterator<N, E> for I
+    where I: Iterator<Item=Element<N, E>> { }
+
+/// An iterator that filters graph elements.
+///
+/// See [`.filter_elements()`][1] for more information.
+///
+/// [1]: trait.ElementIterator.html#method.filter_elements
+pub struct FilterElements<I, F> {
+    iter: I,
+    node_index: usize,
+    map: Vec<usize>,
+    f: F,
+}
+
+impl<I, F, N, E> Iterator for FilterElements<I, F>
+    where I: Iterator<Item=Element<N, E>>,
+          F: FnMut(Element<&mut N, &mut E>) -> bool,
+{
+    type Item = Element<N, E>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        loop {
+            let mut elt = match self.iter.next() {
+                None => return None,
+                Some(elt) => elt,
+            };
+            let keep = (self.f)(match elt {
+                Element::Node { ref mut weight } => Element::Node { weight: weight },
+                Element::Edge { source, target, ref mut weight }
+                    => Element::Edge { source: source, target: target, weight: weight },
+            });
+            let is_node = if let Element::Node { .. } = elt { true } else { false };
+            if !keep && is_node {
+                self.map.push(self.node_index);
+            }
+            if is_node {
+                self.node_index += 1;
+            }
+            if !keep {
+                continue;
+            }
+
+            // map edge parts
+            match elt {
+                Element::Edge {
+                    ref mut source,
+                    ref mut target,
+                    ..
+                } => {
+                    // Find the node indices in the map of removed ones.
+                    // If a node was removed, the edge is as well.
+                    // Otherwise the counts are adjusted by the number of nodes
+                    // removed.
+                    // Example: map: [1, 3, 4, 6]
+                    // binary search for 2, result is Err(1). One node has been
+                    // removed before 2.
+                    match self.map.binary_search(source) {
+                        Ok(_) => continue,
+                        Err(i) => *source -= i,
+                    }
+                    match self.map.binary_search(target) {
+                        Ok(_) => continue,
+                        Err(i) => *target -= i,
+                    }
+                }
+                Element::Node { .. } => { }
+            }
+            return Some(elt);
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/dijkstra.rs
@@ -0,0 +1,79 @@
+use std::collections::{
+    HashMap,
+    BinaryHeap,
+};
+use std::collections::hash_map::Entry::{
+    Occupied,
+    Vacant,
+};
+
+use std::hash::Hash;
+
+use scored::MinScored;
+use super::visit::{
+    Visitable,
+    VisitMap,
+    IntoEdges,
+    EdgeRef,
+};
+use algo::Measure;
+
+/// [Generic] Dijkstra's shortest path algorithm.
+///
+/// Compute the length of the shortest path from `start` to every reachable
+/// node.
+///
+/// The graph should be `Visitable` and implement `IntoEdges`. The function
+/// `edge_cost` should return the cost for a particular edge, which is used
+/// to compute path costs. Edge costs must be non-negative.
+///
+/// If `goal` is not `None`, then the algorithm terminates once the `goal` node's
+/// cost is calculated.
+///
+/// Returns a `HashMap` that maps `NodeId` to path cost.
+pub fn dijkstra<G, F, K>(graph: G, start: G::NodeId, goal: Option<G::NodeId>,
+                         mut edge_cost: F)
+    -> HashMap<G::NodeId, K>
+    where G: IntoEdges + Visitable,
+          G::NodeId: Eq + Hash,
+          F: FnMut(G::EdgeRef) -> K,
+          K: Measure + Copy,
+{
+    let mut visited = graph.visit_map();
+    let mut scores = HashMap::new();
+    //let mut predecessor = HashMap::new();
+    let mut visit_next = BinaryHeap::new();
+    let zero_score = K::default();
+    scores.insert(start, zero_score);
+    visit_next.push(MinScored(zero_score, start));
+    while let Some(MinScored(node_score, node)) = visit_next.pop() {
+        if visited.is_visited(&node) {
+            continue
+        }
+        if goal.as_ref() == Some(&node) {
+            break
+        }
+        for edge in graph.edges(node) {
+            let next = edge.target();
+            if visited.is_visited(&next) {
+                continue
+            }
+            let mut next_score = node_score + edge_cost(edge);
+            match scores.entry(next) {
+                Occupied(ent) => if next_score < *ent.get() {
+                    *ent.into_mut() = next_score;
+                    //predecessor.insert(next.clone(), node.clone());
+                } else {
+                    next_score = *ent.get();
+                },
+                Vacant(ent) => {
+                    ent.insert(next_score);
+                    //predecessor.insert(next.clone(), node.clone());
+                }
+            }
+            visit_next.push(MinScored(next_score, next));
+        }
+        visited.visit(node);
+    }
+    scores
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/dot.rs
@@ -0,0 +1,207 @@
+//! Simple graphviz dot file format output.
+
+use std::fmt::{self, Display, Write};
+
+use visit::{GraphRef};
+
+/// `Dot` implements output to graphviz .dot format for a graph.
+///
+/// Formatting and options are rather simple, this is mostly intended
+/// for debugging. Exact output may change.
+///
+/// # Examples
+///
+/// ```
+/// use petgraph::Graph;
+/// use petgraph::dot::{Dot, Config};
+///
+/// let mut graph = Graph::<_, ()>::new();
+/// graph.add_node("A");
+/// graph.add_node("B");
+/// graph.add_node("C");
+/// graph.add_node("D");
+/// graph.extend_with_edges(&[
+///     (0, 1), (0, 2), (0, 3),
+///     (1, 2), (1, 3),
+///     (2, 3),
+/// ]);
+///
+/// println!("{:?}", Dot::with_config(&graph, &[Config::EdgeNoLabel]));
+///
+/// // In this case the output looks like this:
+/// // 
+/// // digraph {
+/// //     0 [label="\"A\""]
+/// //     1 [label="\"B\""]
+/// //     2 [label="\"C\""]
+/// //     3 [label="\"D\""]
+/// //     0 -> 1
+/// //     0 -> 2
+/// //     0 -> 3
+/// //     1 -> 2
+/// //     1 -> 3
+/// //     2 -> 3
+/// // }
+///
+/// // If you need multiple config options, just list them all in the slice.
+/// ```
+pub struct Dot<'a, G> {
+    graph: G,
+    config: &'a [Config],
+}
+
+static TYPE: [&'static str; 2] = ["graph", "digraph"];
+static EDGE: [&'static str; 2] = ["--", "->"];
+static INDENT: &'static str = "    ";
+
+impl<'a, G> Dot<'a, G> where G: GraphRef {
+    /// Create a `Dot` formatting wrapper with default configuration.
+    pub fn new(graph: G) -> Self {
+        Self::with_config(graph, &[])
+    }
+
+    /// Create a `Dot` formatting wrapper with custom configuration.
+    pub fn with_config(graph: G, config: &'a [Config]) -> Self {
+        Dot {
+            graph: graph,
+            config: config,
+        }
+    }
+}
+
+/// `Dot` configuration.
+///
+/// This enum does not have an exhaustive definition (will be expanded)
+#[derive(Debug, PartialEq, Eq)]
+pub enum Config {
+    /// Use indices for node labels.
+    NodeIndexLabel,
+    /// Use indices for edge labels.
+    EdgeIndexLabel,
+    /// Use no edge labels.
+    EdgeNoLabel,
+    #[doc(hidden)]
+    _Incomplete(()),
+}
+
+use visit::{ IntoNodeReferences, NodeIndexable, IntoEdgeReferences, EdgeRef};
+use visit::{ Data, NodeRef, GraphProp, };
+
+impl<'a, G> Dot<'a, G>
+{
+    fn graph_fmt<NF, EF, NW, EW>(&self, g: G, f: &mut fmt::Formatter,
+                    mut node_fmt: NF, mut edge_fmt: EF) -> fmt::Result
+        where G: NodeIndexable + IntoNodeReferences + IntoEdgeReferences,
+              G: GraphProp,
+              G: Data<NodeWeight=NW, EdgeWeight=EW>,
+              NF: FnMut(&NW, &mut FnMut(&Display) -> fmt::Result) -> fmt::Result,
+              EF: FnMut(&EW, &mut FnMut(&Display) -> fmt::Result) -> fmt::Result,
+    {
+        try!(writeln!(f, "{} {{", TYPE[g.is_directed() as usize]));
+
+        // output all labels
+        for node in g.node_references() {
+            try!(write!(f, "{}{}", INDENT, g.to_index(node.id())));
+            if self.config.contains(&Config::NodeIndexLabel) {
+                try!(writeln!(f, ""));
+            } else {
+                try!(write!(f, " [label=\""));
+                try!(node_fmt(node.weight(), &mut |d| Escaped(d).fmt(f)));
+                try!(writeln!(f, "\"]"));
+            }
+
+        }
+        // output all edges
+        for (i, edge) in g.edge_references().enumerate() {
+            try!(write!(f, "{}{} {} {}",
+                        INDENT,
+                        g.to_index(edge.source()),
+                        EDGE[g.is_directed() as usize],
+                        g.to_index(edge.target())));
+            if self.config.contains(&Config::EdgeNoLabel) {
+                try!(writeln!(f, ""));
+            } else if self.config.contains(&Config::EdgeIndexLabel) {
+                try!(writeln!(f, " [label=\"{}\"]", i));
+            } else {
+                try!(write!(f, " [label=\""));
+                try!(edge_fmt(edge.weight(), &mut |d| Escaped(d).fmt(f)));
+                try!(writeln!(f, "\"]"));
+            }
+        }
+
+        try!(writeln!(f, "}}"));
+        Ok(())
+    }
+}
+
+impl<'a, G> fmt::Display for Dot<'a, G>
+    where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
+          G::EdgeWeight: fmt::Display,
+          G::NodeWeight: fmt::Display,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.graph_fmt(self.graph, f, |n, cb| cb(n), |e, cb| cb(e))
+    }
+}
+
+impl<'a, G> fmt::Debug for Dot<'a, G>
+    where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
+          G::EdgeWeight: fmt::Debug,
+          G::NodeWeight: fmt::Debug,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.graph_fmt(self.graph, f,
+                       |n, cb| cb(&DebugFmt(n)),
+                       |e, cb| cb(&DebugFmt(e)))
+    }
+}
+
+/// Escape for Graphviz
+struct Escaper<W>(W);
+
+impl<W> fmt::Write for Escaper<W>
+    where W: fmt::Write
+{
+    fn write_str(&mut self, s: &str) -> fmt::Result {
+        for c in s.chars() {
+            try!(self.write_char(c));
+        }
+        Ok(())
+    }
+
+    fn write_char(&mut self, c: char) -> fmt::Result {
+        match c {
+            '"' => try!(self.0.write_char('\\')),
+            // \l is for left justified linebreak
+            '\n' => return self.0.write_str(r#"\l"#),
+            _   => { }
+        }
+        self.0.write_char(c)
+    }
+}
+
+/// Pass Display formatting through a simple escaping filter
+struct Escaped<T>(T);
+
+impl<T> fmt::Display for Escaped<T>
+    where T: fmt::Display
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if f.alternate() {
+            write!(&mut Escaper(f), "{:#}\\l", &self.0)
+        } else {
+            write!(&mut Escaper(f), "{}", &self.0)
+        }
+    }
+}
+
+/// Pass Debug formatting to Display
+struct DebugFmt<T>(T);
+
+impl<T> fmt::Display for DebugFmt<T>
+    where T: fmt::Debug
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.0.fmt(f)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/generate.rs
@@ -0,0 +1,129 @@
+//! ***Unstable.*** Graph generation.
+//!
+//! ***Unstable: API may change at any time.*** Depends on `feature = "generate"`.
+//!
+
+use {Graph, Directed, EdgeType};
+use graph::NodeIndex;
+
+// A DAG has the property that the adjacency matrix is lower triangular,
+// diagonal zero.
+//
+// This means we only allow edges i → j where i < j.
+//
+// The set of all DAG of a particular size is simply the power set of all
+// possible edges.
+//
+// For a graph of n=3 nodes we have (n - 1) * n / 2 = 3 possible edges.
+
+/// A graph generator of “all” graphs of a particular size.
+///
+/// ***Unstable: API may change at any time.*** Depends on `feature = "generate"`.
+pub struct Generator<Ty> {
+    acyclic: bool,
+    selfloops: bool,
+    nodes: usize,
+    /// number of possible edges
+    nedges: usize,
+    /// current edge bitmap
+    bits: u64,
+    g: Graph<(), (), Ty>,
+}
+
+impl Generator<Directed> {
+    /// Generate all possible Directed acyclic graphs (DAGs) of a particular number of vertices.
+    ///
+    /// These are only generated with one per isomorphism, so they use
+    /// one canonical node labeling where node *i* can only have edges to node *j* if *i < j*.
+    ///
+    /// For a graph of *k* vertices there are *e = (k - 1) k / 2* possible edges and
+    /// *2<sup>e</sup>* DAGs.
+    pub fn directed_acyclic(nodes: usize) -> Self {
+        assert!(nodes != 0);
+        let nedges = (nodes - 1) * nodes / 2;
+        assert!(nedges < 64);
+        Generator {
+            acyclic: true,
+            selfloops: false,
+            nodes: nodes,
+            nedges:nedges,
+            bits: !0,
+            g: Graph::with_capacity(nodes, nedges),
+        }
+    }
+}
+
+impl<Ty: EdgeType> Generator<Ty> {
+    /// Generate all possible graphs of a particular number of vertices.
+    ///
+    /// All permutations are generated, so the graphs are not unique down to isomorphim.
+    ///
+    /// For a graph of *k* vertices there are *e = k²* possible edges and
+    /// *2<sup>k<sup>2</sup></sup>* graphs.
+    pub fn all(nodes: usize, allow_selfloops: bool) -> Self {
+        let scale = if Ty::is_directed() { 1 } else { 2 };
+        let nedges = if allow_selfloops {
+            (nodes * nodes - nodes) / scale + nodes
+        } else {
+            (nodes * nodes) / scale - nodes
+        };
+        assert!(nedges < 64);
+        Generator {
+            acyclic: false,
+            selfloops: allow_selfloops,
+            nodes: nodes,
+            nedges: nedges,
+            bits: !0,
+            g: Graph::with_capacity(nodes, nedges),
+        }
+    }
+
+    fn state_to_graph(&mut self) -> &Graph<(), (), Ty> {
+        self.g.clear();
+        for _ in 0..self.nodes {
+            self.g.add_node(());
+        }
+        // For a DAG:
+        // interpret the bits in order, it's a lower triangular matrix:
+        //   a b c d
+        // a x x x x
+        // b 0 x x x
+        // c 1 2 x x
+        // d 3 4 5 x
+        let mut bit = 0;
+        for i in 0..self.nodes {
+            let start = if self.acyclic || !self.g.is_directed() { i } else { 0 };
+            for j in start..self.nodes {
+                if i == j && !self.selfloops {
+                    continue;
+                }
+                if self.bits & (1u64 << bit) != 0 {
+                    self.g.add_edge(NodeIndex::new(i), NodeIndex::new(j), ());
+                }
+
+                bit += 1;
+            }
+        }
+        &self.g
+    }
+
+    pub fn next_ref(&mut self) -> Option<&Graph<(), (), Ty>> {
+        if self.bits == !0 {
+            self.bits = 0;
+        } else {
+            self.bits += 1;
+            if self.bits >= 1u64 << self.nedges {
+                return None;
+            }
+        }
+        Some(self.state_to_graph())
+    }
+}
+
+impl<Ty: EdgeType> Iterator for Generator<Ty> {
+    type Item = Graph<(), (), Ty>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.next_ref().cloned()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graph_impl/frozen.rs
@@ -0,0 +1,82 @@
+
+use std::ops::{Deref, Index, IndexMut};
+
+use graph::Graph;
+use super::Frozen;
+use graph::{IndexType, GraphIndex};
+use {
+    Direction,
+    EdgeType,
+};
+use visit::{Data, IntoNodeIdentifiers, GraphProp, NodeIndexable, IntoNeighborsDirected};
+use visit::{IntoNeighbors, IntoNodeReferences, IntoEdgeReferences, Visitable};
+use visit::{NodeCompactIndexable, GetAdjacencyMatrix, NodeCount, IntoEdges, IntoEdgesDirected};
+use data::{DataMap, DataMapMut};
+
+
+impl<'a, G> Frozen<'a, G> {
+    pub fn new(gr: &'a mut G) -> Self {
+        Frozen(gr)
+    }
+}
+
+impl<'a, G> Deref for Frozen<'a, G> {
+    type Target = G;
+    fn deref(&self) -> &G { self.0 }
+}
+
+impl<'a, G, I> Index<I> for Frozen<'a, G>
+    where G: Index<I>
+{
+    type Output = G::Output;
+    fn index(&self, i: I) -> &G::Output { self.0.index(i) }
+}
+
+impl<'a, G, I> IndexMut<I> for Frozen<'a, G>
+    where G: IndexMut<I>
+{
+    fn index_mut(&mut self, i: I) -> &mut G::Output { self.0.index_mut(i) }
+}
+
+impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// Index the `Graph` by two indices, any combination of
+    /// node or edge indices is fine.
+    ///
+    /// **Panics** if the indices are equal or if they are out of bounds.
+    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
+        -> (&mut <Graph<N, E, Ty, Ix> as Index<T>>::Output,
+            &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output)
+        where Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>,
+              T: GraphIndex,
+              U: GraphIndex,
+    {
+        self.0.index_twice_mut(i, j)
+    }
+}
+
+macro_rules! access0 {
+    ($e:expr) => ($e.0);
+}
+
+Data!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+DataMap!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+DataMapMut!{delegate_impl [['a, G], G, Frozen<'a, G>, access0]}
+GetAdjacencyMatrix!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+IntoEdgeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoEdges!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoEdgesDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNeighbors!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNeighborsDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNodeIdentifiers!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNodeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+NodeCompactIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+NodeCount!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+NodeIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+GraphProp!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+Visitable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graph_impl/mod.rs
@@ -0,0 +1,2030 @@
+use std::cmp;
+use std::fmt;
+use std::hash::Hash;
+use std::iter;
+use std::marker::PhantomData;
+use std::mem::size_of;
+use std::ops::{Index, IndexMut, Range};
+use std::slice;
+
+use {
+    Direction, Outgoing, Incoming,
+    Undirected,
+    Directed,
+    EdgeType,
+    IntoWeightedEdge,
+};
+
+use iter_format::{
+    IterFormatExt,
+    NoPretty,
+    DebugMap,
+};
+
+use visit::EdgeRef;
+use visit::{IntoNodeReferences, IntoEdges, IntoEdgesDirected};
+use util::enumerate;
+
+#[cfg(feature = "serde-1")]
+mod serialization;
+
+
+/// The default integer type for graph indices.
+/// `u32` is the default to reduce the size of the graph's data and improve
+/// performance in the common case.
+///
+/// Used for node and edge indices in `Graph` and `StableGraph`, used
+/// for node indices in `Csr`.
+pub type DefaultIx = u32;
+
+/// Trait for the unsigned integer type used for node and edge indices.
+///
+/// Marked `unsafe` because: the trait must faithfully preseve
+/// and convert index values.
+pub unsafe trait IndexType : Copy + Default + Hash + Ord + fmt::Debug + 'static
+{
+    fn new(x: usize) -> Self;
+    fn index(&self) -> usize;
+    fn max() -> Self;
+}
+
+unsafe impl IndexType for usize {
+    #[inline(always)]
+    fn new(x: usize) -> Self { x }
+    #[inline(always)]
+    fn index(&self) -> Self { *self }
+    #[inline(always)]
+    fn max() -> Self { ::std::usize::MAX }
+}
+
+unsafe impl IndexType for u32 {
+    #[inline(always)]
+    fn new(x: usize) -> Self { x as u32 }
+    #[inline(always)]
+    fn index(&self) -> usize { *self as usize }
+    #[inline(always)]
+    fn max() -> Self { ::std::u32::MAX }
+}
+
+unsafe impl IndexType for u16 {
+    #[inline(always)]
+    fn new(x: usize) -> Self { x as u16 }
+    #[inline(always)]
+    fn index(&self) -> usize { *self as usize }
+    #[inline(always)]
+    fn max() -> Self { ::std::u16::MAX }
+}
+
+unsafe impl IndexType for u8 {
+    #[inline(always)]
+    fn new(x: usize) -> Self { x as u8 }
+    #[inline(always)]
+    fn index(&self) -> usize { *self as usize }
+    #[inline(always)]
+    fn max() -> Self { ::std::u8::MAX }
+}
+
+/// Node identifier.
+#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
+pub struct NodeIndex<Ix=DefaultIx>(Ix);
+
+impl<Ix: IndexType> NodeIndex<Ix>
+{
+    #[inline]
+    pub fn new(x: usize) -> Self {
+        NodeIndex(IndexType::new(x))
+    }
+
+    #[inline]
+    pub fn index(self) -> usize
+    {
+        self.0.index()
+    }
+
+    #[inline]
+    pub fn end() -> Self
+    {
+        NodeIndex(IndexType::max())
+    }
+
+    fn _into_edge(self) -> EdgeIndex<Ix> {
+        EdgeIndex(self.0)
+    }
+}
+
+impl<Ix: IndexType> From<Ix> for NodeIndex<Ix> {
+    fn from(ix: Ix) -> Self { NodeIndex(ix) }
+}
+
+impl<Ix: fmt::Debug> fmt::Debug for NodeIndex<Ix>
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "NodeIndex({:?})", self.0)
+    }
+}
+
+/// Short version of `NodeIndex::new`
+pub fn node_index<Ix: IndexType>(index: usize) -> NodeIndex<Ix> { NodeIndex::new(index) }
+
+/// Short version of `EdgeIndex::new`
+pub fn edge_index<Ix: IndexType>(index: usize) -> EdgeIndex<Ix> { EdgeIndex::new(index) }
+
+/// Edge identifier.
+#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
+pub struct EdgeIndex<Ix=DefaultIx>(Ix);
+
+impl<Ix: IndexType> EdgeIndex<Ix>
+{
+    #[inline]
+    pub fn new(x: usize) -> Self {
+        EdgeIndex(IndexType::new(x))
+    }
+
+    #[inline]
+    pub fn index(self) -> usize
+    {
+        self.0.index()
+    }
+
+    /// An invalid `EdgeIndex` used to denote absence of an edge, for example
+    /// to end an adjacency list.
+    #[inline]
+    pub fn end() -> Self {
+        EdgeIndex(IndexType::max())
+    }
+
+    fn _into_node(self) -> NodeIndex<Ix> {
+        NodeIndex(self.0)
+    }
+}
+
+impl<Ix: fmt::Debug> fmt::Debug for EdgeIndex<Ix>
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "EdgeIndex({:?})", self.0)
+    }
+}
+/*
+ * FIXME: Use this impl again, when we don't need to add so many bounds
+impl<Ix: IndexType> fmt::Debug for EdgeIndex<Ix>
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        try!(write!(f, "EdgeIndex("));
+        if *self == EdgeIndex::end() {
+            try!(write!(f, "End"));
+        } else {
+            try!(write!(f, "{}", self.index()));
+        }
+        write!(f, ")")
+    }
+}
+*/
+
+const DIRECTIONS: [Direction; 2] = [Outgoing, Incoming];
+
+/// The graph's node type.
+#[derive(Debug)]
+pub struct Node<N, Ix = DefaultIx> {
+    /// Associated node data.
+    pub weight: N,
+    /// Next edge in outgoing and incoming edge lists.
+    next: [EdgeIndex<Ix>; 2],
+}
+
+impl<E, Ix> Clone for Node<E, Ix> where E: Clone, Ix: Copy {
+    clone_fields!(Node,
+                  weight,
+                  next,
+                  );
+}
+
+
+impl<N, Ix: IndexType> Node<N, Ix>
+{
+    /// Accessor for data structure internals: the first edge in the given direction.
+    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix>
+    {
+        self.next[dir.index()]
+    }
+}
+
+
+/// The graph's edge type.
+#[derive(Debug)]
+pub struct Edge<E, Ix = DefaultIx> {
+    /// Associated edge data.
+    pub weight: E,
+    /// Next edge in outgoing and incoming edge lists.
+    next: [EdgeIndex<Ix>; 2],
+    /// Start and End node index
+    node: [NodeIndex<Ix>; 2],
+}
+
+impl<E, Ix> Clone for Edge<E, Ix> where E: Clone, Ix: Copy {
+    clone_fields!(Edge,
+                  weight,
+                  next,
+                  node,
+                  );
+}
+
+impl<E, Ix: IndexType> Edge<E, Ix>
+{
+    /// Accessor for data structure internals: the next edge for the given direction.
+    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix>
+    {
+        self.next[dir.index()]
+    }
+
+    /// Return the source node index.
+    pub fn source(&self) -> NodeIndex<Ix>
+    {
+        self.node[0]
+    }
+
+    /// Return the target node index.
+    pub fn target(&self) -> NodeIndex<Ix>
+    {
+        self.node[1]
+    }
+}
+
+/// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation.
+///
+/// `Graph` is parameterized over:
+///
+/// - Associated data `N` for nodes and `E` for edges, called *weights*.
+///   The associated data can be of arbitrary type.
+/// - Edge type `Ty` that determines whether the graph edges are directed or undirected.
+/// - Index type `Ix`, which determines the maximum size of the graph.
+///
+/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert,
+/// efficient graph search and graph algorithms.
+/// It implements **O(e')** edge lookup and edge and node removals, where **e'**
+/// is some local measure of edge count.
+/// Based on the graph datastructure used in rustc.
+///
+/// Here's an example of building a graph with directed edges, and below
+/// an illustration of how it could be rendered with graphviz (see
+/// [`Dot`](../dot/struct.Dot.html)):
+///
+/// ```
+/// use petgraph::Graph;
+///
+/// let mut deps = Graph::<&str, &str>::new();
+/// let pg = deps.add_node("petgraph");
+/// let fb = deps.add_node("fixedbitset");
+/// let qc = deps.add_node("quickcheck");
+/// let rand = deps.add_node("rand");
+/// let libc = deps.add_node("libc");
+/// deps.extend_with_edges(&[
+///     (pg, fb), (pg, qc),
+///     (qc, rand), (rand, libc), (qc, libc),
+/// ]);
+/// ```
+///
+/// ![graph-example](https://bluss.github.io/ndarray/images/graph-example.svg)
+///
+/// ### Graph Indices
+///
+/// The graph maintains indices for nodes and edges, and node and edge
+/// weights may be accessed mutably. Indices range in a compact interval, for
+/// example for *n* nodes indices are 0 to *n* - 1 inclusive.
+///
+/// `NodeIndex` and `EdgeIndex` are types that act as references to nodes and edges,
+/// but these are only stable across certain operations.
+/// **Adding nodes or edges keeps indices stable.
+/// Removing nodes or edges may shift other indices.**
+/// Removing a node will force the last node to shift its index to
+/// take its place. Similarly, removing an edge shifts the index of the last edge.
+///
+/// The `Ix` parameter is `u32` by default. The goal is that you can ignore this parameter
+/// completely unless you need a very big graph -- then you can use `usize`.
+///
+/// ### Pros and Cons of Indices
+///
+/// * The fact that the node and edge indices in the graph each are numbered in compact
+/// intervals (from 0 to *n* - 1 for *n* nodes) simplifies some graph algorithms.
+///
+/// * You can select graph index integer type after the size of the graph. A smaller
+/// size may have better performance.
+///
+/// * Using indices allows mutation while traversing the graph, see `Dfs`,
+/// and `.neighbors(a).detach()`.
+///
+/// * You can create several graphs using the equal node indices but with
+/// differing weights or differing edges.
+///
+/// * The `Graph` is a regular rust collection and is `Send` and `Sync` (as long
+/// as associated data `N` and `E` are).
+///
+/// * Some indices shift during node or edge removal, so that is a drawback
+/// of removing elements. Indices don't allow as much compile time checking as
+/// references.
+///
+pub struct Graph<N, E, Ty = Directed, Ix = DefaultIx> {
+    nodes: Vec<Node<N, Ix>>,
+    edges: Vec<Edge<E, Ix>>,
+    ty: PhantomData<Ty>,
+}
+
+/// A `Graph` with directed edges.
+///
+/// For example, an edge from *1* to *2* is distinct from an edge from *2* to
+/// *1*.
+pub type DiGraph<N, E, Ix = DefaultIx> = Graph<N, E, Directed, Ix>;
+
+/// A `Graph` with undirected edges.
+///
+/// For example, an edge between *1* and *2* is equivalent to an edge between
+/// *2* and *1*.
+pub type UnGraph<N, E, Ix = DefaultIx> = Graph<N, E, Undirected, Ix>;
+
+
+/// The resulting cloned graph has the same graph indices as `self`.
+impl<N, E, Ty, Ix: IndexType> Clone for Graph<N, E, Ty, Ix>
+    where N: Clone, E: Clone,
+{
+    fn clone(&self) -> Self {
+        Graph {
+            nodes: self.nodes.clone(),
+            edges: self.edges.clone(),
+            ty: self.ty,
+        }
+    }
+
+    fn clone_from(&mut self, rhs: &Self) {
+        self.nodes.clone_from(&rhs.nodes);
+        self.edges.clone_from(&rhs.edges);
+        self.ty = rhs.ty;
+    }
+}
+
+impl<N, E, Ty, Ix> fmt::Debug for Graph<N, E, Ty, Ix>
+    where N: fmt::Debug,
+          E: fmt::Debug,
+          Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let etype = if self.is_directed() { "Directed" } else { "Undirected" };
+        let mut fmt_struct = f.debug_struct("Graph");
+        fmt_struct.field("Ty", &etype);
+        fmt_struct.field("node_count", &self.node_count());
+        fmt_struct.field("edge_count", &self.edge_count());
+        if self.edge_count() > 0 {
+            fmt_struct.field("edges",
+                 &self.edges
+                     .iter()
+                     .map(|e| NoPretty((e.source().index(), e.target().index())))
+                     .format(", "));
+        }
+        // skip weights if they are ZST!
+        if size_of::<N>() != 0 {
+            fmt_struct.field("node weights", &DebugMap(|| self.nodes.iter()
+                             .map(|n| &n.weight)
+                             .enumerate()));
+        }
+        if size_of::<E>() != 0 {
+            fmt_struct.field("edge weights", &DebugMap(|| self.edges.iter()
+                             .map(|n| &n.weight)
+                             .enumerate()));
+        }
+        fmt_struct.finish()
+    }
+}
+
+enum Pair<T> {
+    Both(T, T),
+    One(T),
+    None,
+}
+
+use std::cmp::max;
+
+/// Get mutable references at index `a` and `b`.
+fn index_twice<T>(slc: &mut [T], a: usize, b: usize) -> Pair<&mut T> {
+    if max(a, b) >= slc.len() {
+        Pair::None
+    } else if a == b {
+        Pair::One(&mut slc[max(a, b)])
+    } else {
+        // safe because a, b are in bounds and distinct
+        unsafe {
+            let ar = &mut *(slc.get_unchecked_mut(a) as *mut _);
+            let br = &mut *(slc.get_unchecked_mut(b) as *mut _);
+            Pair::Both(ar, br)
+        }
+    }
+}
+
+impl<N, E> Graph<N, E, Directed>
+{
+    /// Create a new `Graph` with directed edges.
+    ///
+    /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
+    /// a constructor that is generic in all the type parameters of `Graph`.
+    pub fn new() -> Self
+    {
+        Graph{nodes: Vec::new(), edges: Vec::new(),
+              ty: PhantomData}
+    }
+}
+
+impl<N, E> Graph<N, E, Undirected>
+{
+    /// Create a new `Graph` with undirected edges.
+    ///
+    /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
+    /// a constructor that is generic in all the type parameters of `Graph`.
+    pub fn new_undirected() -> Self
+    {
+        Graph{nodes: Vec::new(), edges: Vec::new(),
+              ty: PhantomData}
+    }
+}
+
+impl<N, E, Ty, Ix> Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// Create a new `Graph` with estimated capacity.
+    pub fn with_capacity(nodes: usize, edges: usize) -> Self
+    {
+        Graph{nodes: Vec::with_capacity(nodes), edges: Vec::with_capacity(edges),
+              ty: PhantomData}
+    }
+
+    /// Return the number of nodes (vertices) in the graph.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn node_count(&self) -> usize
+    {
+        self.nodes.len()
+    }
+
+    /// Return the number of edges in the graph.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn edge_count(&self) -> usize
+    {
+        self.edges.len()
+    }
+
+    /// Whether the graph has directed edges or not.
+    #[inline]
+    pub fn is_directed(&self) -> bool
+    {
+        Ty::is_directed()
+    }
+
+    /// Add a node (also called vertex) with associated data `weight` to the graph.
+    ///
+    /// Computes in **O(1)** time.
+    ///
+    /// Return the index of the new node.
+    ///
+    /// **Panics** if the Graph is at the maximum number of nodes for its index
+    /// type (N/A if usize).
+    pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix>
+    {
+        let node = Node{weight: weight, next: [EdgeIndex::end(), EdgeIndex::end()]};
+        let node_idx = NodeIndex::new(self.nodes.len());
+        // check for max capacity, except if we use usize
+        assert!(<Ix as IndexType>::max().index() == !0 || NodeIndex::end() != node_idx);
+        self.nodes.push(node);
+        node_idx
+    }
+
+    /// Access the weight for node `a`.
+    ///
+    /// Also available with indexing syntax: `&graph[a]`.
+    pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N>
+    {
+        self.nodes.get(a.index()).map(|n| &n.weight)
+    }
+
+    /// Access the weight for node `a`, mutably.
+    ///
+    /// Also available with indexing syntax: `&mut graph[a]`.
+    pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N>
+    {
+        self.nodes.get_mut(a.index()).map(|n| &mut n.weight)
+    }
+
+    /// Add an edge from `a` to `b` to the graph, with its associated
+    /// data `weight`.
+    ///
+    /// Return the index of the new edge.
+    ///
+    /// Computes in **O(1)** time.
+    ///
+    /// **Panics** if any of the nodes don't exist.<br>
+    /// **Panics** if the Graph is at the maximum number of edges for its index
+    /// type (N/A if usize).
+    ///
+    /// **Note:** `Graph` allows adding parallel (“duplicate”) edges. If you want
+    /// to avoid this, use [`.update_edge(a, b, weight)`](#method.update_edge) instead.
+    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix>
+    {
+        let edge_idx = EdgeIndex::new(self.edges.len());
+        assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
+        let mut edge = Edge {
+            weight: weight,
+            node: [a, b],
+            next: [EdgeIndex::end(); 2],
+        };
+        match index_twice(&mut self.nodes, a.index(), b.index()) {
+            Pair::None => panic!("Graph::add_edge: node indices out of bounds"),
+            Pair::One(an) => {
+                edge.next = an.next;
+                an.next[0] = edge_idx;
+                an.next[1] = edge_idx;
+            }
+            Pair::Both(an, bn) => {
+                // a and b are different indices
+                edge.next = [an.next[0], bn.next[1]];
+                an.next[0] = edge_idx;
+                bn.next[1] = edge_idx;
+            }
+        }
+        self.edges.push(edge);
+        edge_idx
+    }
+
+    /// Add or update an edge from `a` to `b`.
+    /// If the edge already exists, its weight is updated.
+    ///
+    /// Return the index of the affected edge.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// connected to `a` (and `b`, if the graph edges are undirected).
+    ///
+    /// **Panics** if any of the nodes don't exist.
+    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix>
+    {
+        if let Some(ix) = self.find_edge(a, b) {
+            if let Some(ed) = self.edge_weight_mut(ix) {
+                *ed = weight;
+                return ix;
+            }
+        }
+        self.add_edge(a, b, weight)
+    }
+
+    /// Access the weight for edge `e`.
+    ///
+    /// Also available with indexing syntax: `&graph[e]`.
+    pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E>
+    {
+        self.edges.get(e.index()).map(|ed| &ed.weight)
+    }
+
+    /// Access the weight for edge `e`, mutably.
+    ///
+    /// Also available with indexing syntax: `&mut graph[e]`.
+    pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E>
+    {
+        self.edges.get_mut(e.index()).map(|ed| &mut ed.weight)
+    }
+
+    /// Access the source and target nodes for `e`.
+    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>)
+        -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)>
+    {
+        self.edges.get(e.index()).map(|ed| (ed.source(), ed.target()))
+    }
+
+    /// Remove `a` from the graph if it exists, and return its weight.
+    /// If it doesn't exist in the graph, return `None`.
+    ///
+    /// Apart from `a`, this invalidates the last node index in the graph
+    /// (that node will adopt the removed node index). Edge indices are
+    /// invalidated as they would be following the removal of each edge
+    /// with an endpoint in `a`.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of affected
+    /// edges, including *n* calls to `.remove_edge()` where *n* is the number
+    /// of edges with an endpoint in `a`, and including the edges with an
+    /// endpoint in the displaced node.
+    pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N>
+    {
+        if self.nodes.get(a.index()).is_none() {
+            return None
+        }
+        for d in &DIRECTIONS {
+            let k = d.index();
+
+            // Remove all edges from and to this node.
+            loop {
+                let next = self.nodes[a.index()].next[k];
+                if next == EdgeIndex::end() {
+                    break
+                }
+                let ret = self.remove_edge(next);
+                debug_assert!(ret.is_some());
+                let _ = ret;
+            }
+        }
+
+        // Use swap_remove -- only the swapped-in node is going to change
+        // NodeIndex<Ix>, so we only have to walk its edges and update them.
+
+        let node = self.nodes.swap_remove(a.index());
+
+        // Find the edge lists of the node that had to relocate.
+        // It may be that no node had to relocate, then we are done already.
+        let swap_edges = match self.nodes.get(a.index()) {
+            None => return Some(node.weight),
+            Some(ed) => ed.next,
+        };
+
+        // The swapped element's old index
+        let old_index = NodeIndex::new(self.nodes.len());
+        let new_index = a;
+
+        // Adjust the starts of the out edges, and ends of the in edges.
+        for &d in &DIRECTIONS {
+            let k = d.index();
+            let mut edges = edges_walker_mut(&mut self.edges, swap_edges[k], d);
+            while let Some(curedge) = edges.next_edge() {
+                debug_assert!(curedge.node[k] == old_index);
+                curedge.node[k] = new_index;
+            }
+        }
+        Some(node.weight)
+    }
+
+    /// For edge `e` with endpoints `edge_node`, replace links to it,
+    /// with links to `edge_next`.
+    fn change_edge_links(&mut self, edge_node: [NodeIndex<Ix>; 2], e: EdgeIndex<Ix>,
+                         edge_next: [EdgeIndex<Ix>; 2])
+    {
+        for &d in &DIRECTIONS {
+            let k = d.index();
+            let node = match self.nodes.get_mut(edge_node[k].index()) {
+                Some(r) => r,
+                None => {
+                    debug_assert!(false, "Edge's endpoint dir={:?} index={:?} not found",
+                                  d, edge_node[k]);
+                    return
+                }
+            };
+            let fst = node.next[k];
+            if fst == e {
+                //println!("Updating first edge 0 for node {}, set to {}", edge_node[0], edge_next[0]);
+                node.next[k] = edge_next[k];
+            } else {
+                let mut edges = edges_walker_mut(&mut self.edges, fst, d);
+                while let Some(curedge) = edges.next_edge() {
+                    if curedge.next[k] == e {
+                        curedge.next[k] = edge_next[k];
+                        break; // the edge can only be present once in the list.
+                    }
+                }
+            }
+        }
+    }
+
+    /// Remove an edge and return its edge weight, or `None` if it didn't exist.
+    ///
+    /// Apart from `e`, this invalidates the last edge index in the graph
+    /// (that edge will adopt the removed edge index).
+    ///
+    /// Computes in **O(e')** time, where **e'** is the size of four particular edge lists, for
+    /// the vertices of `e` and the vertices of another affected edge.
+    pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E>
+    {
+        // every edge is part of two lists,
+        // outgoing and incoming edges.
+        // Remove it from both
+        let (edge_node, edge_next) = match self.edges.get(e.index()) {
+            None => return None,
+            Some(x) => (x.node, x.next),
+        };
+        // Remove the edge from its in and out lists by replacing it with
+        // a link to the next in the list.
+        self.change_edge_links(edge_node, e, edge_next);
+        self.remove_edge_adjust_indices(e)
+    }
+
+    fn remove_edge_adjust_indices(&mut self, e: EdgeIndex<Ix>) -> Option<E>
+    {
+        // swap_remove the edge -- only the removed edge
+        // and the edge swapped into place are affected and need updating
+        // indices.
+        let edge = self.edges.swap_remove(e.index());
+        let swap = match self.edges.get(e.index()) {
+            // no elment needed to be swapped.
+            None => return Some(edge.weight),
+            Some(ed) => ed.node,
+        };
+        let swapped_e = EdgeIndex::new(self.edges.len());
+
+        // Update the edge lists by replacing links to the old index by references to the new
+        // edge index.
+        self.change_edge_links(swap, swapped_e, [e, e]);
+        Some(edge.weight)
+    }
+
+    /// Return an iterator of all nodes with an edge starting from `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
+    {
+        self.neighbors_directed(a, Outgoing)
+    }
+
+    /// Return an iterator of all neighbors that have an edge between them and
+    /// `a`, in the specified direction.
+    /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
+    ///
+    /// - `Directed`, `Outgoing`: All edges from `a`.
+    /// - `Directed`, `Incoming`: All edges to `a`.
+    /// - `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// For a `Directed` graph, neighbors are listed in reverse order of their
+    /// addition to the graph, so the most recently added edge's neighbor is
+    /// listed first. The order in an `Undirected` graph is arbitrary.
+    ///
+    /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix>
+    {
+        let mut iter = self.neighbors_undirected(a);
+        if self.is_directed() {
+            let k = dir.index();
+            iter.next[1 - k] = EdgeIndex::end();
+            iter.skip_start = NodeIndex::end();
+        }
+        iter
+    }
+
+    /// Return an iterator of all neighbors that have an edge between them and
+    /// `a`, in either direction.
+    /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
+    ///
+    /// - `Directed` and `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    ///
+    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
+    {
+        Neighbors {
+            skip_start: a,
+            edges: &self.edges,
+            next: match self.nodes.get(a.index()) {
+                None => [EdgeIndex::end(), EdgeIndex::end()],
+                Some(n) => n.next,
+            }
+        }
+    }
+
+    /// Return an iterator of all edges of `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
+        self.edges_directed(a, Outgoing)
+    }
+
+    /// Return an iterator of all edges of `a`, in the specified direction.
+    ///
+    /// - `Directed`, `Outgoing`: All edges from `a`.
+    /// - `Directed`, `Incoming`: All edges to `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node `a` doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix>
+    {
+        let mut iter = self.edges_undirected(a);
+        if self.is_directed() {
+            iter.direction = Some(dir);
+        }
+        if self.is_directed() && dir == Incoming {
+            iter.next.swap(0, 1);
+        }
+        iter
+    }
+
+    /// Return an iterator over all edges connected to `a`.
+    ///
+    /// - `Directed` and `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node `a` doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    fn edges_undirected(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
+        Edges {
+            skip_start: a,
+            edges: &self.edges,
+            direction: None,
+            next: match self.nodes.get(a.index()) {
+                None => [EdgeIndex::end(), EdgeIndex::end()],
+                Some(n) => n.next,
+            },
+            ty: PhantomData,
+        }
+    }
+
+    /// Lookup if there is an edge from `a` to `b`.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// connected to `a` (and `b`, if the graph edges are undirected).
+    pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
+        self.find_edge(a, b).is_some()
+    }
+
+    /// Lookup an edge from `a` to `b`.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// connected to `a` (and `b`, if the graph edges are undirected).
+    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>>
+    {
+        if !self.is_directed() {
+            self.find_edge_undirected(a, b).map(|(ix, _)| ix)
+        } else {
+            match self.nodes.get(a.index()) {
+                None => None,
+                Some(node) => self.find_edge_directed_from_node(node, b)
+            }
+        }
+    }
+
+    fn find_edge_directed_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>)
+        -> Option<EdgeIndex<Ix>>
+    {
+        let mut edix = node.next[0];
+        while let Some(edge) = self.edges.get(edix.index()) {
+            if edge.node[1] == b {
+                return Some(edix)
+            }
+            edix = edge.next[0];
+        }
+        None
+    }
+
+    /// Lookup an edge between `a` and `b`, in either direction.
+    ///
+    /// If the graph is undirected, then this is equivalent to `.find_edge()`.
+    ///
+    /// Return the edge index and its directionality, with `Outgoing` meaning
+    /// from `a` to `b` and `Incoming` the reverse,
+    /// or `None` if the edge does not exist.
+    pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)>
+    {
+        match self.nodes.get(a.index()) {
+            None => None,
+            Some(node) => self.find_edge_undirected_from_node(node, b),
+        }
+    }
+
+    fn find_edge_undirected_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>)
+        -> Option<(EdgeIndex<Ix>, Direction)>
+    {
+        for &d in &DIRECTIONS {
+            let k = d.index();
+            let mut edix = node.next[k];
+            while let Some(edge) = self.edges.get(edix.index()) {
+                if edge.node[1 - k] == b {
+                    return Some((edix, d))
+                }
+                edix = edge.next[k];
+            }
+        }
+        None
+    }
+
+    /// Return an iterator over either the nodes without edges to them
+    /// (`Incoming`) or from them (`Outgoing`).
+    ///
+    /// An *internal* node has both incoming and outgoing edges.
+    /// The nodes in `.externals(Incoming)` are the source nodes and
+    /// `.externals(Outgoing)` are the sinks of the graph.
+    ///
+    /// For a graph with undirected edges, both the sinks and the sources are
+    /// just the nodes without edges.
+    ///
+    /// The whole iteration computes in **O(|V|)** time.
+    pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix>
+    {
+        Externals{iter: self.nodes.iter().enumerate(), dir: dir, ty: PhantomData}
+    }
+
+    /// Return an iterator over the node indices of the graph
+    pub fn node_indices(&self) -> NodeIndices<Ix> {
+        NodeIndices { r: 0..self.node_count(), ty: PhantomData }
+    }
+
+    /// Return an iterator yielding mutable access to all node weights.
+    ///
+    /// The order in which weights are yielded matches the order of their
+    /// node indices.
+    pub fn node_weights_mut(&mut self) -> NodeWeightsMut<N, Ix>
+    {
+        NodeWeightsMut { nodes: self.nodes.iter_mut() }
+    }
+
+    /// Return an iterator over the edge indices of the graph
+    pub fn edge_indices(&self) -> EdgeIndices<Ix> {
+        EdgeIndices { r: 0..self.edge_count(), ty: PhantomData }
+    }
+
+    /// Create an iterator over all edges, in indexed order.
+    ///
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    pub fn edge_references(&self) -> EdgeReferences<E, Ix> {
+        EdgeReferences {
+            iter: self.edges.iter().enumerate()
+        }
+    }
+
+    /// Return an iterator yielding mutable access to all edge weights.
+    ///
+    /// The order in which weights are yielded matches the order of their
+    /// edge indices.
+    pub fn edge_weights_mut(&mut self) -> EdgeWeightsMut<E, Ix>
+    {
+        EdgeWeightsMut { edges: self.edges.iter_mut() }
+    }
+
+    // Remaining methods are of the more internal flavour, read-only access to
+    // the data structure's internals.
+
+    /// Access the internal node array.
+    pub fn raw_nodes(&self) -> &[Node<N, Ix>]
+    {
+        &self.nodes
+    }
+
+    /// Access the internal edge array.
+    pub fn raw_edges(&self) -> &[Edge<E, Ix>]
+    {
+        &self.edges
+    }
+
+    /// Convert the graph into a vector of Nodes and a vector of Edges
+    pub fn into_nodes_edges(self) -> (Vec<Node<N, Ix>>, Vec<Edge<E, Ix>>) {
+        (self.nodes, self.edges)
+    }
+
+    /// Accessor for data structure internals: the first edge in the given direction.
+    pub fn first_edge(&self, a: NodeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>>
+    {
+        match self.nodes.get(a.index()) {
+            None => None,
+            Some(node) => {
+                let edix = node.next[dir.index()];
+                if edix == EdgeIndex::end() {
+                    None
+                } else { Some(edix) }
+            }
+        }
+    }
+
+    /// Accessor for data structure internals: the next edge for the given direction.
+    pub fn next_edge(&self, e: EdgeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>>
+    {
+        match self.edges.get(e.index()) {
+            None => None,
+            Some(node) => {
+                let edix = node.next[dir.index()];
+                if edix == EdgeIndex::end() {
+                    None
+                } else { Some(edix) }
+            }
+        }
+    }
+
+    /// Index the `Graph` by two indices, any combination of
+    /// node or edge indices is fine.
+    ///
+    /// **Panics** if the indices are equal or if they are out of bounds.
+    ///
+    /// ```
+    /// use petgraph::{Graph, Incoming};
+    /// use petgraph::visit::Dfs;
+    ///
+    /// let mut gr = Graph::new();
+    /// let a = gr.add_node(0.);
+    /// let b = gr.add_node(0.);
+    /// let c = gr.add_node(0.);
+    /// gr.add_edge(a, b, 3.);
+    /// gr.add_edge(b, c, 2.);
+    /// gr.add_edge(c, b, 1.);
+    ///
+    /// // walk the graph and sum incoming edges into the node weight
+    /// let mut dfs = Dfs::new(&gr, a);
+    /// while let Some(node) = dfs.next(&gr) {
+    ///     // use a walker -- a detached neighbors iterator
+    ///     let mut edges = gr.neighbors_directed(node, Incoming).detach();
+    ///     while let Some(edge) = edges.next_edge(&gr) {
+    ///         let (nw, ew) = gr.index_twice_mut(node, edge);
+    ///         *nw += *ew;
+    ///     }
+    /// }
+    ///
+    /// // check the result
+    /// assert_eq!(gr[a], 0.);
+    /// assert_eq!(gr[b], 4.);
+    /// assert_eq!(gr[c], 2.);
+    /// ```
+    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
+        -> (&mut <Self as Index<T>>::Output,
+            &mut <Self as Index<U>>::Output)
+        where Self: IndexMut<T> + IndexMut<U>,
+              T: GraphIndex,
+              U: GraphIndex,
+    {
+        assert!(T::is_node_index() != U::is_node_index() ||
+                i.index() != j.index());
+
+        // Allow two mutable indexes here -- they are nonoverlapping
+        unsafe {
+            let self_mut = self as *mut _;
+            (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
+             <Self as IndexMut<U>>::index_mut(&mut *self_mut, j))
+        }
+    }
+
+    /// Reverse the direction of all edges
+    pub fn reverse(&mut self) {
+        // swap edge endpoints,
+        // edge incoming / outgoing lists,
+        // node incoming / outgoing lists
+        for edge in &mut self.edges {
+            edge.node.swap(0, 1);
+            edge.next.swap(0, 1);
+        }
+        for node in &mut self.nodes {
+            node.next.swap(0, 1);
+        }
+    }
+
+    /// Remove all nodes and edges
+    pub fn clear(&mut self) {
+        self.nodes.clear();
+        self.edges.clear();
+    }
+
+    /// Remove all edges
+    pub fn clear_edges(&mut self) {
+        self.edges.clear();
+        for node in &mut self.nodes {
+            node.next = [EdgeIndex::end(), EdgeIndex::end()];
+        }
+    }
+
+    /// Return the current node and edge capacity of the graph.
+    pub fn capacity(&self) -> (usize, usize) {
+        (self.nodes.capacity(), self.edges.capacity())
+    }
+
+    /// Reserves capacity for at least `additional` more nodes to be inserted in
+    /// the graph. Graph may reserve more space to avoid frequent reallocations.
+    ///
+    /// **Panics** if the new capacity overflows `usize`.
+    pub fn reserve_nodes(&mut self, additional: usize) {
+        self.nodes.reserve(additional);
+    }
+
+    /// Reserves capacity for at least `additional` more edges to be inserted in
+    /// the graph. Graph may reserve more space to avoid frequent reallocations.
+    ///
+    /// **Panics** if the new capacity overflows `usize`.
+    pub fn reserve_edges(&mut self, additional: usize) {
+        self.edges.reserve(additional);
+    }
+
+    /// Reserves the minimum capacity for exactly `additional` more nodes to be
+    /// inserted in the graph. Does nothing if the capacity is already
+    /// sufficient.
+    ///
+    /// Prefer `reserve_nodes` if future insertions are expected.
+    ///
+    /// **Panics** if the new capacity overflows `usize`.
+    pub fn reserve_exact_nodes(&mut self, additional: usize) {
+        self.nodes.reserve_exact(additional);
+    }
+
+    /// Reserves the minimum capacity for exactly `additional` more edges to be
+    /// inserted in the graph.
+    /// Does nothing if the capacity is already sufficient.
+    ///
+    /// Prefer `reserve_edges` if future insertions are expected.
+    ///
+    /// **Panics** if the new capacity overflows `usize`.
+    pub fn reserve_exact_edges(&mut self, additional: usize) {
+        self.edges.reserve_exact(additional);
+    }
+
+    /// Shrinks the capacity of the underlying nodes collection as much as possible.
+    pub fn shrink_to_fit_nodes(&mut self) {
+        self.nodes.shrink_to_fit();
+    }
+
+    /// Shrinks the capacity of the underlying edges collection as much as possible.
+    pub fn shrink_to_fit_edges(&mut self) {
+        self.edges.shrink_to_fit();
+    }
+
+    /// Shrinks the capacity of the graph as much as possible.
+    pub fn shrink_to_fit(&mut self) {
+        self.nodes.shrink_to_fit();
+        self.edges.shrink_to_fit();
+    }
+
+    /// Keep all nodes that return `true` from the `visit` closure,
+    /// remove the others.
+    ///
+    /// `visit` is provided a proxy reference to the graph, so that
+    /// the graph can be walked and associated data modified.
+    ///
+    /// The order nodes are visited is not specified.
+    pub fn retain_nodes<F>(&mut self, mut visit: F)
+        where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool
+    {
+        for index in self.node_indices().rev() {
+            if !visit(Frozen(self), index) {
+                let ret = self.remove_node(index);
+                debug_assert!(ret.is_some());
+                let _ = ret;
+            }
+        }
+    }
+
+    /// Keep all edges that return `true` from the `visit` closure,
+    /// remove the others.
+    ///
+    /// `visit` is provided a proxy reference to the graph, so that
+    /// the graph can be walked and associated data modified.
+    ///
+    /// The order edges are visited is not specified.
+    pub fn retain_edges<F>(&mut self, mut visit: F)
+        where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool
+    {
+        for index in self.edge_indices().rev() {
+            if !visit(Frozen(self), index) {
+                let ret = self.remove_edge(index);
+                debug_assert!(ret.is_some());
+                let _ = ret;
+            }
+        }
+    }
+
+
+    /// Create a new `Graph` from an iterable of edges.
+    ///
+    /// Node weights `N` are set to default values.
+    /// Edge weights `E` may either be specified in the list,
+    /// or they are filled with default values.
+    ///
+    /// Nodes are inserted automatically to match the edges.
+    ///
+    /// ```
+    /// use petgraph::Graph;
+    ///
+    /// let gr = Graph::<(), i32>::from_edges(&[
+    ///     (0, 1), (0, 2), (0, 3),
+    ///     (1, 2), (1, 3),
+    ///     (2, 3),
+    /// ]);
+    /// ```
+    pub fn from_edges<I>(iterable: I) -> Self
+        where I: IntoIterator,
+              I::Item: IntoWeightedEdge<E>,
+              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+              N: Default,
+    {
+        let mut g = Self::with_capacity(0, 0);
+        g.extend_with_edges(iterable);
+        g
+    }
+
+    /// Extend the graph from an iterable of edges.
+    ///
+    /// Node weights `N` are set to default values.
+    /// Edge weights `E` may either be specified in the list,
+    /// or they are filled with default values.
+    ///
+    /// Nodes are inserted automatically to match the edges.
+    pub fn extend_with_edges<I>(&mut self, iterable: I)
+        where I: IntoIterator,
+              I::Item: IntoWeightedEdge<E>,
+              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+              N: Default,
+    {
+        let iter = iterable.into_iter();
+        let (low, _) = iter.size_hint();
+        self.edges.reserve(low);
+
+        for elt in iter {
+            let (source, target, weight) = elt.into_weighted_edge();
+            let (source, target) = (source.into(), target.into());
+            let nx = cmp::max(source, target);
+            while nx.index() >= self.node_count() {
+                self.add_node(N::default());
+            }
+            self.add_edge(source, target, weight);
+        }
+    }
+
+
+    /// Create a new `Graph` by mapping node and
+    /// edge weights to new values.
+    ///
+    /// The resulting graph has the same structure and the same
+    /// graph indices as `self`.
+    pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
+        -> Graph<N2, E2, Ty, Ix>
+        where F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
+              G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
+    {
+        let mut g = Graph::with_capacity(self.node_count(), self.edge_count());
+        g.nodes.extend(enumerate(&self.nodes).map(|(i, node)|
+            Node {
+                weight: node_map(NodeIndex::new(i), &node.weight),
+                next: node.next,
+            }));
+        g.edges.extend(enumerate(&self.edges).map(|(i, edge)| 
+            Edge {
+                weight: edge_map(EdgeIndex::new(i), &edge.weight),
+                next: edge.next,
+                node: edge.node,
+            }));
+        g
+    }
+
+    /// Create a new `Graph` by mapping nodes and edges.
+    /// A node or edge may be mapped to `None` to exclude it from
+    /// the resulting graph.
+    ///
+    /// Nodes are mapped first with the `node_map` closure, then
+    /// `edge_map` is called for the edges that have not had any endpoint
+    /// removed.
+    ///
+    /// The resulting graph has the structure of a subgraph of the original graph.
+    /// If no nodes are removed, the resulting graph has compatible node
+    /// indices; if neither nodes nor edges are removed, the result has
+    /// the same graph indices as `self`.
+    pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
+        -> Graph<N2, E2, Ty, Ix>
+        where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
+              G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
+    {
+        let mut g = Graph::with_capacity(0, 0);
+        // mapping from old node index to new node index, end represents removed.
+        let mut node_index_map = vec![NodeIndex::end(); self.node_count()];
+        for (i, node) in enumerate(&self.nodes) {
+            if let Some(nw) = node_map(NodeIndex::new(i), &node.weight) {
+                node_index_map[i] = g.add_node(nw);
+            }
+        }
+        for (i, edge) in enumerate(&self.edges) {
+            // skip edge if any endpoint was removed
+            let source = node_index_map[edge.source().index()];
+            let target = node_index_map[edge.target().index()];
+            if source != NodeIndex::end() && target != NodeIndex::end() {
+                if let Some(ew) = edge_map(EdgeIndex::new(i), &edge.weight) {
+                    g.add_edge(source, target, ew);
+                }
+            }
+        }
+        g
+    }
+
+    /// Convert the graph into either undirected or directed. No edge adjustments
+    /// are done, so you may want to go over the result to remove or add edges.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn into_edge_type<NewTy>(self) -> Graph<N, E, NewTy, Ix> where
+        NewTy: EdgeType
+    {
+        Graph{nodes: self.nodes, edges: self.edges,
+              ty: PhantomData}
+    }
+
+
+    //
+    // internal methods
+    //
+    #[cfg(feature = "serde-1")]
+    /// Fix up node and edge links after deserialization
+    fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> {
+        for (edge_index, edge) in enumerate(&mut self.edges) {
+            let a = edge.source();
+            let b = edge.target();
+            let edge_idx = EdgeIndex::new(edge_index);
+            match index_twice(&mut self.nodes, a.index(), b.index()) {
+                Pair::None => return Err(if a > b { a } else { b }),
+                Pair::One(an) => {
+                    edge.next = an.next;
+                    an.next[0] = edge_idx;
+                    an.next[1] = edge_idx;
+                }
+                Pair::Both(an, bn) => {
+                    // a and b are different indices
+                    edge.next = [an.next[0], bn.next[1]];
+                    an.next[0] = edge_idx;
+                    bn.next[1] = edge_idx;
+                }
+            }
+        }
+        Ok(())
+    }
+}
+
+/// An iterator over either the nodes without edges to them or from them.
+pub struct Externals<'a, N: 'a, Ty, Ix: IndexType = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>,
+    dir: Direction,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type Item = NodeIndex<Ix>;
+    fn next(&mut self) -> Option<NodeIndex<Ix>>
+    {
+        let k = self.dir.index();
+        loop {
+            match self.iter.next() {
+                None => return None,
+                Some((index, node)) => {
+                    if node.next[k] == EdgeIndex::end() &&
+                        (Ty::is_directed() ||
+                         node.next[1-k] == EdgeIndex::end()) {
+                        return Some(NodeIndex::new(index))
+                    } else {
+                        continue
+                    }
+                },
+            }
+        }
+    }
+}
+
+/// Iterator over the neighbors of a node.
+///
+/// Iterator element type is `NodeIndex<Ix>`.
+///
+/// Created with [`.neighbors()`][1], [`.neighbors_directed()`][2] or
+/// [`.neighbors_undirected()`][3].
+///
+/// [1]: struct.Graph.html#method.neighbors
+/// [2]: struct.Graph.html#method.neighbors_directed
+/// [3]: struct.Graph.html#method.neighbors_undirected
+pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx>
+{
+    /// starting node to skip over
+    skip_start: NodeIndex<Ix>,
+    edges: &'a [Edge<E, Ix>],
+    next: [EdgeIndex<Ix>; 2],
+}
+
+impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where
+    Ix: IndexType,
+{
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<NodeIndex<Ix>> {
+        // First any outgoing edges
+        match self.edges.get(self.next[0].index()) {
+            None => {}
+            Some(edge) => {
+                self.next[0] = edge.next[0];
+                return Some(edge.node[1]);
+            }
+        }
+        // Then incoming edges
+        // For an "undirected" iterator (traverse both incoming
+        // and outgoing edge lists), make sure we don't double
+        // count selfloops by skipping them in the incoming list.
+        while let Some(edge) = self.edges.get(self.next[1].index()) {
+            self.next[1] = edge.next[1];
+            if edge.node[0] != self.skip_start {
+                return Some(edge.node[0]);
+            }
+        }
+        None
+    }
+}
+
+
+impl<'a, E, Ix> Clone for Neighbors<'a, E, Ix>
+    where Ix: IndexType,
+{
+    clone_fields!(Neighbors,
+                  skip_start,
+                  edges,
+                  next,
+                  );
+}
+
+impl<'a, E, Ix> Neighbors<'a, E, Ix>
+    where Ix: IndexType,
+{
+    /// Return a “walker” object that can be used to step through the
+    /// neighbors and edges from the origin node.
+    ///
+    /// Note: The walker does not borrow from the graph, this is to allow mixing
+    /// edge walking with mutating the graph's weights.
+    pub fn detach(&self) -> WalkNeighbors<Ix> {
+        WalkNeighbors {
+            skip_start: self.skip_start,
+            next: self.next
+        }
+    }
+}
+
+struct EdgesWalkerMut<'a, E: 'a, Ix: IndexType = DefaultIx> {
+    edges: &'a mut [Edge<E, Ix>],
+    next: EdgeIndex<Ix>,
+    dir: Direction,
+}
+
+fn edges_walker_mut<E, Ix>(edges: &mut [Edge<E, Ix>], next: EdgeIndex<Ix>, dir: Direction)
+    -> EdgesWalkerMut<E, Ix>
+    where Ix: IndexType,
+{
+    EdgesWalkerMut {
+        edges: edges,
+        next: next,
+        dir: dir
+    }
+}
+
+impl<'a, E, Ix> EdgesWalkerMut<'a, E, Ix> where
+    Ix: IndexType,
+{
+    fn next_edge(&mut self) -> Option<&mut Edge<E, Ix>> {
+        self.next().map(|t| t.1)
+    }
+
+    fn next(&mut self) -> Option<(EdgeIndex<Ix>, &mut Edge<E, Ix>)> {
+        let this_index = self.next;
+        let k = self.dir.index();
+        match self.edges.get_mut(self.next.index()) {
+            None => None,
+            Some(edge) => {
+                self.next = edge.next[k];
+                Some((this_index, edge))
+            }
+        }
+    }
+}
+
+
+impl<'a, N, E, Ty, Ix> IntoEdges for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Edges = Edges<'a, E, Ty, Ix>;
+    fn edges(self, a: Self::NodeId) -> Self::Edges {
+        self.edges(a)
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgesDirected = Edges<'a, E, Ty, Ix>;
+    fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
+        self.edges_directed(a, dir)
+    }
+}
+
+
+/// Iterator over the edges of from or to a node
+pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// starting node to skip over
+    skip_start: NodeIndex<Ix>,
+    edges: &'a [Edge<E, Ix>],
+
+    /// Next edge to visit.
+    /// If we are only following one direction, we only use next[0] regardless.
+    next: [EdgeIndex<Ix>; 2],
+
+    /// Which direction to follow
+    /// None: Both,
+    /// Some(d): d if Directed, Both if Undirected
+    direction: Option<Direction>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Item = EdgeReference<'a, E, Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        // First the outgoing or incoming edges (directionality)
+        let k = self.direction.unwrap_or(Outgoing).index();
+        let i = self.next[0].index();
+        match self.edges.get(i) {
+            None => {}
+            Some(&Edge { ref node, ref weight, ref next }) => {
+                self.next[0] = next[k];
+                return Some(EdgeReference {
+                    index: edge_index(i),
+                    node: *node,
+                    weight: weight,
+                });
+            }
+        }
+        // Stop here if we only follow one direction
+        if self.direction.is_some() {
+            return None;
+        }
+        // Then incoming edges
+        // For an "undirected" iterator (traverse both incoming
+        // and outgoing edge lists), make sure we don't double
+        // count selfloops by skipping them in the incoming list.
+
+        // We reach here if self.direction was None or Outgoing.
+        debug_assert_eq!(k, 0);
+        while let Some(edge) = self.edges.get(self.next[1].index()) {
+            let i = self.next[1].index();
+            self.next[1] = edge.next[1];
+            if edge.node[0] != self.skip_start {
+                return Some(EdgeReference {
+                    index: edge_index(i),
+                    node: swap_pair(edge.node),
+                    weight: &edge.weight,
+                });
+            }
+        }
+        None
+    }
+}
+
+fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
+    x.swap(0, 1);
+    x
+}
+
+impl<'a, E, Ty, Ix> Clone for Edges<'a, E, Ty, Ix>
+    where Ix: IndexType,
+          Ty: EdgeType,
+{
+    fn clone(&self) -> Self {
+        Edges {
+            skip_start: self.skip_start,
+            edges: self.edges,
+            next: self.next,
+            direction: self.direction,
+            ty: self.ty,
+        }
+    }
+}
+
+/// Iterator yielding mutable access to all node weights.
+pub struct NodeWeightsMut<'a, N: 'a, Ix: IndexType = DefaultIx> {
+    nodes: ::std::slice::IterMut<'a, Node<N, Ix>>,
+}
+
+impl<'a, N, Ix> Iterator for NodeWeightsMut<'a, N, Ix> where
+    Ix: IndexType,
+{
+    type Item = &'a mut N;
+
+    fn next(&mut self) -> Option<&'a mut N> {
+        self.nodes.next().map(|node| &mut node.weight)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.nodes.size_hint()
+    }
+}
+
+/// Iterator yielding mutable access to all edge weights.
+pub struct EdgeWeightsMut<'a, E: 'a, Ix: IndexType = DefaultIx> {
+    edges: ::std::slice::IterMut<'a, Edge<E, Ix>>,
+}
+
+impl<'a, E, Ix> Iterator for EdgeWeightsMut<'a, E, Ix> where
+    Ix: IndexType,
+{
+    type Item = &'a mut E;
+
+    fn next(&mut self) -> Option<&'a mut E> {
+        self.edges.next().map(|edge| &mut edge.weight)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.edges.size_hint()
+    }
+}
+
+/// Index the `Graph` by `NodeIndex` to access node weights.
+///
+/// **Panics** if the node doesn't exist.
+impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type Output = N;
+    fn index(&self, index: NodeIndex<Ix>) -> &N {
+        &self.nodes[index.index()].weight
+    }
+}
+
+/// Index the `Graph` by `NodeIndex` to access node weights.
+///
+/// **Panics** if the node doesn't exist.
+impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
+        &mut self.nodes[index.index()].weight
+    }
+
+}
+
+/// Index the `Graph` by `EdgeIndex` to access edge weights.
+///
+/// **Panics** if the edge doesn't exist.
+impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type Output = E;
+    fn index(&self, index: EdgeIndex<Ix>) -> &E {
+        &self.edges[index.index()].weight
+    }
+}
+
+/// Index the `Graph` by `EdgeIndex` to access edge weights.
+///
+/// **Panics** if the edge doesn't exist.
+impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E {
+        &mut self.edges[index.index()].weight
+    }
+}
+
+/// Create a new empty `Graph`.
+impl<N, E, Ty, Ix> Default for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn default() -> Self { Self::with_capacity(0, 0) }
+}
+
+/// A  `GraphIndex` is a node or edge index.
+pub trait GraphIndex : Copy {
+    #[doc(hidden)]
+    fn index(&self) -> usize;
+    #[doc(hidden)]
+    fn is_node_index() -> bool;
+}
+
+impl<Ix: IndexType> GraphIndex for NodeIndex<Ix> {
+    #[inline]
+    fn index(&self) -> usize { NodeIndex::index(*self) }
+    #[inline]
+    fn is_node_index() -> bool { true }
+}
+
+impl<Ix: IndexType> GraphIndex for EdgeIndex<Ix> {
+    #[inline]
+    fn index(&self) -> usize { EdgeIndex::index(*self) }
+    #[inline]
+    fn is_node_index() -> bool { false }
+}
+
+/// A “walker” object that can be used to step through the edge list of a node.
+///
+/// Created with [`.detach()`](struct.Neighbors.html#method.detach).
+///
+/// The walker does not borrow from the graph, so it lets you step through
+/// neighbors or incident edges while also mutating graph weights, as
+/// in the following example:
+///
+/// ```
+/// use petgraph::{Graph, Incoming};
+/// use petgraph::visit::Dfs;
+///
+/// let mut gr = Graph::new();
+/// let a = gr.add_node(0.);
+/// let b = gr.add_node(0.);
+/// let c = gr.add_node(0.);
+/// gr.add_edge(a, b, 3.);
+/// gr.add_edge(b, c, 2.);
+/// gr.add_edge(c, b, 1.);
+///
+/// // step through the graph and sum incoming edges into the node weight
+/// let mut dfs = Dfs::new(&gr, a);
+/// while let Some(node) = dfs.next(&gr) {
+///     // use a detached neighbors walker
+///     let mut edges = gr.neighbors_directed(node, Incoming).detach();
+///     while let Some(edge) = edges.next_edge(&gr) {
+///         gr[node] += gr[edge];
+///     }
+/// }
+///
+/// // check the result
+/// assert_eq!(gr[a], 0.);
+/// assert_eq!(gr[b], 4.);
+/// assert_eq!(gr[c], 2.);
+/// ```
+pub struct WalkNeighbors<Ix> {
+    skip_start: NodeIndex<Ix>,
+    next: [EdgeIndex<Ix>; 2],
+}
+
+impl<Ix> Clone for WalkNeighbors<Ix>
+    where Ix: IndexType,
+{
+    fn clone(&self) -> Self {
+        WalkNeighbors {
+            skip_start: self.skip_start,
+            next: self.next,
+        }
+    }
+}
+
+impl<Ix: IndexType> WalkNeighbors<Ix> {
+    /// Step to the next edge and its endpoint node in the walk for graph `g`.
+    ///
+    /// The next node indices are always the others than the starting point
+    /// where the `WalkNeighbors` value was created.
+    /// For an `Outgoing` walk, the target nodes,
+    /// for an `Incoming` walk, the source nodes of the edge.
+    pub fn next<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
+        -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
+        // First any outgoing edges
+        match g.edges.get(self.next[0].index()) {
+            None => {}
+            Some(edge) => {
+                let ed = self.next[0];
+                self.next[0] = edge.next[0];
+                return Some((ed, edge.node[1]));
+            }
+        }
+        // Then incoming edges
+        // For an "undirected" iterator (traverse both incoming
+        // and outgoing edge lists), make sure we don't double
+        // count selfloops by skipping them in the incoming list.
+        while let Some(edge) = g.edges.get(self.next[1].index()) {
+            let ed = self.next[1];
+            self.next[1] = edge.next[1];
+            if edge.node[0] != self.skip_start {
+                return Some((ed, edge.node[0]));
+            }
+        }
+        None
+    }
+
+    pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
+        -> Option<NodeIndex<Ix>>
+    {
+        self.next(g).map(|t| t.1)
+    }
+
+    pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
+        -> Option<EdgeIndex<Ix>>
+    {
+        self.next(g).map(|t| t.0)
+    }
+}
+
+/// Iterator over the node indices of a graph.
+#[derive(Clone, Debug)]
+pub struct NodeIndices<Ix = DefaultIx> {
+    r: Range<usize>,
+    ty: PhantomData<fn() -> Ix>,
+}
+
+impl<Ix: IndexType> Iterator for NodeIndices<Ix> {
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.r.next().map(node_index)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.r.size_hint()
+    }
+}
+
+impl<Ix: IndexType> DoubleEndedIterator for NodeIndices<Ix> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.r.next_back().map(node_index)
+    }
+}
+
+impl<Ix: IndexType> ExactSizeIterator for NodeIndices<Ix> {}
+
+/// Iterator over the edge indices of a graph.
+#[derive(Clone, Debug)]
+pub struct EdgeIndices<Ix = DefaultIx> {
+    r: Range<usize>,
+    ty: PhantomData<fn() -> Ix>,
+}
+
+impl<Ix: IndexType> Iterator for EdgeIndices<Ix> {
+    type Item = EdgeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.r.next().map(edge_index)
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.r.size_hint()
+    }
+}
+
+impl<Ix: IndexType> DoubleEndedIterator for EdgeIndices<Ix> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.r.next_back().map(edge_index)
+    }
+}
+
+impl<Ix: IndexType> ExactSizeIterator for EdgeIndices<Ix> {}
+
+/// Reference to a `Graph` edge.
+#[derive(Debug)]
+pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> {
+    index: EdgeIndex<Ix>,
+    node: [NodeIndex<Ix>; 2],
+    weight: &'a E,
+}
+
+impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { }
+
+impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
+    where E: PartialEq,
+{
+    fn eq(&self, rhs: &Self) -> bool {
+        self.index == rhs.index && self.weight == rhs.weight
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeRef = (NodeIndex<Ix>, &'a N);
+    type NodeReferences = NodeReferences<'a, N, Ix>;
+    fn node_references(self) -> Self::NodeReferences {
+        NodeReferences {
+            iter: self.nodes.iter().enumerate()
+        }
+    }
+}
+
+/// Iterator over all nodes of a graph.
+pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>,
+}
+
+impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
+    where Ix: IndexType
+{
+    type Item = (NodeIndex<Ix>, &'a N);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(|(i, node)| 
+            (node_index(i), &node.weight)
+        )
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
+    where Ix: IndexType
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|(i, node)|
+            (node_index(i), &node.weight)
+        )
+    }
+}
+
+impl<'a, N, Ix> ExactSizeIterator for NodeReferences<'a, N, Ix>
+    where Ix: IndexType
+{ }
+
+impl<'a, Ix, E> EdgeReference<'a, E, Ix>
+    where Ix: IndexType,
+{
+    /// Access the edge’s weight.
+    ///
+    /// **NOTE** that this method offers a longer lifetime
+    /// than the trait (unfortunately they don't match yet).
+    pub fn weight(&self) -> &'a E { self.weight }
+}
+
+impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
+    where Ix: IndexType,
+{
+    type NodeId = NodeIndex<Ix>;
+    type EdgeId = EdgeIndex<Ix>;
+    type Weight = E;
+
+    fn source(&self) -> Self::NodeId { self.node[0] }
+    fn target(&self) -> Self::NodeId { self.node[1] }
+    fn weight(&self) -> &E { self.weight }
+    fn id(&self) -> Self::EdgeId { self.index }
+}
+
+
+/// Iterator over all edges of a graph.
+pub struct EdgeReferences<'a, E: 'a, Ix: IndexType = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Edge<E, Ix>>>,
+}
+
+impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
+    where Ix: IndexType
+{
+    type Item = EdgeReference<'a, E, Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(|(i, edge)| 
+            EdgeReference {
+                index: edge_index(i),
+                node: edge.node,
+                weight: &edge.weight,
+            }
+        )
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.iter.size_hint()
+    }
+}
+
+impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
+    where Ix: IndexType
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.next_back().map(|(i, edge)|
+            EdgeReference {
+                index: edge_index(i),
+                node: edge.node,
+                weight: &edge.weight,
+            }
+        )
+    }
+}
+
+impl<'a, E, Ix> ExactSizeIterator for EdgeReferences<'a, E, Ix>
+    where Ix: IndexType
+{}
+
+#[cfg(feature = "stable_graph")]
+pub mod stable_graph;
+mod frozen;
+
+/// `Frozen` only allows shared access (read-only) to the
+/// underlying graph `G`, but it allows mutable access to its
+/// node and edge weights.
+///
+/// This is used to ensure immutability of the graph's structure
+/// while permitting weights to change.
+pub struct Frozen<'a, G: 'a>(&'a mut G);
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graph_impl/serialization.rs
@@ -0,0 +1,308 @@
+
+use serde::de::Error;
+
+use std::marker::PhantomData;
+
+use prelude::*;
+
+use EdgeType;
+use graph::Node;
+use graph::{IndexType, Edge};
+use serde_utils::MappedSequenceVisitor;
+use serde_utils::CollectSeqWithLength;
+use serde_utils::{IntoSerializable, FromDeserialized};
+
+use super::{NodeIndex, EdgeIndex};
+use serde::{Serialize, Serializer, Deserialize, Deserializer};
+
+/// Serialization representation for Graph
+/// Keep in sync with deserialization and StableGraph
+///
+/// The serialization format is as follows, in Pseudorust:
+///
+/// Graph {
+///     nodes: [N],
+///     node_holes: [NodeIndex<Ix>],
+///     edge_property: EdgeProperty,
+///     edges: [Option<(NodeIndex<Ix>, NodeIndex<Ix>, E)>]
+/// }
+///
+/// The same format is used by both Graph and StableGraph.
+/// 
+/// For graph there are restrictions:
+/// node_holes is always empty and edges are always Some
+///
+/// A stable graph serialization that obeys these restrictions
+/// (effectively, it has no interior vacancies) can de deserialized
+/// as a graph.
+///
+/// Node indices are serialized as integers and are fixed size for
+/// binary formats, so the Ix parameter matters there.
+#[derive(Serialize)]
+#[serde(rename = "Graph")]
+#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))]
+pub struct SerGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> {
+    #[serde(serialize_with="ser_graph_nodes")]
+    nodes: &'a [Node<N, Ix>],
+    node_holes: &'a [NodeIndex<Ix>],
+    edge_property: EdgeProperty,
+    #[serde(serialize_with="ser_graph_edges")]
+    edges: &'a [Edge<E, Ix>],
+}
+
+// Deserialization representation for Graph
+// Keep in sync with serialization and StableGraph
+#[derive(Deserialize)]
+#[serde(rename = "Graph")]
+#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))]
+pub struct DeserGraph<N, E, Ix> {
+    #[serde(deserialize_with="deser_graph_nodes")]
+    nodes: Vec<Node<N, Ix>>,
+    #[serde(deserialize_with="deser_graph_node_holes")]
+    #[allow(unused)]
+    #[serde(default="Vec::new")]
+    node_holes: Vec<NodeIndex<Ix>>,
+    edge_property: EdgeProperty,
+    #[serde(deserialize_with="deser_graph_edges")]
+    edges: Vec<Edge<E, Ix>>,
+}
+
+
+impl<Ix> Serialize for NodeIndex<Ix>
+    where Ix: IndexType + Serialize,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer
+    {
+        self.0.serialize(serializer)
+    }
+}
+
+impl<'de, Ix> Deserialize<'de> for NodeIndex<Ix>
+    where Ix: IndexType + Deserialize<'de>,
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        Ok(NodeIndex(Ix::deserialize(deserializer)?))
+    }
+}
+
+impl<Ix> Serialize for EdgeIndex<Ix>
+    where Ix: IndexType + Serialize,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer
+    {
+        self.0.serialize(serializer)
+    }
+}
+
+impl<'de, Ix> Deserialize<'de> for EdgeIndex<Ix>
+    where Ix: IndexType + Deserialize<'de>,
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        Ok(EdgeIndex(Ix::deserialize(deserializer)?))
+    }
+}
+
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all="lowercase")]
+#[derive(Debug)]
+pub enum EdgeProperty {
+    Undirected,
+    Directed,
+}
+
+impl EdgeProperty {
+    pub fn is_directed(&self) -> bool {
+        match *self {
+            EdgeProperty::Directed => true,
+            EdgeProperty::Undirected => false,
+        }
+    }
+}
+
+impl<Ty> From<PhantomData<Ty>> for EdgeProperty where Ty: EdgeType {
+    fn from(_: PhantomData<Ty>) -> Self {
+        if Ty::is_directed() {
+            EdgeProperty::Directed
+        } else {
+            EdgeProperty::Undirected
+        }
+    }
+}
+
+
+impl<Ty> FromDeserialized for PhantomData<Ty> where Ty: EdgeType
+{
+    type Input = EdgeProperty;
+    fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
+        where E2: Error
+    {
+        if input.is_directed() != Ty::is_directed() {
+            Err(E2::custom(format_args!("graph edge property mismatch, \
+                                        expected {:?}, found {:?}",
+                                        EdgeProperty::from(PhantomData::<Ty>),
+                                        input)))
+        } else {
+            Ok(PhantomData)
+        }
+    }
+}
+
+fn ser_graph_nodes<S, N, Ix>(nodes: &&[Node<N, Ix>], serializer: S) -> Result<S::Ok, S::Error>
+    where S: Serializer,
+          N: Serialize,
+          Ix: Serialize + IndexType,
+{
+    serializer.collect_seq_exact(
+        nodes.iter()
+             .map(|node| &node.weight))
+}
+
+fn ser_graph_edges<S, E, Ix>(edges: &&[Edge<E, Ix>], serializer: S) -> Result<S::Ok, S::Error>
+    where S: Serializer,
+          E: Serialize,
+          Ix: Serialize + IndexType,
+{
+    serializer.collect_seq_exact(
+        edges.iter()
+            .map(|edge| Some((
+               edge.source(),
+               edge.target(),
+               &edge.weight,
+            ))))
+}
+
+
+fn deser_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<N, Ix>>, D::Error>
+    where D: Deserializer<'de>,
+          N: Deserialize<'de>,
+          Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n|
+        Ok(Node {
+            weight: n,
+            next: [EdgeIndex::end(); 2],
+        })
+    ))
+}
+
+fn deser_graph_node_holes<'de, D, Ix>(deserializer: D) -> Result<Vec<NodeIndex<Ix>>, D::Error>
+    where D: Deserializer<'de>,
+          Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::<NodeIndex<Ix>, NodeIndex<Ix>, _>::new(|_| {
+        Err("Graph can not have holes in the node set, found non-empty node_holes")
+    }))
+}
+
+fn deser_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<N, Ix>>, D::Error>
+    where D: Deserializer<'de>,
+          N: Deserialize<'de>,
+          Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x|
+        if let Some((i, j, w)) = x {
+            Ok(Edge {
+                weight: w,
+                node: [i, j],
+                next: [EdgeIndex::end(); 2],
+            })
+        } else {
+            Err("Graph can not have holes in the edge set, found None, expected edge")
+        }
+    ))
+}
+
+impl<'a, N, E, Ty, Ix> IntoSerializable for &'a Graph<N, E, Ty, Ix>
+    where Ix: IndexType,
+          Ty: EdgeType,
+{
+    type Output = SerGraph<'a, N, E, Ix>;
+    fn into_serializable(self) -> Self::Output {
+        SerGraph {
+            nodes: &self.nodes,
+            node_holes: &[],
+            edges: &self.edges,
+            edge_property: EdgeProperty::from(PhantomData::<Ty>),
+        }
+    }
+}
+
+/// Requires crate feature `"serde-1"`
+impl<N, E, Ty, Ix> Serialize for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType + Serialize,
+          N: Serialize,
+          E: Serialize,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer
+    {
+        self.into_serializable().serialize(serializer)
+    }
+}
+
+
+pub fn invalid_node_err<E>(node_index: usize, len: usize) -> E where E: Error {
+    E::custom(format_args!("invalid value: node index `{}` does not exist in graph \
+                           with node bound {}",
+                           node_index, len))
+}
+
+pub fn invalid_length_err<Ix, E>(node_or_edge: &str, len: usize) -> E
+    where E: Error, Ix: IndexType
+{
+    E::custom(format_args!("invalid size: graph {} count {} exceeds index type maximum {}",
+                           node_or_edge, len, <Ix as IndexType>::max().index()))
+}
+
+impl<'a, N, E, Ty, Ix> FromDeserialized for Graph<N, E, Ty, Ix>
+    where Ix: IndexType,
+          Ty: EdgeType,
+{
+    type Input = DeserGraph<N, E, Ix>;
+    fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
+        where E2: Error
+    {
+        let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
+        let nodes = input.nodes;
+        let edges = input.edges;
+        if nodes.len() >= <Ix as IndexType>::max().index() {
+            Err(invalid_length_err::<Ix, _>("node", nodes.len()))?
+        }
+
+        if edges.len() >= <Ix as IndexType>::max().index() {
+            Err(invalid_length_err::<Ix, _>("edge", edges.len()))?
+        }
+
+        let mut gr = Graph {
+            nodes: nodes,
+            edges: edges,
+            ty: ty,
+        };
+        let nc = gr.node_count();
+        gr.link_edges().map_err(|i| invalid_node_err(i.index(), nc))?;
+        Ok(gr)
+    }
+}
+
+
+/// Requires crate feature `"serde-1"`
+impl<'de, N, E, Ty, Ix> Deserialize<'de> for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType + Deserialize<'de>,
+          N: Deserialize<'de>,
+          E: Deserialize<'de>,
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        Self::from_deserialized(DeserGraph::deserialize(deserializer)?)
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graph_impl/stable_graph/mod.rs
@@ -0,0 +1,1679 @@
+//! `StableGraph` keeps indices stable across removals.
+//!
+//! Depends on `feature = "stable_graph"`.
+//!
+
+use std::cmp;
+use std::fmt;
+use std::iter;
+use std::marker::PhantomData;
+use std::mem::replace;
+use std::mem::size_of;
+use std::ops::{Index, IndexMut};
+use std::slice;
+
+use {
+    Graph,
+    EdgeType,
+    Directed,
+    Undirected,
+    Direction,
+    Incoming,
+    Outgoing,
+};
+
+use iter_format::{
+    IterFormatExt,
+    NoPretty,
+    DebugMap,
+};
+use iter_utils::IterUtilsExt;
+
+use super::{
+    Edge,
+    index_twice,
+    Node,
+    DIRECTIONS,
+    Pair,
+    Frozen,
+};
+use IntoWeightedEdge;
+use visit::{
+    EdgeRef,
+    IntoNodeReferences,
+    IntoEdges,
+    IntoEdgesDirected,
+    IntoEdgeReferences,
+    NodeIndexable,
+};
+
+// reexport those things that are shared with Graph
+#[doc(no_inline)]
+pub use graph::{
+    NodeIndex,
+    EdgeIndex,
+    GraphIndex,
+    IndexType,
+    DefaultIx,
+    node_index,
+    edge_index,
+};
+
+use util::enumerate;
+
+#[cfg(feature = "serde-1")]
+mod serialization;
+
+/// `StableGraph<N, E, Ty, Ix>` is a graph datastructure using an adjacency
+/// list representation.
+///
+/// The graph **does not invalidate** any unrelated node or edge indices when
+/// items are removed.
+///
+/// `StableGraph` is parameterized over:
+///
+/// - Associated data `N` for nodes and `E` for edges, also called *weights*.
+///   The associated data can be of arbitrary type.
+/// - Edge type `Ty` that determines whether the graph edges are directed or undirected.
+/// - Index type `Ix`, which determines the maximum size of the graph.
+///
+/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert
+/// and efficient graph search.
+///
+/// It implements **O(e')** edge lookup and edge and node removals, where **e'**
+/// is some local measure of edge count.
+///
+/// - Nodes and edges are each numbered in an interval from *0* to some number
+/// *m*, but *not all* indices in the range are valid, since gaps are formed
+/// by deletions.
+///
+/// - You can select graph index integer type after the size of the graph. A smaller
+/// size may have better performance.
+///
+/// - Using indices allows mutation while traversing the graph, see `Dfs`.
+///
+/// - The `StableGraph` is a regular rust collection and is `Send` and `Sync`
+/// (as long as associated data `N` and `E` are).
+///
+/// - Indices don't allow as much compile time checking as references.
+///
+/// Depends on crate feature `stable_graph` (default). *Stable Graph is still
+/// missing a few methods compared to Graph. You can contribute to help it
+/// achieve parity.*
+pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx>
+{
+    g: Graph<Option<N>, Option<E>, Ty, Ix>,
+    node_count: usize,
+    edge_count: usize,
+
+    // node and edge free lists (both work the same way)
+    //
+    // free_node, if not NodeIndex::end(), points to a node index
+    // that is vacant (after a deletion).  The next item in the list is kept in
+    // that Node's Node.next[0] field. For Node, it's a node index stored
+    // in an EdgeIndex location, and the _into_edge()/_into_node() methods
+    // convert.
+    free_node: NodeIndex<Ix>,
+    free_edge: EdgeIndex<Ix>,
+}
+
+/// A `StableGraph` with directed edges.
+///
+/// For example, an edge from *1* to *2* is distinct from an edge from *2* to
+/// *1*.
+pub type StableDiGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Directed, Ix>;
+
+/// A `StableGraph` with undirected edges.
+///
+/// For example, an edge between *1* and *2* is equivalent to an edge between
+/// *2* and *1*.
+pub type StableUnGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Undirected, Ix>;
+
+impl<N, E, Ty, Ix> fmt::Debug for StableGraph<N, E, Ty, Ix>
+    where N: fmt::Debug,
+          E: fmt::Debug,
+          Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let etype = if self.is_directed() { "Directed" } else { "Undirected" };
+        let mut fmt_struct = f.debug_struct("StableGraph");
+        fmt_struct.field("Ty", &etype);
+        fmt_struct.field("node_count", &self.node_count);
+        fmt_struct.field("edge_count", &self.edge_count);
+        if self.g.edges.iter().any(|e| e.weight.is_some()) {
+            fmt_struct.field("edges", &self.g.edges.iter()
+                .filter(|e| e.weight.is_some())
+                .map(|e| NoPretty((e.source().index(), e.target().index())))
+                .format(", "));
+        }
+        // skip weights if they are ZST!
+        if size_of::<N>() != 0 {
+            fmt_struct.field("node weights",
+            &DebugMap(||
+                self.g.nodes.iter()
+                    .map(|n| n.weight.as_ref())
+                    .enumerate()
+                    .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
+                   ));
+        }
+        if size_of::<E>() != 0 {
+            fmt_struct.field("edge weights",
+            &DebugMap(||
+                self.g.edges.iter()
+                    .map(|n| n.weight.as_ref())
+                    .enumerate()
+                    .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
+                   ));
+        }
+        fmt_struct.field("free_node", &self.free_node);
+        fmt_struct.field("free_edge", &self.free_edge);
+        fmt_struct.finish()
+    }
+}
+
+
+impl<N, E> StableGraph<N, E, Directed> {
+    /// Create a new `StableGraph` with directed edges.
+    ///
+    /// This is a convenience method. See `StableGraph::with_capacity`
+    /// or `StableGraph::default` for a constructor that is generic in all the
+    /// type parameters of `StableGraph`.
+    pub fn new() -> Self {
+        Self::with_capacity(0, 0)
+    }
+}
+
+impl<N, E, Ty, Ix> StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// Create a new `StableGraph` with estimated capacity.
+    pub fn with_capacity(nodes: usize, edges: usize) -> Self {
+        StableGraph {
+            g: Graph::with_capacity(nodes, edges),
+            node_count: 0,
+            edge_count: 0,
+            free_node: NodeIndex::end(),
+            free_edge: EdgeIndex::end(),
+        }
+    }
+
+    /// Return the current node and edge capacity of the graph.
+    pub fn capacity(&self) -> (usize, usize) {
+        self.g.capacity()
+    }
+
+    /// Remove all nodes and edges
+    pub fn clear(&mut self) {
+        self.node_count = 0;
+        self.edge_count = 0;
+        self.free_node = NodeIndex::end();
+        self.free_edge = EdgeIndex::end();
+        self.g.clear();
+    }
+
+    /// Remove all edges
+    pub fn clear_edges(&mut self) {
+        self.edge_count = 0;
+        self.free_edge = EdgeIndex::end();
+        self.g.edges.clear();
+        // clear edges without touching the free list
+        for node in &mut self.g.nodes {
+            if let Some(_) = node.weight {
+                node.next = [EdgeIndex::end(), EdgeIndex::end()];
+            }
+        }
+    }
+
+    /// Return the number of nodes (vertices) in the graph.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn node_count(&self) -> usize {
+        self.node_count
+    }
+
+    /// Return the number of edges in the graph.
+    ///
+    /// Computes in **O(1)** time.
+    pub fn edge_count(&self) -> usize {
+        self.edge_count
+    }
+
+    /// Whether the graph has directed edges or not.
+    #[inline]
+    pub fn is_directed(&self) -> bool {
+        Ty::is_directed()
+    }
+
+    /// Add a node (also called vertex) with associated data `weight` to the graph.
+    ///
+    /// Computes in **O(1)** time.
+    ///
+    /// Return the index of the new node.
+    ///
+    /// **Panics** if the `StableGraph` is at the maximum number of nodes for
+    /// its index type.
+    pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
+        let index = if self.free_node != NodeIndex::end() {
+            let node_idx = self.free_node;
+            let node_slot = &mut self.g.nodes[node_idx.index()];
+            let _old = replace(&mut node_slot.weight, Some(weight));
+            debug_assert!(_old.is_none());
+            self.free_node = node_slot.next[0]._into_node();
+            node_slot.next[0] = EdgeIndex::end();
+            node_idx
+        } else {
+            self.g.add_node(Some(weight))
+        };
+        self.node_count += 1;
+        index
+    }
+
+    /// free_node: Which free list to update for the vacancy
+    fn add_vacant_node(&mut self, free_node: &mut NodeIndex<Ix>) {
+        let node_idx = self.g.add_node(None);
+        // link the free list
+        let node_slot = &mut self.g.nodes[node_idx.index()];
+        node_slot.next[0] = free_node._into_edge();
+        *free_node = node_idx;
+    }
+
+    /// Remove `a` from the graph if it exists, and return its weight.
+    /// If it doesn't exist in the graph, return `None`.
+    ///
+    /// The node index `a` is invalidated, but none other.
+    /// Edge indices are invalidated as they would be following the removal of
+    /// each edge with an endpoint in `a`.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of affected
+    /// edges, including *n* calls to `.remove_edge()` where *n* is the number
+    /// of edges with an endpoint in `a`.
+    pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> {
+        let node_weight = match self.g.nodes.get_mut(a.index()) {
+            None => return None,
+            Some(n) => n.weight.take(),
+        };
+        if let None = node_weight {
+            return None;
+        }
+        for d in &DIRECTIONS {
+            let k = d.index();
+
+            // Remove all edges from and to this node.
+            loop {
+                let next = self.g.nodes[a.index()].next[k];
+                if next == EdgeIndex::end() {
+                    break
+                }
+                let ret = self.remove_edge(next);
+                debug_assert!(ret.is_some());
+                let _ = ret;
+            }
+        }
+
+        let node_slot = &mut self.g.nodes[a.index()];
+        //let node_weight = replace(&mut self.g.nodes[a.index()].weight, Entry::Empty(self.free_node));
+        //self.g.nodes[a.index()].next = [EdgeIndex::end(), EdgeIndex::end()];
+        node_slot.next = [self.free_node._into_edge(), EdgeIndex::end()];
+        self.free_node = a;
+        self.node_count -= 1;
+
+        node_weight
+    }
+
+    pub fn contains_node(&self, a: NodeIndex<Ix>) -> bool {
+        self.get_node(a).is_some()
+    }
+
+    // Return the Node if it is not vacant (non-None weight)
+    fn get_node(&self, a: NodeIndex<Ix>) -> Option<&Node<Option<N>, Ix>> {
+        self.g.nodes.get(a.index())
+                    .and_then(|node| node.weight.as_ref().map(move |_| node))
+    }
+
+    /// Add an edge from `a` to `b` to the graph, with its associated
+    /// data `weight`.
+    ///
+    /// Return the index of the new edge.
+    ///
+    /// Computes in **O(1)** time.
+    ///
+    /// **Panics** if any of the nodes don't exist.<br>
+    /// **Panics** if the `StableGraph` is at the maximum number of edges for
+    /// its index type.
+    ///
+    /// **Note:** `StableGraph` allows adding parallel (“duplicate”) edges.
+    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E)
+        -> EdgeIndex<Ix>
+    {
+        let edge_idx;
+        let mut new_edge = None::<Edge<_, _>>;
+        {
+            let edge: &mut Edge<_, _>;
+
+            if self.free_edge != EdgeIndex::end() {
+                edge_idx = self.free_edge;
+                edge = &mut self.g.edges[edge_idx.index()];
+                let _old = replace(&mut edge.weight, Some(weight));
+                debug_assert!(_old.is_none());
+                self.free_edge = edge.next[0];
+                edge.node = [a, b];
+            } else {
+                edge_idx = EdgeIndex::new(self.g.edges.len());
+                assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
+                new_edge = Some(Edge {
+                    weight: Some(weight),
+                    node: [a, b],
+                    next: [EdgeIndex::end(); 2],
+                });
+                edge = new_edge.as_mut().unwrap();
+            }
+
+            let wrong_index = match index_twice(&mut self.g.nodes, a.index(), b.index()) {
+                Pair::None => Some(cmp::max(a.index(), b.index())),
+                Pair::One(an) => {
+                    if an.weight.is_none() {
+                        Some(a.index())
+                    } else {
+                        edge.next = an.next;
+                        an.next[0] = edge_idx;
+                        an.next[1] = edge_idx;
+                        None
+                    }
+                }
+                Pair::Both(an, bn) => {
+                    // a and b are different indices
+                    if an.weight.is_none() {
+                        Some(a.index())
+                    } else if bn.weight.is_none() {
+                        Some(b.index())
+                    } else {
+                        edge.next = [an.next[0], bn.next[1]];
+                        an.next[0] = edge_idx;
+                        bn.next[1] = edge_idx;
+                        None
+                    }
+                }
+            };
+            if let Some(i) = wrong_index {
+                panic!("StableGraph::add_edge: node index {} is not a node in the graph", i);
+            }
+            self.edge_count += 1;
+        }
+        if let Some(edge) = new_edge {
+            self.g.edges.push(edge);
+        }
+        edge_idx
+    }
+
+    /// free_edge: Which free list to update for the vacancy
+    fn add_vacant_edge(&mut self, free_edge: &mut EdgeIndex<Ix>) {
+        let edge_idx = EdgeIndex::new(self.g.edges.len());
+        debug_assert!(edge_idx != EdgeIndex::end());
+        let mut edge = Edge {
+            weight: None,
+            node: [NodeIndex::end(); 2],
+            next: [EdgeIndex::end(); 2],
+        };
+        edge.next[0] = *free_edge;
+        *free_edge = edge_idx;
+        self.g.edges.push(edge);
+    }
+
+    /// Add or update an edge from `a` to `b`.
+    /// If the edge already exists, its weight is updated.
+    ///
+    /// Return the index of the affected edge.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// connected to `a` (and `b`, if the graph edges are undirected).
+    ///
+    /// **Panics** if any of the nodes don't exist.
+    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E)
+        -> EdgeIndex<Ix>
+    {
+        if let Some(ix) = self.find_edge(a, b) {
+            self[ix] = weight;
+            return ix;
+        }
+        self.add_edge(a, b, weight)
+    }
+
+    /// Remove an edge and return its edge weight, or `None` if it didn't exist.
+    ///
+    /// Invalidates the edge index `e` but no other.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// conneced to the same endpoints as `e`.
+    pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
+        // every edge is part of two lists,
+        // outgoing and incoming edges.
+        // Remove it from both
+        let (is_edge, edge_node, edge_next) = match self.g.edges.get(e.index()) {
+            None => return None,
+            Some(x) => (x.weight.is_some(), x.node, x.next),
+        };
+        if !is_edge {
+            return None;
+        }
+
+        // Remove the edge from its in and out lists by replacing it with
+        // a link to the next in the list.
+        self.g.change_edge_links(edge_node, e, edge_next);
+
+        // Clear the edge and put it in the free list
+        let edge = &mut self.g.edges[e.index()];
+        edge.next = [self.free_edge, EdgeIndex::end()];
+        edge.node = [NodeIndex::end(), NodeIndex::end()];
+        self.free_edge = e;
+        self.edge_count -= 1;
+        edge.weight.take()
+    }
+
+    /// Access the weight for node `a`.
+    ///
+    /// Also available with indexing syntax: `&graph[a]`.
+    pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> {
+        match self.g.nodes.get(a.index()) {
+            Some(no) => no.weight.as_ref(),
+            None => None,
+        }
+    }
+
+    /// Access the weight for node `a`, mutably.
+    ///
+    /// Also available with indexing syntax: `&mut graph[a]`.
+    pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> {
+        match self.g.nodes.get_mut(a.index()) {
+            Some(no) => no.weight.as_mut(),
+            None => None,
+        }
+    }
+
+    /// Return an iterator over the node indices of the graph
+    pub fn node_indices(&self) -> NodeIndices<N, Ix> {
+        NodeIndices {
+            iter: enumerate(self.raw_nodes())
+        }
+    }
+
+    /// Access the weight for edge `e`.
+    ///
+    /// Also available with indexing syntax: `&graph[e]`.
+    pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> {
+        match self.g.edges.get(e.index()) {
+            Some(ed) => ed.weight.as_ref(),
+            None => None,
+        }
+    }
+
+    /// Access the weight for edge `e`, mutably
+    ///
+    /// Also available with indexing syntax: `&mut graph[e]`.
+    pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> {
+        match self.g.edges.get_mut(e.index()) {
+            Some(ed) => ed.weight.as_mut(),
+            None => None,
+        }
+    }
+
+    /// Access the source and target nodes for `e`.
+    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>)
+        -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)>
+    {
+        match self.g.edges.get(e.index()) {
+            Some(ed) if ed.weight.is_some() => Some((ed.source(), ed.target())),
+            _otherwise => None,
+        }
+    }
+
+    /// Return an iterator over the node indices of the graph
+    pub fn edge_indices(&self) -> EdgeIndices<E, Ix> {
+        EdgeIndices {
+            iter: enumerate(self.raw_edges())
+        }
+    }
+
+    /// Lookup an edge from `a` to `b`.
+    ///
+    /// Computes in **O(e')** time, where **e'** is the number of edges
+    /// connected to `a` (and `b`, if the graph edges are undirected).
+    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>>
+    {
+        if !self.is_directed() {
+            self.find_edge_undirected(a, b).map(|(ix, _)| ix)
+        } else {
+            match self.get_node(a) {
+                None => None,
+                Some(node) => self.g.find_edge_directed_from_node(node, b)
+            }
+        }
+    }
+
+    /// Lookup an edge between `a` and `b`, in either direction.
+    ///
+    /// If the graph is undirected, then this is equivalent to `.find_edge()`.
+    ///
+    /// Return the edge index and its directionality, with `Outgoing` meaning
+    /// from `a` to `b` and `Incoming` the reverse,
+    /// or `None` if the edge does not exist.
+    pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)>
+    {
+        match self.get_node(a) {
+            None => None,
+            Some(node) => self.g.find_edge_undirected_from_node(node, b),
+        }
+    }
+
+
+    /// Return an iterator of all nodes with an edge starting from `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
+        self.neighbors_directed(a, Outgoing)
+    }
+
+    /// Return an iterator of all neighbors that have an edge between them and `a`,
+    /// in the specified direction.
+    /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
+    ///
+    /// - `Directed`, `Outgoing`: All edges from `a`.
+    /// - `Directed`, `Incoming`: All edges to `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction)
+        -> Neighbors<E, Ix>
+    {
+        let mut iter = self.neighbors_undirected(a);
+        if self.is_directed() {
+            let k = dir.index();
+            iter.next[1 - k] = EdgeIndex::end();
+            iter.skip_start = NodeIndex::end();
+        }
+        iter
+    }
+
+    /// Return an iterator of all neighbors that have an edge between them and `a`,
+    /// in either direction.
+    /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
+    ///
+    /// - `Directed` and `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `NodeIndex<Ix>`.
+    ///
+    /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does
+    /// not borrow from the graph.
+    ///
+    /// [1]: struct.Neighbors.html#method.detach
+    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
+    {
+        Neighbors {
+            skip_start: a,
+            edges: &self.g.edges,
+            next: match self.get_node(a) {
+                None => [EdgeIndex::end(), EdgeIndex::end()],
+                Some(n) => n.next,
+            }
+        }
+    }
+
+    /// Return an iterator of all edges of `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
+        self.edges_directed(a, Outgoing)
+    }
+
+    /// Return an iterator of all edges of `a`, in the specified direction.
+    ///
+    /// - `Directed`, `Outgoing`: All edges from `a`.
+    /// - `Directed`, `Incoming`: All edges to `a`.
+    /// - `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node `a` doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix>
+    {
+        let mut iter = self.edges_undirected(a);
+        if self.is_directed() {
+            iter.direction = Some(dir);
+        }
+        if self.is_directed() && dir == Incoming {
+            iter.next.swap(0, 1);
+        }
+        iter
+    }
+
+    /// Return an iterator over all edges connected to `a`.
+    ///
+    /// - `Directed` and `Undirected`: All edges connected to `a`.
+    ///
+    /// Produces an empty iterator if the node `a` doesn't exist.<br>
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    fn edges_undirected(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
+        Edges {
+            skip_start: a,
+            edges: &self.g.edges,
+            direction: None,
+            next: match self.get_node(a) {
+                None => [EdgeIndex::end(), EdgeIndex::end()],
+                Some(n) => n.next,
+            },
+            ty: PhantomData,
+        }
+    }
+
+    /// Index the `StableGraph` by two indices, any combination of
+    /// node or edge indices is fine.
+    ///
+    /// **Panics** if the indices are equal or if they are out of bounds.
+    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
+        -> (&mut <Self as Index<T>>::Output,
+            &mut <Self as Index<U>>::Output)
+        where Self: IndexMut<T> + IndexMut<U>,
+              T: GraphIndex,
+              U: GraphIndex,
+    {
+        assert!(T::is_node_index() != U::is_node_index() ||
+                i.index() != j.index());
+
+        // Allow two mutable indexes here -- they are nonoverlapping
+        unsafe {
+            let self_mut = self as *mut _;
+            (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
+             <Self as IndexMut<U>>::index_mut(&mut *self_mut, j))
+        }
+    }
+
+    /// Keep all nodes that return `true` from the `visit` closure,
+    /// remove the others.
+    ///
+    /// `visit` is provided a proxy reference to the graph, so that
+    /// the graph can be walked and associated data modified.
+    ///
+    /// The order nodes are visited is not specified.
+    ///
+    /// The node indices of the removed nodes are invalidated, but none other.
+    /// Edge indices are invalidated as they would be following the removal of
+    /// each edge with an endpoint in a removed node.
+    ///
+    /// Computes in **O(n + e')** time, where **n** is the number of node indices and
+    ///  **e'** is the number of affected edges, including *n* calls to `.remove_edge()`
+    /// where *n* is the number of edges with an endpoint in a removed node.
+    pub fn retain_nodes<F>(&mut self, mut visit: F) where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool {
+        for i in 0..self.node_bound() {
+            let ix = node_index(i);
+            if self.contains_node(ix) && !visit(Frozen(self), ix) {
+                self.remove_node(ix);
+            }
+        }
+        self.check_free_lists();
+    }
+
+    /// Keep all edges that return `true` from the `visit` closure,
+    /// remove the others.
+    ///
+    /// `visit` is provided a proxy reference to the graph, so that
+    /// the graph can be walked and associated data modified.
+    ///
+    /// The order edges are visited is not specified.
+    ///
+    /// The edge indices of the removed edes are invalidated, but none other.
+    /// Edge indices are invalidated as they would be following the removal of
+    /// each edge with an endpoint in a removed edge.
+    ///
+    /// Computes in **O(e'')** time, **e'** is the number of affected edges,
+    /// including the calls to `.remove_edge()` for each removed edge.
+    pub fn retain_edges<F>(&mut self, mut visit: F)
+        where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool
+    {
+        for i in 0..self.edge_bound() {
+            let ix = edge_index(i);
+            if self.edge_weight(ix).is_some() && !visit(Frozen(self), ix) {
+                self.remove_edge(ix);
+            }
+        }
+        self.check_free_lists();
+    }
+
+    /// Create a new `StableGraph` from an iterable of edges.
+    ///
+    /// Node weights `N` are set to default values.
+    /// Edge weights `E` may either be specified in the list,
+    /// or they are filled with default values.
+    ///
+    /// Nodes are inserted automatically to match the edges.
+    ///
+    /// ```
+    /// use petgraph::stable_graph::StableGraph;
+    ///
+    /// let gr = StableGraph::<(), i32>::from_edges(&[
+    ///     (0, 1), (0, 2), (0, 3),
+    ///     (1, 2), (1, 3),
+    ///     (2, 3),
+    /// ]);
+    /// ```
+    pub fn from_edges<I>(iterable: I) -> Self
+        where I: IntoIterator,
+              I::Item: IntoWeightedEdge<E>,
+              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+              N: Default,
+    {
+        let mut g = Self::with_capacity(0, 0);
+        g.extend_with_edges(iterable);
+        g
+    }
+
+    /// Create a new `StableGraph` by mapping node and
+    /// edge weights to new values.
+    ///
+    /// The resulting graph has the same structure and the same
+    /// graph indices as `self`.
+    pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
+        -> StableGraph<N2, E2, Ty, Ix>
+        where F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
+              G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
+    {
+        let g = self.g.map(
+            move |i, w| w.as_ref().map(|w| node_map(i, w)),
+            move |i, w| w.as_ref().map(|w| edge_map(i, w)));
+        StableGraph {
+            g: g,
+            node_count: self.node_count,
+            edge_count: self.edge_count,
+            free_node: self.free_node,
+            free_edge: self.free_edge,
+        }
+    }
+
+    /// Create a new `StableGraph` by mapping nodes and edges.
+    /// A node or edge may be mapped to `None` to exclude it from
+    /// the resulting graph.
+    ///
+    /// Nodes are mapped first with the `node_map` closure, then
+    /// `edge_map` is called for the edges that have not had any endpoint
+    /// removed.
+    ///
+    /// The resulting graph has the structure of a subgraph of the original graph.
+    /// Nodes and edges that are not removed maintain their old node or edge
+    /// indices.
+    pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
+        -> StableGraph<N2, E2, Ty, Ix>
+        where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
+              G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
+    {
+        let node_bound = self.node_bound();
+        let edge_bound = self.edge_bound();
+        let mut result_g = StableGraph::with_capacity(node_bound, edge_bound);
+        // use separate free lists so that
+        // add_node / add_edge below do not reuse the tombstones
+        let mut free_node = NodeIndex::end();
+        let mut free_edge = EdgeIndex::end();
+
+        // the stable graph keeps the node map itself
+
+        for (i, node) in enumerate(self.raw_nodes()) {
+            if i >= node_bound { break; }
+            if let Some(node_weight) = node.weight.as_ref() {
+                if let Some(new_weight) = node_map(NodeIndex::new(i), node_weight) {
+                    result_g.add_node(new_weight);
+                    continue;
+                }
+            }
+            result_g.add_vacant_node(&mut free_node);
+        }
+        for (i, edge) in enumerate(self.raw_edges()) {
+            if i >= edge_bound { break; }
+            let source = edge.source();
+            let target = edge.target();
+            if let Some(edge_weight) = edge.weight.as_ref() {
+                if result_g.contains_node(source) && result_g.contains_node(target) {
+                    if let Some(new_weight) = edge_map(EdgeIndex::new(i), edge_weight) {
+                        result_g.add_edge(source, target, new_weight);
+                        continue;
+                    }
+                }
+            }
+            result_g.add_vacant_edge(&mut free_edge);
+        }
+        result_g.free_node = free_node;
+        result_g.free_edge = free_edge;
+        result_g.check_free_lists();
+        result_g
+    }
+
+    /// Extend the graph from an iterable of edges.
+    ///
+    /// Node weights `N` are set to default values.
+    /// Edge weights `E` may either be specified in the list,
+    /// or they are filled with default values.
+    ///
+    /// Nodes are inserted automatically to match the edges.
+    pub fn extend_with_edges<I>(&mut self, iterable: I)
+        where I: IntoIterator,
+              I::Item: IntoWeightedEdge<E>,
+              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+              N: Default,
+    {
+        let iter = iterable.into_iter();
+
+        for elt in iter {
+            let (source, target, weight) = elt.into_weighted_edge();
+            let (source, target) = (source.into(), target.into());
+            let nx = cmp::max(source, target);
+            while nx.index() >= self.node_count() {
+                self.add_node(N::default());
+            }
+            self.add_edge(source, target, weight);
+        }
+    }
+
+    //
+    // internal methods
+    //
+    fn raw_nodes(&self) -> &[Node<Option<N>, Ix>] {
+        self.g.raw_nodes()
+    }
+
+    fn raw_edges(&self) -> &[Edge<Option<E>, Ix>] {
+        self.g.raw_edges()
+    }
+
+    fn edge_bound(&self) -> usize {
+        self.edge_references()
+            .next_back()
+            .map_or(0, |edge| edge.id().index() + 1)
+    }
+
+    #[cfg(feature = "serde-1")]
+    /// Fix up node and edge links after deserialization
+    fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> {
+        // set up free node list
+        self.node_count = 0;
+        self.edge_count = 0;
+        let mut free_node = NodeIndex::end();
+        for (node_index, node) in enumerate(&mut self.g.nodes) {
+            if node.weight.is_some() {
+                self.node_count += 1;
+            } else {
+                // free node
+                node.next = [free_node._into_edge(), EdgeIndex::end()];
+                free_node = NodeIndex::new(node_index);
+            }
+        }
+        self.free_node = free_node;
+
+        let mut free_edge = EdgeIndex::end();
+        for (edge_index, edge) in enumerate(&mut self.g.edges) {
+            if edge.weight.is_none() {
+                // free edge
+                edge.next = [free_edge, EdgeIndex::end()];
+                free_edge = EdgeIndex::new(edge_index);
+                continue;
+            }
+            let a = edge.source();
+            let b = edge.target();
+            let edge_idx = EdgeIndex::new(edge_index);
+            match index_twice(&mut self.g.nodes, a.index(), b.index()) {
+                Pair::None => return Err(if a > b { a } else { b }),
+                Pair::One(an) => {
+                    edge.next = an.next;
+                    an.next[0] = edge_idx;
+                    an.next[1] = edge_idx;
+                }
+                Pair::Both(an, bn) => {
+                    // a and b are different indices
+                    edge.next = [an.next[0], bn.next[1]];
+                    an.next[0] = edge_idx;
+                    bn.next[1] = edge_idx;
+                }
+            }
+            self.edge_count += 1;
+        }
+        self.free_edge = free_edge;
+        Ok(())
+    }
+
+    #[cfg(not(debug_assertions))]
+    fn check_free_lists(&self) { }
+    #[cfg(debug_assertions)]
+    // internal method to debug check the free lists (linked lists)
+    fn check_free_lists(&self) {
+        let mut free_node = self.free_node;
+        let mut free_node_len = 0;
+        while free_node != NodeIndex::end() {
+            if let Some(n) = self.g.nodes.get(free_node.index()) {
+                if let None = n.weight {
+                    free_node = n.next[0]._into_node();
+                    free_node_len += 1;
+                    continue;
+                }
+                debug_assert!(false, "Corrupt free list: pointing to existing {:?}",
+                              free_node.index());
+            }
+            debug_assert!(false, "Corrupt free list: missing {:?}", free_node.index());
+        }
+        debug_assert_eq!(self.node_count(), self.raw_nodes().len() - free_node_len);
+
+        let mut free_edge_len = 0;
+        let mut free_edge = self.free_edge;
+        while free_edge != EdgeIndex::end() {
+            if let Some(n) = self.g.edges.get(free_edge.index()) {
+                if let None = n.weight {
+                    free_edge = n.next[0];
+                    free_edge_len += 1;
+                    continue;
+                }
+                debug_assert!(false, "Corrupt free list: pointing to existing {:?}",
+                              free_node.index());
+            }
+            debug_assert!(false, "Corrupt free list: missing {:?}", free_edge.index());
+        }
+        debug_assert_eq!(self.edge_count(), self.raw_edges().len() - free_edge_len);
+    }
+}
+
+/// The resulting cloned graph has the same graph indices as `self`.
+impl<N, E, Ty, Ix: IndexType> Clone for StableGraph<N, E, Ty, Ix>
+    where N: Clone, E: Clone,
+{
+    fn clone(&self) -> Self {
+        StableGraph {
+            g: self.g.clone(),
+            node_count: self.node_count,
+            edge_count: self.edge_count,
+            free_node: self.free_node,
+            free_edge: self.free_edge,
+        }
+    }
+
+    fn clone_from(&mut self, rhs: &Self) {
+        self.g.clone_from(&rhs.g);
+        self.node_count = rhs.node_count;
+        self.edge_count = rhs.edge_count;
+        self.free_node = rhs.free_node;
+        self.free_edge = rhs.free_edge;
+    }
+}
+
+/// Index the `StableGraph` by `NodeIndex` to access node weights.
+///
+/// **Panics** if the node doesn't exist.
+impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type Output = N;
+    fn index(&self, index: NodeIndex<Ix>) -> &N {
+        self.node_weight(index).unwrap()
+    }
+}
+
+/// Index the `StableGraph` by `NodeIndex` to access node weights.
+///
+/// **Panics** if the node doesn't exist.
+impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
+        self.node_weight_mut(index).unwrap()
+    }
+
+}
+
+/// Index the `StableGraph` by `EdgeIndex` to access edge weights.
+///
+/// **Panics** if the edge doesn't exist.
+impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type Output = E;
+    fn index(&self, index: EdgeIndex<Ix>) -> &E {
+        self.edge_weight(index).unwrap()
+    }
+}
+
+/// Index the `StableGraph` by `EdgeIndex` to access edge weights.
+///
+/// **Panics** if the edge doesn't exist.
+impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E {
+        self.edge_weight_mut(index).unwrap()
+    }
+}
+
+/// Create a new empty `StableGraph`.
+impl<N, E, Ty, Ix> Default for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn default() -> Self { Self::with_capacity(0, 0) }
+}
+
+/// Convert a `Graph` into a `StableGraph`
+///
+/// Computes in **O(|V| + |E|)** time.
+///
+/// The resulting graph has the same node and edge indices as
+/// the original graph.
+impl<N, E, Ty, Ix> From<Graph<N, E, Ty, Ix>> for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn from(g: Graph<N, E, Ty, Ix>) -> Self {
+        let nodes = g.nodes.into_iter().map(|e| Node {
+            weight: Some(e.weight),
+            next: e.next,
+        });
+        let edges = g.edges.into_iter().map(|e| Edge {
+            weight: Some(e.weight),
+            node: e.node,
+            next: e.next,
+        });
+        StableGraph {
+            node_count: nodes.len(),
+            edge_count: edges.len(),
+            g: Graph { edges: edges.collect(), nodes: nodes.collect(), ty: g.ty },
+            free_node: NodeIndex::end(),
+            free_edge: EdgeIndex::end(),
+        }
+    }
+}
+
+/// Convert a `StableGraph` into a `Graph`
+///
+/// Computes in **O(|V| + |E|)** time.
+///
+/// This translates the stable graph into a graph with node and edge indices in
+/// a compact interval without holes (like `Graph`s always are).
+///
+/// Only if the stable graph had no vacancies after deletions (if node bound was
+/// equal to node count, and the same for edges), would the resulting graph have
+/// the same node and edge indices as the input.
+impl<N, E, Ty, Ix> From<StableGraph<N, E, Ty, Ix>> for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn from(graph: StableGraph<N, E, Ty, Ix>) -> Self {
+        let mut result_g = Graph::with_capacity(graph.node_count(), graph.edge_count());
+        // mapping from old node index to new node index
+        let mut node_index_map = vec![NodeIndex::end(); graph.node_bound()];
+
+        for (i, node) in enumerate(graph.g.nodes) {
+            if let Some(nw) = node.weight {
+                node_index_map[i] = result_g.add_node(nw);
+            }
+        }
+        for edge in graph.g.edges {
+            let source_index = edge.source().index();
+            let target_index = edge.target().index();
+            if let Some(ew) = edge.weight {
+                let source = node_index_map[source_index];
+                let target = node_index_map[target_index];
+                debug_assert!(source != NodeIndex::end());
+                debug_assert!(target != NodeIndex::end());
+                result_g.add_edge(source, target, ew);
+            }
+        }
+        result_g
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeRef = (NodeIndex<Ix>, &'a N);
+    type NodeReferences = NodeReferences<'a, N, Ix>;
+    fn node_references(self) -> Self::NodeReferences {
+        NodeReferences {
+            iter: enumerate(self.raw_nodes())
+        }
+    }
+}
+
+/// Iterator over all nodes of a graph.
+pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
+}
+
+impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
+    where Ix: IndexType
+{
+    type Item = (NodeIndex<Ix>, &'a N);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.find_map(|(i, node)| {
+            node.weight.as_ref().map(move |w| (node_index(i), w))
+        })
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
+    where Ix: IndexType
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.rfind_map(|(i, node)| {
+            node.weight.as_ref().map(move |w| (node_index(i), w))
+        })
+    }
+}
+
+/// Reference to a `StableGraph` edge.
+#[derive(Debug)]
+pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> {
+    index: EdgeIndex<Ix>,
+    node: [NodeIndex<Ix>; 2],
+    weight: &'a E,
+}
+
+impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { }
+
+impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
+    where E: PartialEq,
+{
+    fn eq(&self, rhs: &Self) -> bool {
+        self.index == rhs.index && self.weight == rhs.weight
+    }
+}
+
+impl<'a, Ix, E> EdgeReference<'a, E, Ix>
+    where Ix: IndexType,
+{
+    /// Access the edge’s weight.
+    ///
+    /// **NOTE** that this method offers a longer lifetime
+    /// than the trait (unfortunately they don't match yet).
+    pub fn weight(&self) -> &'a E { self.weight }
+}
+
+impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
+    where Ix: IndexType,
+{
+    type NodeId = NodeIndex<Ix>;
+    type EdgeId = EdgeIndex<Ix>;
+    type Weight = E;
+
+    fn source(&self) -> Self::NodeId { self.node[0] }
+    fn target(&self) -> Self::NodeId { self.node[1] }
+    fn weight(&self) -> &E { self.weight }
+    fn id(&self) -> Self::EdgeId { self.index }
+}
+
+impl<'a, N, E, Ty, Ix> IntoEdges for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Edges = Edges<'a, E, Ty, Ix>;
+    fn edges(self, a: Self::NodeId) -> Self::Edges {
+        self.edges(a)
+    }
+}
+
+impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgesDirected = Edges<'a, E, Ty, Ix>;
+    fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
+        self.edges_directed(a, dir)
+    }
+}
+
+
+/// Iterator over the edges of from or to a node
+pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// starting node to skip over
+    skip_start: NodeIndex<Ix>,
+    edges: &'a [Edge<Option<E>, Ix>],
+
+    /// Next edge to visit.
+    /// If we are only following one direction, we only use next[0] regardless.
+    next: [EdgeIndex<Ix>; 2],
+
+    /// Which direction to follow
+    /// None: Both,
+    /// Some(d): d if Directed, Both if Undirected
+    direction: Option<Direction>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Item = EdgeReference<'a, E, Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        // First the outgoing or incoming edges (directionality)
+        let k = self.direction.unwrap_or(Outgoing).index();
+        let i = self.next[0].index();
+        match self.edges.get(i) {
+            None => {}
+            Some(&Edge { ref node, weight: Some(ref weight), ref next }) => {
+                self.next[0] = next[k];
+                return Some(EdgeReference {
+                    index: edge_index(i),
+                    node: *node,
+                    weight: weight,
+                });
+            }
+            Some(_otherwise) => unreachable!(),
+        }
+        // Stop here if we only follow one direction
+        if self.direction.is_some() {
+            return None;
+        }
+        // Then incoming edges
+        // For an "undirected" iterator (traverse both incoming
+        // and outgoing edge lists), make sure we don't double
+        // count selfloops by skipping them in the incoming list.
+
+        // We reach here if self.direction was None or Outgoing.
+        debug_assert_eq!(k, 0);
+        while let Some(edge) = self.edges.get(self.next[1].index()) {
+            debug_assert!(edge.weight.is_some());
+            let i = self.next[1].index();
+            self.next[1] = edge.next[1];
+            if edge.node[0] != self.skip_start {
+                return Some(EdgeReference {
+                    index: edge_index(i),
+                    node: swap_pair(edge.node),
+                    weight: edge.weight.as_ref().unwrap(),
+                });
+            }
+        }
+        None
+    }
+}
+
+fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
+    x.swap(0, 1);
+    x
+}
+
+impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeRef = EdgeReference<'a, E, Ix>;
+    type EdgeReferences = EdgeReferences<'a, E, Ix>;
+
+    /// Create an iterator over all edges in the graph, in indexed order.
+    ///
+    /// Iterator element type is `EdgeReference<E, Ix>`.
+    fn edge_references(self) -> Self::EdgeReferences {
+        EdgeReferences {
+            iter: self.g.edges.iter().enumerate()
+        }
+    }
+
+}
+
+/// Iterator over all edges of a graph.
+pub struct EdgeReferences<'a, E: 'a, Ix: 'a = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
+}
+
+impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
+    where Ix: IndexType
+{
+    type Item = EdgeReference<'a, E, Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.find_map(|(i, edge)|
+            edge.weight.as_ref().map(move |weight| {
+                EdgeReference {
+                    index: edge_index(i),
+                    node: edge.node,
+                    weight: weight,
+                }
+            }))
+    }
+}
+
+impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
+    where Ix: IndexType
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.rfind_map(|(i, edge)|
+            edge.weight.as_ref().map(move |weight| {
+                EdgeReference {
+                    index: edge_index(i),
+                    node: edge.node,
+                    weight: weight,
+                }
+            }))
+    }
+}
+
+
+/// Iterator over the neighbors of a node.
+///
+/// Iterator element type is `NodeIndex`.
+pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx>
+{
+    /// starting node to skip over
+    skip_start: NodeIndex<Ix>,
+    edges: &'a [Edge<Option<E>, Ix>],
+    next: [EdgeIndex<Ix>; 2],
+}
+
+impl<'a, E, Ix> Neighbors<'a, E, Ix>
+    where Ix: IndexType,
+{
+    /// Return a “walker” object that can be used to step through the
+    /// neighbors and edges from the origin node.
+    ///
+    /// Note: The walker does not borrow from the graph, this is to allow mixing
+    /// edge walking with mutating the graph's weights.
+    pub fn detach(&self) -> WalkNeighbors<Ix> {
+        WalkNeighbors {
+            inner: super::WalkNeighbors {
+                skip_start: self.skip_start,
+                next: self.next
+            },
+        }
+    }
+}
+
+impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where
+    Ix: IndexType,
+{
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<NodeIndex<Ix>> {
+        // First any outgoing edges
+        match self.edges.get(self.next[0].index()) {
+            None => {}
+            Some(edge) => {
+                debug_assert!(edge.weight.is_some());
+                self.next[0] = edge.next[0];
+                return Some(edge.node[1]);
+            }
+        }
+        // Then incoming edges
+        // For an "undirected" iterator (traverse both incoming
+        // and outgoing edge lists), make sure we don't double
+        // count selfloops by skipping them in the incoming list.
+        while let Some(edge) = self.edges.get(self.next[1].index()) {
+            debug_assert!(edge.weight.is_some());
+            self.next[1] = edge.next[1];
+            if edge.node[0] != self.skip_start {
+                return Some(edge.node[0]);
+            }
+        }
+        None
+    }
+}
+
+/// A “walker” object that can be used to step through the edge list of a node.
+///
+/// See [*.detach()*](struct.Neighbors.html#method.detach) for more information.
+///
+/// The walker does not borrow from the graph, so it lets you step through
+/// neighbors or incident edges while also mutating graph weights, as
+/// in the following example:
+///
+/// ```
+/// use petgraph::visit::Dfs;
+/// use petgraph::Incoming;
+/// use petgraph::stable_graph::StableGraph;
+///
+/// let mut gr = StableGraph::new();
+/// let a = gr.add_node(0.);
+/// let b = gr.add_node(0.);
+/// let c = gr.add_node(0.);
+/// gr.add_edge(a, b, 3.);
+/// gr.add_edge(b, c, 2.);
+/// gr.add_edge(c, b, 1.);
+///
+/// // step through the graph and sum incoming edges into the node weight
+/// let mut dfs = Dfs::new(&gr, a);
+/// while let Some(node) = dfs.next(&gr) {
+///     // use a detached neighbors walker
+///     let mut edges = gr.neighbors_directed(node, Incoming).detach();
+///     while let Some(edge) = edges.next_edge(&gr) {
+///         gr[node] += gr[edge];
+///     }
+/// }
+///
+/// // check the result
+/// assert_eq!(gr[a], 0.);
+/// assert_eq!(gr[b], 4.);
+/// assert_eq!(gr[c], 2.);
+/// ```
+pub struct WalkNeighbors<Ix> {
+    inner: super::WalkNeighbors<Ix>,
+}
+
+impl<Ix: IndexType> Clone for WalkNeighbors<Ix> {
+    clone_fields!(WalkNeighbors, inner);
+}
+
+impl<Ix: IndexType> WalkNeighbors<Ix> {
+    /// Step to the next edge and its endpoint node in the walk for graph `g`.
+    ///
+    /// The next node indices are always the others than the starting point
+    /// where the `WalkNeighbors` value was created.
+    /// For an `Outgoing` walk, the target nodes,
+    /// for an `Incoming` walk, the source nodes of the edge.
+    pub fn next<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
+        -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
+        self.inner.next(&g.g)
+    }
+
+    pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
+        -> Option<NodeIndex<Ix>>
+    {
+        self.next(g).map(|t| t.1)
+    }
+
+    pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
+        -> Option<EdgeIndex<Ix>>
+    {
+        self.next(g).map(|t| t.0)
+    }
+}
+
+/// Iterator over the node indices of a graph.
+pub struct NodeIndices<'a, N: 'a, Ix: 'a = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
+}
+
+impl<'a, N, Ix: IndexType> Iterator for NodeIndices<'a, N, Ix> {
+    type Item = NodeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.find_map(|(i, node)| {
+            if node.weight.is_some() {
+                Some(node_index(i))
+            } else { None }
+        })
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+impl<'a, N, Ix: IndexType> DoubleEndedIterator for NodeIndices<'a, N, Ix> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.rfind_map(|(i, node)| {
+            if node.weight.is_some() {
+                Some(node_index(i))
+            } else { None }
+        })
+    }
+}
+
+impl<N, E, Ty, Ix> NodeIndexable for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    /// Return an upper bound of the node indices in the graph
+    fn node_bound(&self) -> usize {
+        self.node_indices()
+            .next_back()
+            .map_or(0, |i| i.index() + 1)
+    }
+    fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() }
+    fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) }
+}
+
+/// Iterator over the edge indices of a graph.
+pub struct EdgeIndices<'a, E: 'a, Ix: 'a = DefaultIx> {
+    iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
+}
+
+impl<'a, E, Ix: IndexType> Iterator for EdgeIndices<'a, E, Ix> {
+    type Item = EdgeIndex<Ix>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.find_map(|(i, node)| {
+            if node.weight.is_some() {
+                Some(edge_index(i))
+            } else { None }
+        })
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let (_, hi) = self.iter.size_hint();
+        (0, hi)
+    }
+}
+
+impl<'a, E, Ix: IndexType> DoubleEndedIterator for EdgeIndices<'a, E, Ix> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.iter.rfind_map(|(i, node)| {
+            if node.weight.is_some() {
+                Some(edge_index(i))
+            } else { None }
+        })
+    }
+}
+
+
+#[test]
+fn stable_graph() {
+    let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
+    let a = gr.add_node(0);
+    let b = gr.add_node(1);
+    let c = gr.add_node(2);
+    let _ed = gr.add_edge(a, b, 1);
+    println!("{:?}", gr);
+    gr.remove_node(b);
+    println!("{:?}", gr);
+    let d = gr.add_node(3);
+    println!("{:?}", gr);
+    gr.check_free_lists();
+    gr.remove_node(a);
+    gr.check_free_lists();
+    gr.remove_node(c);
+    gr.check_free_lists();
+    println!("{:?}", gr);
+    gr.add_edge(d, d, 2);
+    println!("{:?}", gr);
+
+    let e = gr.add_node(4);
+    gr.add_edge(d, e, 3);
+    println!("{:?}", gr);
+    for neigh in gr.neighbors(d) {
+        println!("edge {:?} -> {:?}", d, neigh);
+    }
+    gr.check_free_lists();
+}
+
+#[test]
+fn dfs() {
+    use visit::Dfs;
+
+    let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
+    let a = gr.add_node("a");
+    let b = gr.add_node("b");
+    let c = gr.add_node("c");
+    let d = gr.add_node("d");
+    gr.add_edge(a, b, 1);
+    gr.add_edge(a, c, 2);
+    gr.add_edge(b, c, 3);
+    gr.add_edge(b, d, 4);
+    gr.add_edge(c, d, 5);
+    gr.add_edge(d, b, 6);
+    gr.add_edge(c, b, 7);
+    println!("{:?}", gr);
+
+    let mut dfs = Dfs::new(&gr, a);
+    while let Some(next) = dfs.next(&gr) {
+        println!("dfs visit => {:?}, weight={:?}", next, &gr[next]);
+    }
+}
+
+#[test]
+fn test_retain_nodes() {
+    let mut gr = StableGraph::<_, _>::with_capacity(6, 6);
+    let a = gr.add_node("a");
+    let f = gr.add_node("f");
+    let b = gr.add_node("b");
+    let c = gr.add_node("c");
+    let d = gr.add_node("d");
+    let e = gr.add_node("e");
+    gr.add_edge(a, b, 1);
+    gr.add_edge(a, c, 2);
+    gr.add_edge(b, c, 3);
+    gr.add_edge(b, d, 4);
+    gr.add_edge(c, d, 5);
+    gr.add_edge(d, b, 6);
+    gr.add_edge(c, b, 7);
+    gr.add_edge(d, e, 8);
+    gr.remove_node(f);
+
+    assert_eq!(gr.node_count(), 5);
+    assert_eq!(gr.edge_count(), 8);
+    gr.retain_nodes(|frozen_gr, ix| {frozen_gr[ix] >= "c"});
+    assert_eq!(gr.node_count(), 3);
+    assert_eq!(gr.edge_count(), 2);
+
+    gr.check_free_lists();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graph_impl/stable_graph/serialization.rs
@@ -0,0 +1,270 @@
+
+
+use serde::de::Error;
+use serde::{Serialize, Serializer, Deserialize, Deserializer};
+
+use std::marker::PhantomData;
+
+use prelude::*;
+
+use EdgeType;
+use graph::Node;
+use graph::{IndexType, Edge};
+use stable_graph::StableGraph;
+use util::rev;
+use serde_utils::MappedSequenceVisitor;
+use serde_utils::CollectSeqWithLength;
+use serde_utils::{IntoSerializable, FromDeserialized};
+use visit::NodeIndexable;
+
+use super::super::serialization::{EdgeProperty, invalid_length_err, invalid_node_err};
+
+// Serialization representation for StableGraph
+// Keep in sync with deserialization and Graph
+#[derive(Serialize)]
+#[serde(rename = "Graph")]
+#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))]
+pub struct SerStableGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> {
+    nodes: Somes<&'a [Node<Option<N>, Ix>]>,
+    node_holes: Holes<&'a [Node<Option<N>, Ix>]>,
+    edge_property: EdgeProperty,
+    #[serde(serialize_with="ser_stable_graph_edges")]
+    edges: &'a [Edge<Option<E>, Ix>],
+}
+
+// Deserialization representation for StableGraph
+// Keep in sync with serialization and Graph
+#[derive(Deserialize)]
+#[serde(rename = "Graph")]
+#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))]
+pub struct DeserStableGraph<N, E, Ix> {
+    #[serde(deserialize_with="deser_stable_graph_nodes")]
+    nodes: Vec<Node<Option<N>, Ix>>,
+    #[serde(default="Vec::new")]
+    node_holes: Vec<NodeIndex<Ix>>,
+    edge_property: EdgeProperty,
+    #[serde(deserialize_with="deser_stable_graph_edges")]
+    edges: Vec<Edge<Option<E>, Ix>>,
+}
+
+/// Somes are the present node weights N, with known length.
+struct Somes<T>(usize, T);
+
+impl<'a, N, Ix> Serialize for Somes<&'a [Node<Option<N>, Ix>]>
+    where N: Serialize,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer,
+    {
+        serializer.collect_seq_with_length(self.0,
+            self.1.iter().filter_map(|node| node.weight.as_ref()))
+    }
+}
+
+/// Holes are the node indices of vacancies, with known length
+struct Holes<T>(usize, T);
+
+impl<'a, N, Ix> Serialize for Holes<&'a [Node<Option<N>, Ix>]>
+    where Ix: Serialize + IndexType,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer,
+    {
+        serializer.collect_seq_with_length(self.0,
+            self.1.iter()
+                  .enumerate()
+                  .filter_map(|(i, node)| if node.weight.is_none() {
+                      Some(NodeIndex::<Ix>::new(i))
+                  } else {
+                      None
+                  }))
+    }
+}
+
+fn ser_stable_graph_edges<S, E, Ix>(edges: &&[Edge<Option<E>, Ix>], serializer: S) -> Result<S::Ok, S::Error>
+    where S: Serializer,
+          E: Serialize,
+          Ix: Serialize + IndexType,
+{
+    serializer.collect_seq_exact(
+        edges.iter()
+            .map(|edge| edge.weight.as_ref().map(|w| (
+               edge.source(),
+               edge.target(),
+               w
+            ))))
+}
+
+fn deser_stable_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<Option<N>, Ix>>, D::Error>
+    where D: Deserializer<'de>,
+          N: Deserialize<'de>,
+          Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n|
+        Ok(Node {
+            weight: Some(n),
+            next: [EdgeIndex::end(); 2],
+        })
+    ))
+}
+
+fn deser_stable_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<Option<N>, Ix>>, D::Error>
+    where D: Deserializer<'de>,
+          N: Deserialize<'de>,
+          Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x|
+        if let Some((i, j, w)) = x {
+            Ok(Edge {
+                weight: Some(w),
+                node: [i, j],
+                next: [EdgeIndex::end(); 2],
+            })
+        } else {
+            Ok(Edge {
+                weight: None,
+                node: [NodeIndex::end(); 2],
+                next: [EdgeIndex::end(); 2],
+            })
+        }
+    ))
+}
+
+impl<'a, N, E, Ty, Ix> IntoSerializable for &'a StableGraph<N, E, Ty, Ix>
+    where Ix: IndexType,
+          Ty: EdgeType,
+{
+    type Output = SerStableGraph<'a, N, E, Ix>;
+    fn into_serializable(self) -> Self::Output {
+        let nodes = &self.raw_nodes()[..self.node_bound()];
+        let node_count = self.node_count();
+        let hole_count = nodes.len() - node_count;
+        let edges = &self.raw_edges()[..self.edge_bound()];
+        SerStableGraph {
+            nodes: Somes(node_count, nodes),
+            node_holes: Holes(hole_count, nodes),
+            edges: edges,
+            edge_property: EdgeProperty::from(PhantomData::<Ty>),
+        }
+    }
+}
+
+/// Requires crate feature `"serde-1"`
+impl<N, E, Ty, Ix> Serialize for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType + Serialize,
+          N: Serialize,
+          E: Serialize,
+{
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+        where S: Serializer
+    {
+        self.into_serializable().serialize(serializer)
+    }
+}
+
+impl<'a, N, E, Ty, Ix> FromDeserialized for StableGraph<N, E, Ty, Ix>
+    where Ix: IndexType,
+          Ty: EdgeType,
+{
+    type Input = DeserStableGraph<N, E, Ix>;
+    fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
+        where E2: Error
+    {
+        let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
+        let mut nodes = input.nodes;
+        let node_holes = input.node_holes;
+        let edges = input.edges;
+        if edges.len() >= <Ix as IndexType>::max().index() {
+            Err(invalid_length_err::<Ix, _>("edge", edges.len()))?
+        }
+
+        // insert Nones for each hole
+        let mut offset = node_holes.len();
+        let node_bound = node_holes.len() + nodes.len();
+        for hole_pos in rev(node_holes) {
+            offset -= 1;
+            if hole_pos.index() >= node_bound {
+                Err(invalid_node_err(hole_pos.index(), node_bound))?;
+            }
+            let insert_pos = hole_pos.index() - offset;
+            nodes.insert(insert_pos, Node {
+                weight: None,
+                next: [EdgeIndex::end(); 2],
+            });
+        }
+
+        if nodes.len() >= <Ix as IndexType>::max().index() {
+            Err(invalid_length_err::<Ix, _>("node", nodes.len()))?
+        }
+
+        let node_bound = nodes.len();
+        let mut sgr = StableGraph {
+            g: Graph {
+                nodes: nodes,
+                edges: edges,
+                ty: ty,
+            },
+            node_count: 0,
+            edge_count: 0,
+            free_edge: EdgeIndex::end(),
+            free_node: NodeIndex::end(),
+        };
+        sgr.link_edges().map_err(|i| invalid_node_err(i.index(), node_bound))?;
+        Ok(sgr)
+    }
+}
+
+/// Requires crate feature `"serde-1"`
+impl<'de, N, E, Ty, Ix> Deserialize<'de> for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType + Deserialize<'de>,
+          N: Deserialize<'de>,
+          E: Deserialize<'de>,
+{
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+        where D: Deserializer<'de>
+    {
+        Self::from_deserialized(DeserStableGraph::deserialize(deserializer)?)
+    }
+}
+
+#[test]
+fn test_from_deserialized_with_holes() {
+    use graph::node_index;
+    use stable_graph::StableUnGraph;
+    use serde::de::value::Error as SerdeError;
+    use itertools::assert_equal;
+
+    let input = DeserStableGraph::<_, (), u32> {
+        nodes: vec![
+            Node {
+                weight: Some(1),
+                next: [EdgeIndex::end(); 2],
+            },
+            Node {
+                weight: Some(4),
+                next: [EdgeIndex::end(); 2],
+            },
+            Node {
+                weight: Some(5),
+                next: [EdgeIndex::end(); 2],
+            },
+        ],
+        node_holes: vec![
+            node_index(0),
+            node_index(2),
+            node_index(3),
+            node_index(6),
+        ],
+        edges: vec![],
+        edge_property: EdgeProperty::Undirected,
+    };
+    let graph = StableUnGraph::from_deserialized::<SerdeError>(input).unwrap();
+
+    assert_eq!(graph.node_count(), 3);
+    assert_equal(
+        graph.raw_nodes().iter().map(|n| n.weight.as_ref().cloned()),
+        vec![None, Some(1), None, None, Some(4), Some(5), None]);
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/graphmap.rs
@@ -0,0 +1,886 @@
+//! `GraphMap<N, E, Ty>` is a graph datastructure where node values are mapping
+//! keys.
+
+use std::cmp::Ordering;
+use std::hash::{self, Hash};
+use std::iter::{
+    Cloned,
+    DoubleEndedIterator,
+};
+use std::slice::{
+    Iter,
+};
+use std::fmt;
+use std::ops::{Index, IndexMut, Deref};
+use std::iter::FromIterator;
+use std::marker::PhantomData;
+use ordermap::OrderMap;
+use ordermap::{
+    Iter as OrderMapIter, IterMut as OrderMapIterMut
+};
+use ordermap::Keys;
+
+use {
+    EdgeType,
+    Directed,
+    Undirected,
+    Direction,
+    Incoming,
+    Outgoing,
+};
+
+use IntoWeightedEdge;
+use visit::{IntoNodeIdentifiers, NodeCount, IntoNodeReferences, NodeIndexable};
+use visit::{NodeCompactIndexable, IntoEdgeReferences, IntoEdges};
+use graph::Graph;
+use graph::node_index;
+
+/// A `GraphMap` with undirected edges.
+///
+/// For example, an edge between *1* and *2* is equivalent to an edge between
+/// *2* and *1*.
+pub type UnGraphMap<N, E> = GraphMap<N, E, Undirected>;
+/// A `GraphMap` with directed edges.
+///
+/// For example, an edge from *1* to *2* is distinct from an edge from *2* to
+/// *1*.
+pub type DiGraphMap<N, E> = GraphMap<N, E, Directed>;
+
+/// `GraphMap<N, E, Ty>` is a graph datastructure using an associative array
+/// of its node weights `N`.
+///
+/// It uses an combined adjacency list and sparse adjacency matrix
+/// representation, using **O(|V| + |E|)** space, and allows testing for edge
+/// existance in constant time.
+///
+/// `GraphMap` is parameterized over:
+///
+/// - Associated data `N` for nodes and `E` for edges, called *weights*.
+/// - The node weight `N` must implement `Copy` and will be used as node
+/// identifier, duplicated into several places in the data structure.
+/// It must be suitable as a hash table key (implementing `Eq + Hash`).
+/// The node type must also implement `Ord` so that the implementation can
+/// order the pair (`a`, `b`) for an edge connecting any two nodes `a` and `b`.
+/// - `E` can be of arbitrary type.
+/// - Edge type `Ty` that determines whether the graph edges are directed or
+/// undirected.
+///
+/// You can use the type aliases `UnGraphMap` and `DiGraphMap` for convenience.
+///
+/// `GraphMap` does not allow parallel edges, but self loops are allowed.
+///
+/// Depends on crate feature `graphmap` (default).
+#[derive(Clone)]
+pub struct GraphMap<N, E, Ty> {
+    nodes: OrderMap<N, Vec<(N, CompactDirection)>>,
+    edges: OrderMap<(N, N), E>,
+    ty: PhantomData<Ty>,
+}
+
+impl<N: Eq + Hash + fmt::Debug, E: fmt::Debug, Ty: EdgeType> fmt::Debug for GraphMap<N, E, Ty> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.nodes.fmt(f)
+    }
+}
+
+/// A trait group for `GraphMap`'s node identifier.
+pub trait NodeTrait : Copy + Ord + Hash {}
+impl<N> NodeTrait for N where N: Copy + Ord + Hash {}
+
+// non-repr(usize) version of Direction
+#[derive(Copy, Clone, Debug, PartialEq)]
+enum CompactDirection {
+    Outgoing,
+    Incoming,
+}
+
+impl From<Direction> for CompactDirection {
+    fn from(d: Direction) -> Self {
+        match d {
+            Outgoing => CompactDirection::Outgoing,
+            Incoming => CompactDirection::Incoming,
+        }
+    }
+}
+
+impl PartialEq<Direction> for CompactDirection {
+    fn eq(&self, rhs: &Direction) -> bool {
+        (*self as usize) == (*rhs as usize)
+    }
+}
+
+impl<N, E, Ty> GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    /// Create a new `GraphMap`
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    /// Create a new `GraphMap` with estimated capacity.
+    pub fn with_capacity(nodes: usize, edges: usize) -> Self {
+        GraphMap {
+            nodes: OrderMap::with_capacity(nodes),
+            edges: OrderMap::with_capacity(edges),
+            ty: PhantomData,
+        }
+    }
+
+    /// Return the current node and edge capacity of the graph.
+    pub fn capacity(&self) -> (usize, usize) {
+        (self.nodes.capacity(), self.edges.capacity())
+    }
+
+    /// Use their natual order to map the node pair (a, b) to a canonical edge id.
+    #[inline]
+    fn edge_key(a: N, b: N) -> (N, N) {
+        if Ty::is_directed() {
+            (a, b)
+        } else {
+            if a <= b { (a, b) } else { (b, a) }
+        }
+    }
+
+    /// Whether the graph has directed edges.
+    pub fn is_directed(&self) -> bool {
+        Ty::is_directed()
+    }
+
+    /// Create a new `GraphMap` from an iterable of edges.
+    ///
+    /// Node values are taken directly from the list.
+    /// Edge weights `E` may either be specified in the list,
+    /// or they are filled with default values.
+    ///
+    /// Nodes are inserted automatically to match the edges.
+    ///
+    /// ```
+    /// use petgraph::graphmap::UnGraphMap;
+    ///
+    /// // Create a new undirected GraphMap.
+    /// // Use a type hint to have `()` be the edge weight type.
+    /// let gr = UnGraphMap::<_, ()>::from_edges(&[
+    ///     (0, 1), (0, 2), (0, 3),
+    ///     (1, 2), (1, 3),
+    ///     (2, 3),
+    /// ]);
+    /// ```
+    pub fn from_edges<I>(iterable: I) -> Self
+        where I: IntoIterator,
+              I::Item: IntoWeightedEdge<E, NodeId=N>
+    {
+        Self::from_iter(iterable)
+    }
+
+    /// Return the number of nodes in the graph.
+    pub fn node_count(&self) -> usize {
+        self.nodes.len()
+    }
+
+    /// Return the number of edges in the graph.
+    pub fn edge_count(&self) -> usize {
+        self.edges.len()
+    }
+
+    /// Remove all nodes and edges
+    pub fn clear(&mut self) {
+        self.nodes.clear();
+        self.edges.clear();
+    }
+
+    /// Add node `n` to the graph.
+    pub fn add_node(&mut self, n: N) -> N {
+        self.nodes.entry(n).or_insert(Vec::new());
+        n
+    }
+
+    /// Return `true` if node `n` was removed.
+    pub fn remove_node(&mut self, n: N) -> bool {
+        let links = match self.nodes.swap_remove(&n) {
+            None => return false,
+            Some(sus) => sus,
+        };
+        for (succ, _) in links {
+            // remove all successor links
+            self.remove_single_edge(&succ, &n, Incoming);
+            // Remove all edge values
+            self.edges.swap_remove(&Self::edge_key(n, succ));
+        }
+        true
+    }
+
+    /// Return `true` if the node is contained in the graph.
+    pub fn contains_node(&self, n: N) -> bool {
+        self.nodes.contains_key(&n)
+    }
+
+    /// Add an edge connecting `a` and `b` to the graph, with associated
+    /// data `weight`. For a directed graph, the edge is directed from `a`
+    /// to `b`.
+    ///
+    /// Inserts nodes `a` and/or `b` if they aren't already part of the graph.
+    ///
+    /// Return `None` if the edge did not previously exist, otherwise,
+    /// the associated data is updated and the old value is returned
+    /// as `Some(old_weight)`.
+    ///
+    /// ```
+    /// // Create a GraphMap with directed edges, and add one edge to it
+    /// use petgraph::graphmap::DiGraphMap;
+    ///
+    /// let mut g = DiGraphMap::new();
+    /// g.add_edge("x", "y", -1);
+    /// assert_eq!(g.node_count(), 2);
+    /// assert_eq!(g.edge_count(), 1);
+    /// assert!(g.contains_edge("x", "y"));
+    /// assert!(!g.contains_edge("y", "x"));
+    /// ```
+    pub fn add_edge(&mut self, a: N, b: N, weight: E) -> Option<E> {
+        if let old @ Some(_) = self.edges.insert(Self::edge_key(a, b), weight) {
+            old
+        } else {
+            // insert in the adjacency list if it's a new edge
+            self.nodes.entry(a)
+                      .or_insert_with(|| Vec::with_capacity(1))
+                      .push((b, CompactDirection::Outgoing));
+            if a != b {
+                // self loops don't have the Incoming entry
+                self.nodes.entry(b)
+                          .or_insert_with(|| Vec::with_capacity(1))
+                          .push((a, CompactDirection::Incoming));
+            }
+            None
+        }
+    }
+
+    /// Remove edge relation from a to b
+    ///
+    /// Return `true` if it did exist.
+    fn remove_single_edge(&mut self, a: &N, b: &N, dir: Direction) -> bool {
+        match self.nodes.get_mut(a) {
+            None => false,
+            Some(sus) => {
+                if Ty::is_directed() {
+                    match sus.iter().position(|elt| elt == &(*b, CompactDirection::from(dir))) {
+                        Some(index) => { sus.swap_remove(index); true }
+                        None => false,
+                    }
+                } else {
+                    match sus.iter().position(|elt| &elt.0 == b) {
+                        Some(index) => { sus.swap_remove(index); true }
+                        None => false,
+                    }
+                }
+            }
+        }
+    }
+
+    /// Remove edge from `a` to `b` from the graph and return the edge weight.
+    ///
+    /// Return `None` if the edge didn't exist.
+    ///
+    /// ```
+    /// // Create a GraphMap with undirected edges, and add and remove an edge.
+    /// use petgraph::graphmap::UnGraphMap;
+    ///
+    /// let mut g = UnGraphMap::new();
+    /// g.add_edge("x", "y", -1);
+    ///
+    /// let edge_data = g.remove_edge("y", "x");
+    /// assert_eq!(edge_data, Some(-1));
+    /// assert_eq!(g.edge_count(), 0);
+    /// ```
+    pub fn remove_edge(&mut self, a: N, b: N) -> Option<E> {
+        let exist1 = self.remove_single_edge(&a, &b, Outgoing);
+        let exist2 = if a != b {
+            self.remove_single_edge(&b, &a, Incoming)
+        } else { exist1 };
+        let weight = self.edges.remove(&Self::edge_key(a, b));
+        debug_assert!(exist1 == exist2 && exist1 == weight.is_some());
+        weight
+    }
+
+    /// Return `true` if the edge connecting `a` with `b` is contained in the graph.
+    pub fn contains_edge(&self, a: N, b: N) -> bool {
+        self.edges.contains_key(&Self::edge_key(a, b))
+    }
+
+    /// Return an iterator over the nodes of the graph.
+    ///
+    /// Iterator element type is `N`.
+    pub fn nodes(&self) -> Nodes<N> {
+        Nodes{iter: self.nodes.keys().cloned()}
+    }
+
+    /// Return an iterator of all nodes with an edge starting from `a`.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `N`.
+    pub fn neighbors(&self, a: N) -> Neighbors<N, Ty> {
+        Neighbors {
+            iter: match self.nodes.get(&a) {
+                Some(neigh) => neigh.iter(),
+                None => [].iter(),
+            },
+            ty: self.ty,
+        }
+    }
+
+    /// Return an iterator of all neighbors that have an edge between them and
+    /// `a`, in the specified direction.
+    /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
+    ///
+    /// - `Directed`, `Outgoing`: All edges from `a`.
+    /// - `Directed`, `Incoming`: All edges to `a`.
+    /// - `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `N`.
+    pub fn neighbors_directed(&self, a: N, dir: Direction)
+        -> NeighborsDirected<N, Ty>
+    {
+        NeighborsDirected {
+            iter: match self.nodes.get(&a) {
+                Some(neigh) => neigh.iter(),
+                None => [].iter(),
+            },
+            dir: dir,
+            ty: self.ty,
+        }
+    }
+
+    /// Return an iterator of target nodes with an edge starting from `a`,
+    /// paired with their respective edge weights.
+    ///
+    /// - `Directed`: Outgoing edges from `a`.
+    /// - `Undirected`: All edges from or to `a`.
+    ///
+    /// Produces an empty iterator if the node doesn't exist.<br>
+    /// Iterator element type is `(N, &E)`.
+    pub fn edges(&self, from: N) -> Edges<N, E, Ty> {
+        Edges {
+            from: from,
+            iter: self.neighbors(from),
+            edges: &self.edges,
+        }
+    }
+
+    /// Return a reference to the edge weight connecting `a` with `b`, or
+    /// `None` if the edge does not exist in the graph.
+    pub fn edge_weight(&self, a: N, b: N) -> Option<&E> {
+        self.edges.get(&Self::edge_key(a, b))
+    }
+
+    /// Return a mutable reference to the edge weight connecting `a` with `b`, or
+    /// `None` if the edge does not exist in the graph.
+    pub fn edge_weight_mut(&mut self, a: N, b: N) -> Option<&mut E> {
+        self.edges.get_mut(&Self::edge_key(a, b))
+    }
+
+    /// Return an iterator over all edges of the graph with their weight in arbitrary order.
+    ///
+    /// Iterator element type is `(N, N, &E)`
+    pub fn all_edges(&self) -> AllEdges<N, E, Ty> {
+        AllEdges {
+            inner: self.edges.iter(),
+            ty: self.ty,
+        }
+    }
+
+    /// Return an iterator over all edges of the graph in arbitrary order, with a mutable reference
+    /// to their weight.
+    ///
+    /// Iterator element type is `(N, N, &mut E)`
+    pub fn all_edges_mut(&mut self) -> AllEdgesMut<N, E, Ty> {
+        AllEdgesMut {
+            inner: self.edges.iter_mut(),
+            ty: self.ty,
+        }
+    }
+
+    /// Return a `Graph` that corresponds to this `GraphMap`.
+    ///
+    /// 1. Note that node and edge indices in the `Graph` have nothing in common
+    ///    with the `GraphMap`s node weights `N`. The node weights `N` are used as
+    ///    node weights in the resulting `Graph`, too.
+    /// 2. Note that the index type is user-chosen.
+    ///
+    /// Computes in **O(|V| + |E|)** time (average).
+    ///
+    /// **Panics** if the number of nodes or edges does not fit with
+    /// the resulting graph's index type.
+    pub fn into_graph<Ix>(self) -> Graph<N, E, Ty, Ix>
+        where Ix: ::graph::IndexType,
+    {
+        // assuming two successive iterations of the same hashmap produce the same order
+        let mut gr = Graph::with_capacity(self.node_count(), self.edge_count());
+        for (&node, _) in &self.nodes {
+            gr.add_node(node);
+        }
+        for ((a, b), edge_weight) in self.edges {
+            let (ai, _, _) = self.nodes.get_full(&a).unwrap();
+            let (bi, _, _) = self.nodes.get_full(&b).unwrap();
+            gr.add_edge(node_index(ai), node_index(bi), edge_weight);
+        }
+        gr
+    }
+}
+
+/// Create a new `GraphMap` from an iterable of edges.
+impl<N, E, Ty, Item> FromIterator<Item> for GraphMap<N, E, Ty>
+    where Item: IntoWeightedEdge<E, NodeId=N>,
+          N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn from_iter<I>(iterable: I) -> Self
+        where I: IntoIterator<Item=Item>,
+    {
+        let iter = iterable.into_iter();
+        let (low, _) = iter.size_hint();
+        let mut g = Self::with_capacity(0, low);
+        g.extend(iter);
+        g
+    }
+}
+
+/// Extend the graph from an iterable of edges.
+///
+/// Nodes are inserted automatically to match the edges.
+impl<N, E, Ty, Item> Extend<Item> for GraphMap<N, E, Ty>
+    where Item: IntoWeightedEdge<E, NodeId=N>,
+          N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn extend<I>(&mut self, iterable: I)
+        where I: IntoIterator<Item=Item>,
+    {
+        let iter = iterable.into_iter();
+        let (low, _) = iter.size_hint();
+        self.edges.reserve(low);
+
+        for elt in iter {
+            let (source, target, weight) = elt.into_weighted_edge();
+            self.add_edge(source, target, weight);
+        }
+    }
+}
+
+macro_rules! iterator_wrap {
+    ($name: ident <$($typarm:tt),*> where { $($bounds: tt)* }
+     item: $item: ty,
+     iter: $iter: ty,
+     ) => (
+        pub struct $name <$($typarm),*> where $($bounds)* {
+            iter: $iter,
+        }
+        impl<$($typarm),*> Iterator for $name <$($typarm),*>
+            where $($bounds)*
+        {
+            type Item = $item;
+            #[inline]
+            fn next(&mut self) -> Option<Self::Item> {
+                self.iter.next()
+            }
+
+            #[inline]
+            fn size_hint(&self) -> (usize, Option<usize>) {
+                self.iter.size_hint()
+            }
+        }
+    );
+}
+
+iterator_wrap! {
+    Nodes <'a, N> where { N: 'a + NodeTrait }
+    item: N,
+    iter: Cloned<Keys<'a, N, Vec<(N, CompactDirection)>>>,
+}
+
+pub struct Neighbors<'a, N, Ty = Undirected>
+    where N: 'a,
+          Ty: EdgeType,
+{
+    iter: Iter<'a, (N, CompactDirection)>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, N, Ty> Iterator for Neighbors<'a, N, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType
+{
+    type Item = N;
+    fn next(&mut self) -> Option<N> {
+        if Ty::is_directed() {
+            (&mut self.iter)
+                .filter_map(|&(n, dir)| if dir == Outgoing {
+                    Some(n)
+                } else { None })
+                .next()
+        } else {
+            self.iter.next().map(|&(n, _)| n)
+        }
+    }
+}
+
+pub struct NeighborsDirected<'a, N, Ty>
+    where N: 'a,
+          Ty: EdgeType,
+{
+    iter: Iter<'a, (N, CompactDirection)>,
+    dir: Direction,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, N, Ty> Iterator for NeighborsDirected<'a, N, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType
+{
+    type Item = N;
+    fn next(&mut self) -> Option<N> {
+        if Ty::is_directed() {
+            let self_dir = self.dir;
+            (&mut self.iter)
+                .filter_map(move |&(n, dir)| if dir == self_dir {
+                    Some(n)
+                } else { None })
+                .next()
+        } else {
+            self.iter.next().map(|&(n, _)| n)
+        }
+    }
+}
+
+pub struct Edges<'a, N, E: 'a, Ty>
+    where N: 'a + NodeTrait,
+          Ty: EdgeType
+{
+    from: N,
+    edges: &'a OrderMap<(N, N), E>,
+    iter: Neighbors<'a, N, Ty>,
+}
+
+impl<'a, N, E, Ty> Iterator for Edges<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    type Item = (N, N, &'a E);
+    fn next(&mut self) -> Option<Self::Item> {
+        match self.iter.next() {
+            None => None,
+            Some(b) => {
+                let a = self.from;
+                match self.edges.get(&GraphMap::<N, E, Ty>::edge_key(a, b)) {
+                    None => unreachable!(),
+                    Some(edge) => {
+                        Some((a, b, edge))
+                    }
+                }
+            }
+        }
+    }
+}
+
+impl<'a, N: 'a, E: 'a, Ty> IntoEdgeReferences for &'a GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type EdgeRef = (N, N, &'a E);
+    type EdgeReferences = AllEdges<'a, N, E, Ty>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        self.all_edges()
+    }
+}
+
+pub struct AllEdges<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+    inner: OrderMapIter<'a, (N, N), E>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, N, E, Ty> Iterator for AllEdges<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    type Item = (N, N, &'a E);
+    fn next(&mut self) -> Option<Self::Item>
+    {
+        match self.inner.next() {
+            None => None,
+            Some((&(a, b), v)) => Some((a, b, v))
+        }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.inner.size_hint()
+    }
+
+    fn count(self) -> usize {
+        self.inner.count()
+    }
+
+    fn nth(&mut self, n: usize) -> Option<Self::Item> {
+        self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+
+    fn last(self) -> Option<Self::Item> {
+        self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+}
+
+impl<'a, N, E, Ty> DoubleEndedIterator for AllEdges<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+}
+
+pub struct AllEdgesMut<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+    inner: OrderMapIterMut<'a, (N, N), E>,
+    ty: PhantomData<Ty>,
+}
+
+impl<'a, N, E, Ty> Iterator for AllEdgesMut<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    type Item = (N, N, &'a mut E);
+    fn next(&mut self) -> Option<Self::Item> {
+        self.inner.next().map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.inner.size_hint()
+    }
+
+    fn count(self) -> usize {
+        self.inner.count()
+    }
+
+    fn nth(&mut self, n: usize) -> Option<Self::Item> {
+        self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+
+    fn last(self) -> Option<Self::Item> {
+        self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+}
+
+impl<'a, N, E, Ty> DoubleEndedIterator for AllEdgesMut<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight))
+    }
+}
+
+impl<'a, N: 'a, E: 'a, Ty> IntoEdges for &'a GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type Edges = Edges<'a, N, E, Ty>;
+    fn edges(self, a: Self::NodeId) -> Self::Edges {
+        self.edges(a)
+    }
+}
+
+
+/// Index `GraphMap` by node pairs to access edge weights.
+impl<N, E, Ty> Index<(N, N)> for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type Output = E;
+    fn index(&self, index: (N, N)) -> &E
+    {
+        let index = Self::edge_key(index.0, index.1);
+        self.edge_weight(index.0, index.1).expect("GraphMap::index: no such edge")
+    }
+}
+
+/// Index `GraphMap` by node pairs to access edge weights.
+impl<N, E, Ty> IndexMut<(N, N)> for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn index_mut(&mut self, index: (N, N)) -> &mut E {
+        let index = Self::edge_key(index.0, index.1);
+        self.edge_weight_mut(index.0, index.1).expect("GraphMap::index: no such edge")
+    }
+}
+
+/// Create a new empty `GraphMap`.
+impl<N, E, Ty> Default for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn default() -> Self { GraphMap::with_capacity(0, 0) }
+}
+
+/// A reference that is hashed and compared by its pointer value.
+///
+/// `Ptr` is used for certain configurations of `GraphMap`,
+/// in particular in the combination where the node type for
+/// `GraphMap` is something of type for example `Ptr(&Cell<T>)`,
+/// with the `Cell<T>` being `TypedArena` allocated.
+pub struct Ptr<'b, T: 'b>(pub &'b T);
+
+impl<'b, T> Copy for Ptr<'b, T> {}
+impl<'b, T> Clone for Ptr<'b, T>
+{
+    fn clone(&self) -> Self { *self }
+}
+
+
+fn ptr_eq<T>(a: *const T, b: *const T) -> bool {
+    a == b
+}
+
+impl<'b, T> PartialEq for Ptr<'b, T>
+{
+    /// Ptr compares by pointer equality, i.e if they point to the same value
+    fn eq(&self, other: &Ptr<'b, T>) -> bool {
+        ptr_eq(self.0, other.0)
+    }
+}
+
+impl<'b, T> PartialOrd for Ptr<'b, T>
+{
+    fn partial_cmp(&self, other: &Ptr<'b, T>) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl<'b, T> Ord for Ptr<'b, T>
+{
+    /// Ptr is ordered by pointer value, i.e. an arbitrary but stable and total order.
+    fn cmp(&self, other: &Ptr<'b, T>) -> Ordering {
+        let a: *const T = self.0;
+        let b: *const T = other.0;
+        a.cmp(&b)
+    }
+}
+
+impl<'b, T> Deref for Ptr<'b, T> {
+    type Target = T;
+    fn deref(&self) -> &T {
+        self.0
+    }
+}
+
+impl<'b, T> Eq for Ptr<'b, T> {}
+
+impl<'b, T> Hash for Ptr<'b, T>
+{
+    fn hash<H: hash::Hasher>(&self, st: &mut H)
+    {
+        let ptr = (self.0) as *const T;
+        ptr.hash(st)
+    }
+}
+
+impl<'b, T: fmt::Debug> fmt::Debug for Ptr<'b, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.0.fmt(f)
+    }
+}
+
+impl<'a, N, E: 'a, Ty> IntoNodeIdentifiers for &'a GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type NodeIdentifiers = NodeIdentifiers<'a, N, E, Ty>;
+
+    fn node_identifiers(self) -> Self::NodeIdentifiers {
+        NodeIdentifiers {
+            iter: self.nodes.iter(),
+            ty: self.ty,
+            edge_ty: PhantomData,
+        }
+    }
+}
+
+impl<N, E, Ty> NodeCount for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn node_count(&self) -> usize {
+        (*self).node_count()
+    }
+}
+
+pub struct NodeIdentifiers<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+    iter: OrderMapIter<'a, N, Vec<(N, CompactDirection)>>,
+    ty: PhantomData<Ty>,
+    edge_ty: PhantomData<E>,
+}
+
+impl<'a, N, E, Ty> Iterator for NodeIdentifiers<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    type Item = N;
+    fn next(&mut self) -> Option<Self::Item>
+    {
+        self.iter.next().map(|(&n, _)| n)
+    }
+}
+
+impl<'a, N, E, Ty> IntoNodeReferences for &'a GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type NodeRef = (N, &'a N);
+    type NodeReferences = NodeReferences<'a, N, E, Ty>;
+    fn node_references(self) -> Self::NodeReferences {
+        NodeReferences {
+            iter: self.nodes.iter(),
+            ty: self.ty,
+            edge_ty: PhantomData,
+        }
+    }
+}
+
+pub struct NodeReferences<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+    iter: OrderMapIter<'a, N, Vec<(N, CompactDirection)>>,
+    ty: PhantomData<Ty>,
+    edge_ty: PhantomData<E>,
+}
+
+impl<'a, N, E, Ty> Iterator for NodeReferences<'a, N, E, Ty>
+    where N: 'a + NodeTrait, E: 'a,
+          Ty: EdgeType,
+{
+    type Item = (N, &'a N);
+    fn next(&mut self) -> Option<Self::Item>
+    {
+        self.iter.next().map(|(n, _)| (*n, n))
+    }
+}
+
+impl<N, E, Ty> NodeIndexable for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    fn node_bound(&self) -> usize { self.node_count() }
+    fn to_index(&self, ix: Self::NodeId) -> usize {
+        let (i, _, _) = self.nodes.get_full(&ix).unwrap();
+        i
+    }
+    fn from_index(&self, ix: usize) -> Self::NodeId {
+        let (&key, _) = self.nodes.get_index(ix).unwrap();
+        key
+    }
+}
+
+impl<N, E, Ty> NodeCompactIndexable for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/isomorphism.rs
@@ -0,0 +1,456 @@
+use std::marker;
+use fixedbitset::FixedBitSet;
+
+use super::{
+    EdgeType,
+    Incoming,
+};
+use super::graph::{
+    Graph,
+    IndexType,
+    NodeIndex,
+};
+
+use super::visit::GetAdjacencyMatrix;
+
+#[derive(Debug)]
+struct Vf2State<Ty, Ix> {
+    /// The current mapping M(s) of nodes from G0 → G1 and G1 → G0,
+    /// NodeIndex::end() for no mapping.
+    mapping: Vec<NodeIndex<Ix>>,
+    /// out[i] is non-zero if i is in either M_0(s) or Tout_0(s)
+    /// These are all the next vertices that are not mapped yet, but
+    /// have an outgoing edge from the mapping.
+    out: Vec<usize>,
+    /// ins[i] is non-zero if i is in either M_0(s) or Tin_0(s)
+    /// These are all the incoming vertices, those not mapped yet, but
+    /// have an edge from them into the mapping.
+    /// Unused if graph is undirected -- it's identical with out in that case.
+    ins: Vec<usize>,
+    out_size: usize,
+    ins_size: usize,
+    adjacency_matrix: FixedBitSet,
+    generation: usize,
+    _etype: marker::PhantomData<Ty>,
+}
+
+impl<Ty, Ix> Vf2State<Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    pub fn new<N, E>(g: &Graph<N, E, Ty, Ix>) -> Self {
+        let c0 = g.node_count();
+        let mut state = Vf2State {
+            mapping: Vec::with_capacity(c0),
+            out: Vec::with_capacity(c0),
+            ins: Vec::with_capacity(c0 * (g.is_directed() as usize)),
+            out_size: 0,
+            ins_size: 0,
+            adjacency_matrix: g.adjacency_matrix(),
+            generation: 0,
+            _etype: marker::PhantomData,
+        };
+        for _ in 0..c0 {
+            state.mapping.push(NodeIndex::end());
+            state.out.push(0);
+            if Ty::is_directed() {
+                state.ins.push(0);
+            }
+        }
+        state
+    }
+
+    /// Return **true** if we have a complete mapping
+    pub fn is_complete(&self) -> bool {
+        self.generation == self.mapping.len()
+    }
+
+    /// Add mapping **from** <-> **to** to the state.
+    pub fn push_mapping<N, E>(&mut self, from: NodeIndex<Ix>, to: NodeIndex<Ix>,
+                              g: &Graph<N, E, Ty, Ix>)
+    {
+        self.generation += 1;
+        let s = self.generation;
+        self.mapping[from.index()] = to;
+        // update T0 & T1 ins/outs
+        // T0out: Node in G0 not in M0 but successor of a node in M0.
+        // st.out[0]: Node either in M0 or successor of M0
+        for ix in g.neighbors(from) {
+            if self.out[ix.index()] == 0 {
+                self.out[ix.index()] = s;
+                self.out_size += 1;
+            }
+        }
+        if g.is_directed() {
+            for ix in g.neighbors_directed(from, Incoming) {
+                if self.ins[ix.index()] == 0 {
+                    self.ins[ix.index()] = s;
+                    self.ins_size += 1;
+                }
+            }
+        }
+    }
+
+    /// Restore the state to before the last added mapping
+    pub fn pop_mapping<N, E>(&mut self, from: NodeIndex<Ix>,
+                             g: &Graph<N, E, Ty, Ix>)
+    {
+        let s = self.generation;
+        self.generation -= 1;
+
+        // undo (n, m) mapping
+        self.mapping[from.index()] = NodeIndex::end();
+
+        // unmark in ins and outs
+        for ix in g.neighbors(from) {
+            if self.out[ix.index()] == s {
+                self.out[ix.index()] = 0;
+                self.out_size -= 1;
+            }
+        }
+        if g.is_directed() {
+            for ix in g.neighbors_directed(from, Incoming) {
+                if self.ins[ix.index()] == s {
+                    self.ins[ix.index()] = 0;
+                    self.ins_size -= 1;
+                }
+            }
+        }
+    }
+
+    /// Find the next (least) node in the Tout set.
+    pub fn next_out_index(&self, from_index: usize) -> Option<usize>
+    {
+        self.out[from_index..].iter()
+                    .enumerate()
+                    .find(move |&(index, elt)| *elt > 0 &&
+                          self.mapping[from_index + index] == NodeIndex::end())
+                    .map(|(index, _)| index)
+    }
+
+    /// Find the next (least) node in the Tin set.
+    pub fn next_in_index(&self, from_index: usize) -> Option<usize>
+    {
+        if !Ty::is_directed() {
+            return None
+        }
+        self.ins[from_index..].iter()
+                    .enumerate()
+                    .find(move |&(index, elt)| *elt > 0
+                          && self.mapping[from_index + index] == NodeIndex::end())
+                    .map(|(index, _)| index)
+    }
+
+    /// Find the next (least) node in the N - M set.
+    pub fn next_rest_index(&self, from_index: usize) -> Option<usize>
+    {
+        self.mapping[from_index..].iter()
+               .enumerate()
+               .find(|&(_, elt)| *elt == NodeIndex::end())
+               .map(|(index, _)| index)
+    }
+}
+
+
+/// [Graph] Return `true` if the graphs `g0` and `g1` are isomorphic.
+///
+/// Using the VF2 algorithm, only matching graph syntactically (graph
+/// structure).
+///
+/// The graphs should not be multigraphs.
+///
+/// **Reference**
+///
+/// * Luigi P. Cordella, Pasquale Foggia, Carlo Sansone, Mario Vento;
+///   *A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs*
+pub fn is_isomorphic<N, E, Ty, Ix>(g0: &Graph<N, E, Ty, Ix>,
+                                   g1: &Graph<N, E, Ty, Ix>) -> bool
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() {
+        return false
+    }
+
+    let mut st = [Vf2State::new(g0), Vf2State::new(g1)];
+    try_match(&mut st, g0, g1, &mut NoSemanticMatch, &mut NoSemanticMatch).unwrap_or(false)
+}
+
+/// [Graph] Return `true` if the graphs `g0` and `g1` are isomorphic.
+///
+/// Using the VF2 algorithm, examining both syntactic and semantic
+/// graph isomorphism (graph structure and matching node and edge weights).
+///
+/// The graphs should not be multigraphs.
+pub fn is_isomorphic_matching<N, E, Ty, Ix, F, G>(g0: &Graph<N, E, Ty, Ix>,
+                                                  g1: &Graph<N, E, Ty, Ix>,
+                                                  mut node_match: F,
+                                                  mut edge_match: G) -> bool
+    where Ty: EdgeType,
+          Ix: IndexType,
+          F: FnMut(&N, &N) -> bool,
+          G: FnMut(&E, &E) -> bool,
+{
+    if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() {
+        return false
+    }
+
+    let mut st = [Vf2State::new(g0), Vf2State::new(g1)];
+    try_match(&mut st, g0, g1, &mut node_match, &mut edge_match).unwrap_or(false)
+}
+
+trait SemanticMatcher<T> {
+    fn enabled() -> bool;
+    fn eq(&mut self, &T, &T) -> bool;
+}
+
+struct NoSemanticMatch;
+
+impl<T> SemanticMatcher<T> for NoSemanticMatch {
+    #[inline]
+    fn enabled() -> bool { false }
+    #[inline]
+    fn eq(&mut self, _: &T, _: &T) -> bool { true }
+}
+
+impl<T, F> SemanticMatcher<T> for F where F: FnMut(&T, &T) -> bool {
+    #[inline]
+    fn enabled() -> bool { true }
+    #[inline]
+    fn eq(&mut self, a: &T, b: &T) -> bool { self(a, b) }
+}
+
+/// Return Some(bool) if isomorphism is decided, else None.
+fn try_match<N, E, Ty, Ix, F, G>(st: &mut [Vf2State<Ty, Ix>; 2],
+                                 g0: &Graph<N, E, Ty, Ix>,
+                                 g1: &Graph<N, E, Ty, Ix>,
+                                 node_match: &mut F,
+                                 edge_match: &mut G)
+    -> Option<bool>
+    where Ty: EdgeType,
+          Ix: IndexType,
+          F: SemanticMatcher<N>,
+          G: SemanticMatcher<E>,
+{
+    let g = [g0, g1];
+    let graph_indices = 0..2;
+    let end = NodeIndex::end();
+
+    // if all are mapped -- we are done and have an iso
+    if st[0].is_complete() {
+        return Some(true)
+    }
+
+    // A "depth first" search of a valid mapping from graph 1 to graph 2
+
+    // F(s, n, m) -- evaluate state s and add mapping n <-> m
+
+    // Find least T1out node (in st.out[1] but not in M[1])
+    #[derive(Copy, Clone, PartialEq, Debug)]
+    enum OpenList {
+        Out,
+        In,
+        Other,
+    }
+    let mut open_list = OpenList::Out;
+
+    let mut to_index;
+    let mut from_index = None;
+    // Try the out list
+    to_index = st[1].next_out_index(0);
+
+    if to_index.is_some() {
+        from_index = st[0].next_out_index(0);
+        open_list = OpenList::Out;
+    }
+
+    // Try the in list
+    if to_index.is_none() || from_index.is_none() {
+        to_index = st[1].next_in_index(0);
+
+        if to_index.is_some() {
+            from_index = st[0].next_in_index(0);
+            open_list = OpenList::In;
+        }
+    }
+
+    // Try the other list -- disconnected graph
+    if to_index.is_none() || from_index.is_none() {
+        to_index = st[1].next_rest_index(0);
+        if to_index.is_some() {
+            from_index = st[0].next_rest_index(0);
+            open_list = OpenList::Other;
+        }
+    }
+
+    let (cand0, cand1) = match (from_index, to_index) {
+        (Some(n), Some(m)) => (n, m),
+        // No more candidates
+        _ => return None,
+    };
+
+    let mut nx = NodeIndex::new(cand0);
+    let mx = NodeIndex::new(cand1);
+
+    let mut first = true;
+
+    'candidates: loop {
+        if !first {
+            // Find the next node index to try on the `from` side of the mapping
+            let start = nx.index() + 1;
+            let cand0 = match open_list {
+                OpenList::Out => st[0].next_out_index(start),
+                OpenList::In => st[0].next_in_index(start),
+                OpenList::Other => st[0].next_rest_index(start),
+            }.map(|c| c + start); // compensate for start offset.
+            nx = match cand0 {
+                None => break, // no more candidates
+                Some(ix) => NodeIndex::new(ix),
+            };
+            debug_assert!(nx.index() >= start);
+        }
+        first = false;
+
+        let nodes = [nx, mx];
+
+        // Check syntactic feasibility of mapping by ensuring adjacencies
+        // of nx map to adjacencies of mx.
+        //
+        // nx == map to => mx
+        //
+        // R_succ
+        //
+        // Check that every neighbor of nx is mapped to a neighbor of mx,
+        // then check the reverse, from mx to nx. Check that they have the same
+        // count of edges.
+        //
+        // Note: We want to check the lookahead measures here if we can,
+        // R_out: Equal for G0, G1: Card(Succ(G, n) ^ Tout); for both Succ and Pred
+        // R_in: Same with Tin
+        // R_new: Equal for G0, G1: Ñ n Pred(G, n); both Succ and Pred,
+        //      Ñ is G0 - M - Tin - Tout
+        // last attempt to add these did not speed up any of the testcases
+        let mut succ_count = [0, 0];
+        for j in graph_indices.clone() {
+            for n_neigh in g[j].neighbors(nodes[j]) {
+                succ_count[j] += 1;
+                // handle the self loop case; it's not in the mapping (yet)
+                let m_neigh = if nodes[j] != n_neigh {
+                    st[j].mapping[n_neigh.index()]
+                } else {
+                    nodes[1 - j]
+                };
+                if m_neigh == end {
+                    continue;
+                }
+                let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, nodes[1-j], m_neigh);
+                if !has_edge {
+                    continue 'candidates;
+                }
+            }
+        }
+        if succ_count[0] != succ_count[1] {
+            continue 'candidates;
+        }
+
+        // R_pred
+        if g[0].is_directed() {
+            let mut pred_count = [0, 0];
+            for j in graph_indices.clone() {
+                for n_neigh in g[j].neighbors_directed(nodes[j], Incoming) {
+                    pred_count[j] += 1;
+                    // the self loop case is handled in outgoing
+                    let m_neigh = st[j].mapping[n_neigh.index()];
+                    if m_neigh == end {
+                        continue;
+                    }
+                    let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, m_neigh, nodes[1-j]);
+                    if !has_edge {
+                        continue 'candidates;
+                    }
+                }
+            }
+            if pred_count[0] != pred_count[1] {
+                continue 'candidates;
+            }
+        }
+
+        // semantic feasibility: compare associated data for nodes
+        if F::enabled() && !node_match.eq(&g[0][nodes[0]], &g[1][nodes[1]]) {
+            continue 'candidates;
+        }
+
+        // semantic feasibility: compare associated data for edges
+        if G::enabled() {
+            // outgoing edges
+            for j in graph_indices.clone() {
+                let mut edges = g[j].neighbors(nodes[j]).detach();
+                while let Some((n_edge, n_neigh)) = edges.next(g[j]) {
+                    // handle the self loop case; it's not in the mapping (yet)
+                    let m_neigh = if nodes[j] != n_neigh {
+                        st[j].mapping[n_neigh.index()]
+                    } else {
+                        nodes[1 - j]
+                    };
+                    if m_neigh == end {
+                        continue;
+                    }
+                    match g[1-j].find_edge(nodes[1 - j], m_neigh) {
+                        Some(m_edge) => {
+                            if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) {
+                                continue 'candidates;
+                            }
+                        }
+                        None => unreachable!() // covered by syntactic check
+                    }
+                }
+            }
+
+            // incoming edges
+            if g[0].is_directed() {
+                for j in graph_indices.clone() {
+                    let mut edges = g[j].neighbors_directed(nodes[j], Incoming).detach();
+                    while let Some((n_edge, n_neigh)) = edges.next(g[j]) {
+                        // the self loop case is handled in outgoing
+                        let m_neigh = st[j].mapping[n_neigh.index()];
+                        if m_neigh == end {
+                            continue;
+                        }
+                        match g[1-j].find_edge(m_neigh, nodes[1-j]) {
+                            Some(m_edge) => {
+                                if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) {
+                                    continue 'candidates;
+                                }
+                            }
+                            None => unreachable!() // covered by syntactic check
+                        }
+                    }
+                }
+            }
+        }
+
+        // Add mapping nx <-> mx to the state
+        for j in graph_indices.clone() {
+            st[j].push_mapping(nodes[j], nodes[1-j], g[j]);
+        }
+
+        // Check cardinalities of Tin, Tout sets
+        if st[0].out_size == st[1].out_size &&
+           st[0].ins_size == st[1].ins_size
+        {
+
+            // Recurse
+            match try_match(st, g0, g1, node_match, edge_match) {
+                None => {}
+                result => return result,
+            }
+        }
+
+        // Restore state.
+        for j in graph_indices.clone() {
+            st[j].pop_mapping(nodes[j], g[j]);
+        }
+    }
+    None
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/iter_format.rs
@@ -0,0 +1,100 @@
+//! Formatting utils
+
+use std::cell::RefCell;
+use std::fmt;
+
+/// Format the iterator like a map
+pub struct DebugMap<F>(pub F);
+
+impl<'a, F, I, K, V> fmt::Debug for DebugMap<F>
+    where F: Fn() -> I,
+          I: IntoIterator<Item=(K, V)>,
+          K: fmt::Debug,
+          V: fmt::Debug,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_map()
+         .entries((self.0)())
+         .finish()
+    }
+}
+
+/// Avoid "pretty" debug
+pub struct NoPretty<T>(pub T);
+
+impl<T> fmt::Debug for NoPretty<T>
+    where T: fmt::Debug,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:?}", self.0)
+    }
+}
+
+/// Format all iterator elements lazily, separated by `sep`.
+///
+/// The format value can only be formatted once, after that the iterator is
+/// exhausted.
+///
+/// See [`.format()`](../trait.Itertools.html#method.format)
+/// for more information.
+#[derive(Clone)]
+pub struct Format<'a, I> {
+    sep: &'a str,
+    /// Format uses interior mutability because Display::fmt takes &self.
+    inner: RefCell<Option<I>>,
+}
+
+pub trait IterFormatExt : Iterator {
+    fn format(self, separator: &str) -> Format<Self>
+        where Self: Sized
+    {
+        Format {
+            sep: separator,
+            inner: RefCell::new(Some(self)),
+        }
+    }
+}
+
+impl<I> IterFormatExt for I where I: Iterator { }
+
+
+impl<'a, I> Format<'a, I>
+    where I: Iterator,
+{
+    fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result
+        where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result,
+    {
+        let mut iter = match self.inner.borrow_mut().take() {
+            Some(t) => t,
+            None => panic!("Format: was already formatted once"),
+        };
+
+        if let Some(fst) = iter.next() {
+            try!(cb(&fst, f));
+            for elt in iter {
+                if !self.sep.is_empty() {
+                    try!(f.write_str(self.sep));
+                }
+                try!(cb(&elt, f));
+            }
+        }
+        Ok(())
+    }
+}
+
+macro_rules! impl_format {
+    ($($fmt_trait:ident)*) => {
+        $(
+            impl<'a, I> fmt::$fmt_trait for Format<'a, I>
+                where I: Iterator,
+                      I::Item: fmt::$fmt_trait,
+            {
+                fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                    self.format(f, fmt::$fmt_trait::fmt)
+                }
+            }
+        )*
+    }
+}
+
+impl_format!(Debug);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/iter_utils.rs
@@ -0,0 +1,31 @@
+
+pub trait IterUtilsExt : Iterator {
+    /// Return the first element that maps to `Some(_)`, or None if the iterator
+    /// was exhausted.
+    fn find_map<F, R>(&mut self, mut f: F) -> Option<R>
+        where F: FnMut(Self::Item) -> Option<R>
+    {
+        while let Some(elt) = self.next() {
+            if let result @ Some(_) = f(elt) {
+                return result;
+            }
+        }
+        None
+    }
+
+    /// Return the last element from the back that maps to `Some(_)`, or
+    /// None if the iterator was exhausted.
+    fn rfind_map<F, R>(&mut self, mut f: F) -> Option<R>
+        where F: FnMut(Self::Item) -> Option<R>,
+              Self: DoubleEndedIterator,
+    {
+        while let Some(elt) = self.next_back() {
+            if let result @ Some(_) = f(elt) {
+                return result;
+            }
+        }
+        None
+    }
+}
+
+impl<I> IterUtilsExt for I where I: Iterator { }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/lib.rs
@@ -0,0 +1,225 @@
+
+//! **petgraph** is a graph data structure library.
+//!
+//! - [`Graph`](./graph/struct.Graph.html) which is an adjacency list graph with
+//! arbitrary associated data.
+//!
+//! - [`StableGraph`](./stable_graph/struct.StableGraph.html) is similar
+//! to `Graph`, but it keeps indices stable across removals.
+//!
+//! - [`GraphMap`](./graphmap/struct.GraphMap.html) is an adjacency list graph
+//! which is backed by a hash table and the node identifiers are the keys
+//! into the table.
+//!
+//! Optional crate feature: `"serde-1"`, see the Readme for more information.
+//!
+#![doc(html_root_url = "https://docs.rs/petgraph/0.4/")]
+
+extern crate fixedbitset;
+#[cfg(feature = "graphmap")]
+extern crate ordermap;
+
+#[cfg(feature = "serde-1")]
+extern crate serde;
+#[cfg(feature = "serde-1")]
+#[macro_use]
+extern crate serde_derive;
+
+#[cfg(all(feature = "serde-1", test))]
+extern crate itertools;
+
+#[doc(no_inline)]
+pub use graph::Graph;
+
+pub use Direction::{Outgoing, Incoming};
+
+#[macro_use]
+mod macros;
+mod scored;
+
+// these modules define trait-implementing macros
+#[macro_use]
+pub mod visit;
+#[macro_use]
+pub mod data;
+
+pub mod algo;
+#[cfg(feature = "generate")]
+pub mod generate;
+#[cfg(feature = "graphmap")]
+pub mod graphmap;
+mod graph_impl;
+pub mod dot;
+pub mod unionfind;
+mod dijkstra;
+mod astar;
+pub mod csr;
+mod iter_format;
+mod iter_utils;
+mod isomorphism;
+mod traits_graph;
+mod util;
+#[cfg(feature = "quickcheck")]
+mod quickcheck;
+#[cfg(feature = "serde-1")]
+mod serde_utils;
+
+pub mod prelude;
+
+/// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation.
+pub mod graph {
+    pub use graph_impl::{
+        Edge,
+        EdgeIndex,
+        EdgeIndices,
+        EdgeReference,
+        EdgeReferences,
+        EdgeWeightsMut,
+        Edges,
+        Externals,
+        Frozen,
+        Graph,
+        Neighbors,
+        Node,
+        NodeIndex,
+        NodeIndices,
+        NodeWeightsMut,
+        NodeReferences,
+        WalkNeighbors,
+        GraphIndex,
+        IndexType,
+        edge_index,
+        node_index,
+        DefaultIx,
+        DiGraph,
+        UnGraph,
+    };
+}
+
+#[cfg(feature = "stable_graph")]
+pub use graph_impl::stable_graph;
+
+macro_rules! copyclone {
+    ($name:ident) => {
+        impl Clone for $name {
+            #[inline]
+            fn clone(&self) -> Self { *self }
+        }
+    }
+}
+
+// Index into the NodeIndex and EdgeIndex arrays
+/// Edge direction.
+#[derive(Copy, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)]
+#[repr(usize)]
+pub enum Direction {
+    /// An `Outgoing` edge is an outward edge *from* the current node.
+    Outgoing = 0,
+    /// An `Incoming` edge is an inbound edge *to* the current node.
+    Incoming = 1
+}
+
+copyclone!(Direction);
+
+impl Direction {
+    /// Return the opposite `Direction`.
+    #[inline]
+    pub fn opposite(&self) -> Direction {
+        match *self {
+            Outgoing => Incoming,
+            Incoming => Outgoing,
+        }
+    }
+
+    /// Return `0` for `Outgoing` and `1` for `Incoming`.
+    #[inline]
+    pub fn index(&self) -> usize {
+        (*self as usize) & 0x1
+    }
+}
+
+#[doc(hidden)]
+pub use Direction as EdgeDirection;
+
+/// Marker type for a directed graph.
+#[derive(Copy, Debug)]
+pub enum Directed { }
+copyclone!(Directed);
+
+/// Marker type for an undirected graph.
+#[derive(Copy, Debug)]
+pub enum Undirected { }
+copyclone!(Undirected);
+
+/// A graph's edge type determines whether is has directed edges or not.
+pub trait EdgeType {
+    fn is_directed() -> bool;
+}
+
+impl EdgeType for Directed {
+    #[inline]
+    fn is_directed() -> bool { true }
+}
+
+impl EdgeType for Undirected {
+    #[inline]
+    fn is_directed() -> bool { false }
+}
+
+
+/// Convert an element like `(i, j)` or `(i, j, w)` into
+/// a triple of source, target, edge weight.
+///
+/// For `Graph::from_edges` and `GraphMap::from_edges`.
+pub trait IntoWeightedEdge<E> {
+    type NodeId;
+    fn into_weighted_edge(self) -> (Self::NodeId, Self::NodeId, E);
+}
+
+impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix)
+    where E: Default
+{
+    type NodeId = Ix;
+
+    fn into_weighted_edge(self) -> (Ix, Ix, E) {
+        let (s, t) = self;
+        (s, t, E::default())
+    }
+}
+
+impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix, E)
+{
+    type NodeId = Ix;
+    fn into_weighted_edge(self) -> (Ix, Ix, E) {
+        self
+    }
+}
+
+impl<'a, Ix, E> IntoWeightedEdge<E> for (Ix, Ix, &'a E)
+    where E: Clone
+{
+    type NodeId = Ix;
+    fn into_weighted_edge(self) -> (Ix, Ix, E) {
+        let (a, b, c) = self;
+        (a, b, c.clone())
+    }
+}
+
+impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix)
+    where Ix: Copy, E: Default
+{
+    type NodeId = Ix;
+    fn into_weighted_edge(self) -> (Ix, Ix, E) {
+        let (s, t) = *self;
+        (s, t, E::default())
+    }
+}
+
+impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix, E)
+    where Ix: Copy, E: Clone
+{
+    type NodeId = Ix;
+    fn into_weighted_edge(self) -> (Ix, Ix, E) {
+        self.clone()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/macros.rs
@@ -0,0 +1,13 @@
+
+macro_rules! clone_fields {
+    ($name:ident, $($field:ident),+ $(,)*) => (
+        fn clone(&self) -> Self {
+            $name {
+                $(
+                    $field : self . $field .clone()
+                ),*
+            }
+        }
+    );
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/prelude.rs
@@ -0,0 +1,48 @@
+
+//! Commonly used items.
+//!
+//! ```
+//! use petgraph::prelude::*;
+//! ```
+
+#[doc(no_inline)]
+pub use graph::{
+    Graph,
+    NodeIndex,
+    EdgeIndex,
+    DiGraph,
+    UnGraph,
+};
+#[cfg(feature = "graphmap")]
+#[doc(no_inline)]
+pub use graphmap::{
+    GraphMap,
+    DiGraphMap,
+    UnGraphMap,
+};
+#[doc(no_inline)]
+#[cfg(feature = "stable_graph")]
+pub use stable_graph::{
+    StableGraph,
+    StableDiGraph,
+    StableUnGraph,
+};
+#[doc(no_inline)]
+pub use visit::{
+    Bfs,
+    Dfs,
+    DfsPostOrder,
+};
+#[doc(no_inline)]
+pub use ::{
+    Direction,
+    Incoming,
+    Outgoing,
+    Directed,
+    Undirected,
+};
+
+#[doc(no_inline)]
+pub use visit::{
+    EdgeRef,
+};
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/quickcheck.rs
@@ -0,0 +1,208 @@
+extern crate quickcheck;
+
+use self::quickcheck::{Gen, Arbitrary};
+
+use {
+    Graph,
+    EdgeType,
+};
+use graph::{
+    IndexType,
+    node_index,
+};
+#[cfg(feature = "stable_graph")]
+use stable_graph::StableGraph;
+
+#[cfg(feature = "graphmap")]
+use graphmap::{
+    GraphMap,
+    NodeTrait,
+};
+use visit::NodeIndexable;
+
+/// `Arbitrary` for `Graph` creates a graph by selecting a node count
+/// and a probability for each possible edge to exist.
+///
+/// The result will be simple graph or digraph, self loops
+/// possible, no parallel edges.
+///
+/// The exact properties of the produced graph is subject to change.
+///
+/// Requires crate feature `"quickcheck"`
+impl<N, E, Ty, Ix> Arbitrary for Graph<N, E, Ty, Ix>
+    where N: Arbitrary,
+          E: Arbitrary,
+          Ty: EdgeType + Send + 'static,
+          Ix: IndexType + Send,
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let nodes = usize::arbitrary(g);
+        if nodes == 0 {
+            return Graph::with_capacity(0, 0);
+        }
+        // use X² for edge probability (bias towards lower)
+        let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.);
+        let edges = ((nodes as f64).powi(2) * edge_prob) as usize;
+        let mut gr = Graph::with_capacity(nodes, edges);
+        for _ in 0..nodes {
+            gr.add_node(N::arbitrary(g));
+        }
+        for i in gr.node_indices() {
+            for j in gr.node_indices() {
+                if !gr.is_directed() && i > j {
+                    continue;
+                }
+                let p: f64 = g.gen();
+                if p <= edge_prob {
+                    gr.add_edge(i, j, E::arbitrary(g));
+                }
+            }
+        }
+        gr
+    }
+
+    // shrink the graph by splitting it in two by a very
+    // simple algorithm, just even and odd node indices
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        let self_ = self.clone();
+        Box::new((0..2).filter_map(move |x| {
+            let gr = self_.filter_map(|i, w| {
+                if i.index() % 2 == x {
+                    Some(w.clone())
+                } else {
+                    None
+                }
+            },
+            |_, w| Some(w.clone())
+            );
+            // make sure we shrink
+            if gr.node_count() < self_.node_count() {
+                Some(gr)
+            } else {
+                None
+            }
+        }))
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+/// `Arbitrary` for `StableGraph` creates a graph by selecting a node count
+/// and a probability for each possible edge to exist.
+///
+/// The result will be simple graph or digraph, with possible
+/// self loops, no parallel edges.
+///
+/// The exact properties of the produced graph is subject to change.
+///
+/// Requires crate features `"quickcheck"` and `"stable_graph"`
+impl<N, E, Ty, Ix> Arbitrary for StableGraph<N, E, Ty, Ix>
+    where N: Arbitrary,
+          E: Arbitrary,
+          Ty: EdgeType + Send + 'static,
+          Ix: IndexType + Send,
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let nodes = usize::arbitrary(g);
+        if nodes == 0 {
+            return StableGraph::with_capacity(0, 0);
+        }
+        // use X² for edge probability (bias towards lower)
+        let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.);
+        let edges = ((nodes as f64).powi(2) * edge_prob) as usize;
+        let mut gr = StableGraph::with_capacity(nodes, edges);
+        for _ in 0..nodes {
+            gr.add_node(N::arbitrary(g));
+        }
+        for i in 0..gr.node_count() {
+            for j in 0..gr.node_count() {
+                let i = node_index(i);
+                let j = node_index(j);
+                if !gr.is_directed() && i > j {
+                    continue;
+                }
+                let p: f64 = g.gen();
+                if p <= edge_prob {
+                    gr.add_edge(i, j, E::arbitrary(g));
+                }
+            }
+        }
+        if bool::arbitrary(g) {
+            // potentially remove nodes to make holes in nodes & edge sets
+            let n = u8::arbitrary(g) % (gr.node_count() as u8);
+            for _ in 0..n {
+                let ni = node_index(usize::arbitrary(g) % gr.node_bound());
+                if gr.node_weight(ni).is_some() {
+                    gr.remove_node(ni);
+                }
+            }
+        }
+        gr
+    }
+
+    // shrink the graph by splitting it in two by a very
+    // simple algorithm, just even and odd node indices
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        let self_ = self.clone();
+        Box::new((0..2).filter_map(move |x| {
+            let gr = self_.filter_map(|i, w| {
+                if i.index() % 2 == x {
+                    Some(w.clone())
+                } else {
+                    None
+                }
+            },
+            |_, w| Some(w.clone())
+            );
+            // make sure we shrink
+            if gr.node_count() < self_.node_count() {
+                Some(gr)
+            } else {
+                None
+            }
+        }))
+    }
+}
+
+/// `Arbitrary` for `GraphMap` creates a graph by selecting a node count
+/// and a probability for each possible edge to exist.
+///
+/// The result will be simple graph or digraph, self loops
+/// possible, no parallel edges.
+///
+/// The exact properties of the produced graph is subject to change.
+///
+/// Requires crate features `"quickcheck"` and `"graphmap"`
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> Arbitrary for GraphMap<N, E, Ty>
+    where N: NodeTrait + Arbitrary,
+          E: Arbitrary,
+          Ty: EdgeType + Clone + Send + 'static,
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let nodes = usize::arbitrary(g);
+        if nodes == 0 {
+            return GraphMap::with_capacity(0, 0);
+        }
+        let mut nodes = (0..nodes).map(|_| N::arbitrary(g)).collect::<Vec<_>>();
+        nodes.sort();
+        nodes.dedup();
+
+        // use X² for edge probability (bias towards lower)
+        let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.);
+        let edges = ((nodes.len() as f64).powi(2) * edge_prob) as usize;
+        let mut gr = GraphMap::with_capacity(nodes.len(), edges);
+        for &node in &nodes {
+            gr.add_node(node);
+        }
+        for (index, &i) in nodes.iter().enumerate() {
+            let js = if Ty::is_directed() { &nodes[..] } else { &nodes[index..] };
+            for &j in js {
+                let p: f64 = g.gen();
+                if p <= edge_prob {
+                    gr.add_edge(i, j, E::arbitrary(g));
+                }
+            }
+        }
+        gr
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/scored.rs
@@ -0,0 +1,53 @@
+use std::cmp::Ordering;
+
+/// `MinScored<K, T>` holds a score `K` and a scored object `T` in
+/// a pair for use with a `BinaryHeap`.
+///
+/// `MinScored` compares in reverse order by the score, so that we can
+/// use `BinaryHeap` as a min-heap to extract the score-value pair with the
+/// least score.
+///
+/// **Note:** `MinScored` implements a total order (`Ord`), so that it is
+/// possible to use float types as scores.
+#[derive(Copy, Clone, Debug)]
+pub struct MinScored<K, T>(pub K, pub T);
+
+impl<K: PartialOrd, T> PartialEq for MinScored<K, T> {
+    #[inline]
+    fn eq(&self, other: &MinScored<K, T>) -> bool {
+        self.cmp(other) == Ordering::Equal
+    }
+}
+
+impl<K: PartialOrd, T> Eq for MinScored<K, T> {}
+
+impl<K: PartialOrd, T> PartialOrd for MinScored<K, T> {
+    #[inline]
+    fn partial_cmp(&self, other: &MinScored<K, T>) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl<K: PartialOrd, T> Ord for MinScored<K, T> {
+    #[inline]
+    fn cmp(&self, other: &MinScored<K, T>) -> Ordering {
+        let a = &self.0;
+        let b = &other.0;
+        if a == b {
+            Ordering::Equal
+        } else if a < b {
+            Ordering::Greater
+        } else if a > b {
+            Ordering::Less
+        } else if a != a && b != b {
+            // these are the NaN cases
+            Ordering::Equal
+        } else if a != a {
+            // Order NaN less, so that it is last in the MinScore order
+            Ordering::Less
+        } else {
+            Ordering::Greater
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/serde_utils.rs
@@ -0,0 +1,92 @@
+use std::fmt;
+use std::marker::PhantomData;
+use serde::de::{Error, Visitor, Deserialize, SeqAccess};
+use serde::ser::{Serializer, SerializeSeq, Serialize};
+
+/// Map to serializeable representation
+pub trait IntoSerializable {
+    type Output;
+    fn into_serializable(self) -> Self::Output;
+}
+
+/// Map from deserialized representation
+pub trait FromDeserialized : Sized {
+    type Input;
+    fn from_deserialized<E>(input: Self::Input) -> Result<Self, E> where E: Error;
+}
+
+
+
+/// Serde combinator. A sequence visitor that maps deserialized elements
+/// lazily; the visitor can also emit new errors if the elements have errors.
+pub struct MappedSequenceVisitor<T, R, F>
+    where F: Fn(T) -> Result<R, &'static str>
+{
+    f: F,
+    marker: PhantomData<fn() -> T>
+}
+
+impl<'de, F, T, R> MappedSequenceVisitor<T, R, F> 
+    where T: Deserialize<'de>,
+          F: Fn(T) -> Result<R, &'static str>,
+{
+    pub fn new(f: F) -> Self {
+        MappedSequenceVisitor {
+            f: f,
+            marker: PhantomData,
+        }
+    }
+}
+
+impl<'de, F, T, R> Visitor<'de> for MappedSequenceVisitor<T, R, F> 
+    where T: Deserialize<'de>,
+          F: Fn(T) -> Result<R, &'static str>,
+{
+    type Value = Vec<R>;
+
+    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        write!(formatter, "a sequence")
+    }
+    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
+        where A: SeqAccess<'de>,
+    {
+        let mut v = Vec::new();
+        while let Some(elem) = seq.next_element()? {
+            match (self.f)(elem) {
+                Err(s) => Err(<A::Error>::custom(s))?,
+                Ok(x) => v.push(x),
+            }
+        }
+        Ok(v)
+    }
+}
+
+
+pub trait CollectSeqWithLength : Serializer {
+    fn collect_seq_with_length<I>(self, length: usize, iterable: I)
+        -> Result<Self::Ok, Self::Error>
+        where I: IntoIterator,
+              I::Item: Serialize
+    {
+        let mut count = 0;
+        let mut seq = self.serialize_seq(Some(length))?;
+        for element in iterable {
+            seq.serialize_element(&element)?;
+            count += 1;
+        }
+        debug_assert_eq!(length, count, "collect_seq_with_length: length mismatch!");
+        seq.end()
+    }
+
+    fn collect_seq_exact<I>(self, iterable: I)
+        -> Result<Self::Ok, Self::Error>
+        where I: IntoIterator,
+              I::Item: Serialize,
+              I::IntoIter: ExactSizeIterator,
+    {
+        let iter = iterable.into_iter();
+        self.collect_seq_with_length(iter.len(), iter)
+    }
+}
+
+impl<S> CollectSeqWithLength for S where S: Serializer { }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/traits_graph.rs
@@ -0,0 +1,85 @@
+
+use fixedbitset::FixedBitSet;
+
+use super::{
+    EdgeType,
+};
+
+use super::graph::{
+    Graph,
+    IndexType,
+    NodeIndex,
+};
+#[cfg(feature = "stable_graph")]
+use stable_graph::StableGraph;
+#[cfg(feature = "stable_graph")]
+use visit::{NodeIndexable, IntoEdgeReferences};
+use visit::EdgeRef;
+
+use super::visit::GetAdjacencyMatrix;
+
+/// The adjacency matrix for **Graph** is a bitmap that's computed by
+/// `.adjacency_matrix()`.
+impl<N, E, Ty, Ix> GetAdjacencyMatrix for Graph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type AdjMatrix = FixedBitSet;
+
+    fn adjacency_matrix(&self) -> FixedBitSet
+    {
+        let n = self.node_count();
+        let mut matrix = FixedBitSet::with_capacity(n * n);
+        for edge in self.edge_references() {
+            let i = edge.source().index() * n + edge.target().index();
+            matrix.put(i);
+            if !self.is_directed() {
+                let j = edge.source().index() + n * edge.target().index();
+                matrix.put(j);
+            }
+        }
+        matrix
+    }
+
+    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool
+    {
+        let n = self.node_count();
+        let index = n * a.index() + b.index();
+        matrix.contains(index)
+    }
+}
+
+
+#[cfg(feature = "stable_graph")]
+/// The adjacency matrix for **Graph** is a bitmap that's computed by
+/// `.adjacency_matrix()`.
+impl<N, E, Ty, Ix> GetAdjacencyMatrix for StableGraph<N, E, Ty, Ix> where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+    type AdjMatrix = FixedBitSet;
+
+    fn adjacency_matrix(&self) -> FixedBitSet
+    {
+        let n = self.node_bound();
+        let mut matrix = FixedBitSet::with_capacity(n * n);
+        for edge in self.edge_references() {
+            let i = edge.source().index() * n + edge.target().index();
+            matrix.put(i);
+            if !self.is_directed() {
+                let j = edge.source().index() + n * edge.target().index();
+                matrix.put(j);
+            }
+        }
+        matrix
+    }
+
+    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool
+    {
+        let n = self.node_count();
+        let index = n * a.index() + b.index();
+        matrix.contains(index)
+    }
+}
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/unionfind.rs
@@ -0,0 +1,145 @@
+//! `UnionFind<K>` is a disjoint-set data structure.
+
+use super::graph::IndexType;
+
+/// `UnionFind<K>` is a disjoint-set data structure. It tracks set membership of *n* elements
+/// indexed from *0* to *n - 1*. The scalar type is `K` which must be an unsigned integer type.
+///
+/// <http://en.wikipedia.org/wiki/Disjoint-set_data_structure>
+///
+/// Too awesome not to quote:
+///
+/// “The amortized time per operation is **O(α(n))** where **α(n)** is the
+/// inverse of **f(x) = A(x, x)** with **A** being the extremely fast-growing Ackermann function.”
+#[derive(Debug, Clone)]
+pub struct UnionFind<K>
+{
+    // For element at index *i*, store the index of its parent; the representative itself
+    // stores its own index. This forms equivalence classes which are the disjoint sets, each
+    // with a unique representative.
+    parent: Vec<K>,
+    // It is a balancing tree structure,
+    // so the ranks are logarithmic in the size of the container -- a byte is more than enough.
+    //
+    // Rank is separated out both to save space and to save cache in when searching in the parent
+    // vector.
+    rank: Vec<u8>,
+}
+
+#[inline]
+unsafe fn get_unchecked<K>(xs: &[K], index: usize) -> &K
+{
+    debug_assert!(index < xs.len());
+    xs.get_unchecked(index)
+}
+
+impl<K> UnionFind<K>
+    where K: IndexType
+{
+    /// Create a new `UnionFind` of `n` disjoint sets.
+    pub fn new(n: usize) -> Self
+    {
+        let rank = vec![0; n];
+        let parent = (0..n).map(K::new).collect::<Vec<K>>();
+
+        UnionFind{parent: parent, rank: rank}
+    }
+
+    /// Return the representative for `x`.
+    ///
+    /// **Panics** if `x` is out of bounds.
+    pub fn find(&self, x: K) -> K
+    {
+        assert!(x.index() < self.parent.len());
+        unsafe {
+            let mut x = x;
+            loop {
+                // Use unchecked indexing because we can trust the internal set ids.
+                let xparent = *get_unchecked(&self.parent, x.index());
+                if xparent == x {
+                    break
+                }
+                x = xparent;
+            }
+            x
+        }
+    }
+
+    /// Return the representative for `x`.
+    ///
+    /// Write back the found representative, flattening the internal
+    /// datastructure in the process and quicken future lookups.
+    ///
+    /// **Panics** if `x` is out of bounds.
+    pub fn find_mut(&mut self, x: K) -> K
+    {
+        assert!(x.index() < self.parent.len());
+        unsafe {
+            self.find_mut_recursive(x)
+        }
+    }
+
+    unsafe fn find_mut_recursive(&mut self, x: K) -> K
+    {
+        let xparent = *get_unchecked(&self.parent, x.index());
+        if xparent != x {
+            let xrep = self.find_mut_recursive(xparent);
+            let xparent = self.parent.get_unchecked_mut(x.index());
+            *xparent = xrep;
+            *xparent
+        } else {
+            xparent
+        }
+    }
+
+
+    /// Unify the two sets containing `x` and `y`.
+    ///
+    /// Return `false` if the sets were already the same, `true` if they were unified.
+    /// 
+    /// **Panics** if `x` or `y` is out of bounds.
+    pub fn union(&mut self, x: K, y: K) -> bool
+    {
+        if x == y {
+            return false
+        }
+        let xrep = self.find_mut(x);
+        let yrep = self.find_mut(y);
+
+        if xrep == yrep {
+            return false
+        }
+
+        let xrepu = xrep.index();
+        let yrepu = yrep.index();
+        let xrank = self.rank[xrepu];
+        let yrank = self.rank[yrepu];
+
+        // The rank corresponds roughly to the depth of the treeset, so put the 
+        // smaller set below the larger
+        if xrank < yrank {
+            self.parent[xrepu] = yrep;
+        } else if xrank > yrank {
+            self.parent[yrepu] = xrep;
+        } else {
+            // put y below x when equal.
+            self.parent[yrepu] = xrep;
+            self.rank[xrepu] += 1;
+        }
+        true
+    }
+
+    /// Return a vector mapping each element to its representative.
+    pub fn into_labeling(mut self) -> Vec<K>
+    {
+        // write in the labeling of each element
+        unsafe {
+            for ix in 0..self.parent.len() {
+                let k = *get_unchecked(&self.parent, ix);
+                let xrep = self.find_mut_recursive(k);
+                *self.parent.get_unchecked_mut(ix) = xrep;
+            }
+        }
+        self.parent
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/util.rs
@@ -0,0 +1,23 @@
+
+use std::iter;
+
+pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter>
+    where I: IntoIterator
+{
+    iterable.into_iter().enumerate()
+}
+
+#[cfg(feature = "serde-1")]
+pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter>
+    where I: IntoIterator,
+          I::IntoIter: DoubleEndedIterator
+{
+    iterable.into_iter().rev()
+}
+
+pub fn zip<I, J>(i: I, j: J) -> iter::Zip<I::IntoIter, J::IntoIter>
+    where I: IntoIterator,
+          J: IntoIterator
+{
+    i.into_iter().zip(j)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/dfsvisit.rs
@@ -0,0 +1,195 @@
+
+
+use visit::IntoNeighbors;
+use visit::{VisitMap, Visitable};
+
+/// Strictly monotonically increasing event time for a depth first search.
+#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Default)]
+pub struct Time(pub usize);
+
+/// A depth first search (DFS) visitor event.
+#[derive(Copy, Clone, Debug)]
+pub enum DfsEvent<N> {
+    Discover(N, Time),
+    /// An edge of the tree formed by the traversal.
+    TreeEdge(N, N),
+    /// An edge to an already visited node.
+    BackEdge(N, N),
+    /// A cross or forward edge.
+    ///
+    /// For an edge *(u, v)*, if the discover time of *v* is greater than *u*,
+    /// then it is a forward edge, else a cross edge.
+    CrossForwardEdge(N, N),
+    Finish(N, Time),
+}
+
+/// Return if the expression is a break value.
+macro_rules! try_control {
+    ($e:expr) => {
+        match $e {
+            x => if x.should_break() {
+                return x;
+            }
+        }
+    }
+}
+
+/// Control flow for callbacks.
+///
+/// `Break` can carry a value.
+#[derive(Copy, Clone, Debug)]
+pub enum Control<B> {
+    Continue,
+    Break(B),
+}
+
+impl<B> Control<B> {
+    pub fn breaking() -> Control<()> { Control::Break(()) }
+    /// Get the value in `Control::Break(_)`, if present.
+    pub fn break_value(self) -> Option<B> {
+        match self {
+            Control::Continue => None,
+            Control::Break(b) => Some(b),
+        }
+    }
+}
+
+/// Control flow for callbacks.
+///
+/// The empty return value `()` is equivalent to continue.
+pub trait ControlFlow {
+    fn continuing() -> Self;
+    fn should_break(&self) -> bool;
+}
+
+impl ControlFlow for () {
+    fn continuing() { }
+    #[inline]
+    fn should_break(&self) -> bool { false }
+}
+
+impl<B> ControlFlow for Control<B> {
+    fn continuing() -> Self { Control::Continue }
+    fn should_break(&self) -> bool {
+        if let Control::Break(_) = *self { true } else { false }
+    }
+}
+
+impl<E> ControlFlow for Result<(), E> {
+    fn continuing() -> Self { Ok(()) }
+    fn should_break(&self) -> bool {
+        if let Err(_) = *self { true } else { false }
+    }
+}
+
+/// The default is `Continue`.
+impl<B> Default for Control<B> {
+    fn default() -> Self { Control::Continue }
+}
+
+/// A recursive depth first search.
+///
+/// Starting points are the nodes in the iterator `starts` (specify just one
+/// start vertex *x* by using `Some(x)`).
+///
+/// The traversal emits discovery and finish events for each reachable vertex,
+/// and edge classification of each reachable edge. `visitor` is called for each
+/// event, see [`DfsEvent`][de] for possible values.
+///
+/// If the return value of the visitor is simply `()`, the visit runs until it
+/// is finished. If the return value is a `Control<B>`, it can be used to
+/// break the visit early, and the last control value is returned by the
+/// function.
+///
+/// [de]: enum.DfsEvent.html
+///
+/// # Example
+///
+/// Find a path from vertex 0 to 5, and exit the visit as soon as we reach
+/// the goal vertex.
+///
+/// ```
+/// use petgraph::prelude::*;
+/// use petgraph::graph::node_index as n;
+/// use petgraph::visit::depth_first_search;
+/// use petgraph::visit::{DfsEvent, Control};
+///
+/// let gr: Graph<(), ()> = Graph::from_edges(&[
+///     (0, 1), (0, 2), (0, 3),
+///     (1, 3),
+///     (2, 3), (2, 4),
+///     (4, 0), (4, 5),
+/// ]);
+///
+/// // record each predecessor, mapping node → node
+/// let mut predecessor = vec![NodeIndex::end(); gr.node_count()];
+/// let start = n(0);
+/// let goal = n(5);
+/// depth_first_search(&gr, Some(start), |event| {
+///     if let DfsEvent::TreeEdge(u, v) = event {
+///         predecessor[v.index()] = u;
+///         if v == goal {
+///             return Control::Break(v);
+///         }
+///     }
+///     Control::Continue
+/// });
+///
+/// let mut next = goal;
+/// let mut path = vec![next];
+/// while next != start {
+///     let pred = predecessor[next.index()];
+///     path.push(pred);
+///     next = pred;
+/// }
+/// path.reverse();
+/// assert_eq!(&path, &[n(0), n(2), n(4), n(5)]);
+/// ```
+pub fn depth_first_search<G, I, F, C>(graph: G, starts: I, mut visitor: F) -> C
+    where G: IntoNeighbors + Visitable,
+          I: IntoIterator<Item=G::NodeId>,
+          F: FnMut(DfsEvent<G::NodeId>) -> C,
+          C: ControlFlow,
+{
+    let time = &mut Time(0);
+    let discovered = &mut graph.visit_map();
+    let finished = &mut graph.visit_map();
+
+    for start in starts {
+        try_control!(dfs_visitor(graph, start, &mut visitor, discovered, finished, time));
+    }
+    C::continuing()
+}
+
+fn dfs_visitor<G, F, C>(graph: G, u: G::NodeId, visitor: &mut F,
+                     discovered: &mut G::Map, finished: &mut G::Map,
+                     time: &mut Time) -> C
+    where G: IntoNeighbors + Visitable,
+          F: FnMut(DfsEvent<G::NodeId>) -> C,
+          C: ControlFlow,
+{
+    if !discovered.visit(u) {
+        return C::continuing();
+    }
+    try_control!(visitor(DfsEvent::Discover(u, time_post_inc(time))));
+    for v in graph.neighbors(u) {
+        if !discovered.is_visited(&v) {
+            try_control!(visitor(DfsEvent::TreeEdge(u, v)));
+            try_control!(dfs_visitor(graph, v, visitor, discovered, finished, time));
+        } else if !finished.is_visited(&v) {
+            try_control!(visitor(DfsEvent::BackEdge(u, v)));
+        } else {
+            try_control!(visitor(DfsEvent::CrossForwardEdge(u, v)));
+        }
+    }
+    let first_finish = finished.visit(u);
+    debug_assert!(first_finish);
+    try_control!(visitor(DfsEvent::Finish(u, time_post_inc(time))));
+    C::continuing()
+}
+
+fn time_post_inc(x: &mut Time) -> Time {
+    let v = *x;
+    x.0 += 1;
+    v
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/filter.rs
@@ -0,0 +1,419 @@
+
+use prelude::*;
+
+use fixedbitset::FixedBitSet;
+use std::collections::HashSet;
+use std::marker::PhantomData;
+
+use visit::{
+    GraphBase,
+    GraphProp,
+    IntoEdgeReferences,
+    IntoEdges,
+    IntoNeighbors,
+    IntoNeighborsDirected,
+    IntoNodeIdentifiers,
+    IntoNodeReferences,
+    NodeIndexable,
+    NodeRef,
+    VisitMap,
+    Visitable,
+};
+use visit::{Data, NodeCompactIndexable, NodeCount};
+use data::{DataMap};
+
+/// A graph filter for nodes.
+pub trait FilterNode<N>
+{
+    /// Return true to have the node be part of the graph
+    fn include_node(&self, node: N) -> bool;
+}
+
+impl<F, N> FilterNode<N> for F
+    where F: Fn(N) -> bool,
+{
+    fn include_node(&self, n: N) -> bool {
+        (*self)(n)
+    }
+}
+
+/// This filter includes the nodes that are contained in the set.
+impl<N> FilterNode<N> for FixedBitSet
+    where FixedBitSet: VisitMap<N>,
+{
+    fn include_node(&self, n: N) -> bool {
+        self.is_visited(&n)
+    }
+}
+
+/// This filter includes the nodes that are contained in the set.
+impl<N, S> FilterNode<N> for HashSet<N, S>
+    where HashSet<N, S>: VisitMap<N>,
+{
+    fn include_node(&self, n: N) -> bool {
+        self.is_visited(&n)
+    }
+}
+
+/// A node-filtering graph adaptor.
+#[derive(Copy, Clone, Debug)]
+pub struct NodeFiltered<G, F>(pub G, pub F);
+
+impl<F, G> NodeFiltered<G, F>
+    where G: GraphBase,
+          F: Fn(G::NodeId) -> bool,
+{
+    /// Create an `NodeFiltered` adaptor from the closure `filter`.
+    pub fn from_fn(graph: G, filter: F) -> Self {
+        NodeFiltered(graph, filter)
+    }
+}
+
+impl<G, F> GraphBase for NodeFiltered<G, F> where G: GraphBase {
+    type NodeId = G::NodeId;
+    type EdgeId = G::EdgeId;
+}
+
+impl<'a, G, F> IntoNeighbors for &'a NodeFiltered<G, F>
+    where G: IntoNeighbors,
+          F: FilterNode<G::NodeId>,
+{
+    type Neighbors = NodeFilteredNeighbors<'a, G::Neighbors, F>;
+    fn neighbors(self, n: G::NodeId) -> Self::Neighbors {
+        NodeFilteredNeighbors {
+            include_source: self.1.include_node(n),
+            iter: self.0.neighbors(n),
+            f: &self.1,
+        }
+    }
+}
+
+/// A filtered neighbors iterator.
+pub struct NodeFilteredNeighbors<'a, I, F: 'a>
+{
+    include_source: bool,
+    iter: I,
+    f: &'a F,
+}
+
+impl<'a, I, F> Iterator for NodeFilteredNeighbors<'a, I, F>
+    where I: Iterator,
+          I::Item: Copy,
+          F: FilterNode<I::Item>,
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        let f = self.f;
+        if !self.include_source {
+            None
+        } else {
+            self.iter.find(move |&target| f.include_node(target))
+        }
+    }
+}
+
+impl<'a, G, F> IntoNeighborsDirected for &'a NodeFiltered<G, F>
+    where G: IntoNeighborsDirected,
+          F: FilterNode<G::NodeId>,
+{
+    type NeighborsDirected = NodeFilteredNeighbors<'a, G::NeighborsDirected, F>;
+    fn neighbors_directed(self, n: G::NodeId, dir: Direction)
+        -> Self::NeighborsDirected {
+        NodeFilteredNeighbors {
+            include_source: self.1.include_node(n),
+            iter: self.0.neighbors_directed(n, dir),
+            f: &self.1,
+        }
+    }
+}
+
+impl<'a, G, F> IntoNodeIdentifiers for &'a NodeFiltered<G, F>
+    where G: IntoNodeIdentifiers,
+          F: FilterNode<G::NodeId>,
+{
+    type NodeIdentifiers = NodeFilteredNeighbors<'a, G::NodeIdentifiers, F>;
+    fn node_identifiers(self) -> Self::NodeIdentifiers {
+        NodeFilteredNeighbors {
+            include_source: true,
+            iter: self.0.node_identifiers(),
+            f: &self.1,
+        }
+    }
+}
+
+impl<'a, G, F> IntoNodeReferences for &'a NodeFiltered<G, F>
+    where G: IntoNodeReferences,
+          F: FilterNode<G::NodeId>,
+{
+    type NodeRef = G::NodeRef;
+    type NodeReferences = NodeFilteredNodes<'a, G::NodeReferences, F>;
+    fn node_references(self) -> Self::NodeReferences {
+        NodeFilteredNodes {
+            include_source: true,
+            iter: self.0.node_references(),
+            f: &self.1,
+        }
+    }
+}
+
+/// A filtered node references iterator.
+pub struct NodeFilteredNodes<'a, I, F: 'a>
+{
+    include_source: bool,
+    iter: I,
+    f: &'a F,
+}
+
+impl<'a, I, F> Iterator for NodeFilteredNodes<'a, I, F>
+    where I: Iterator,
+          I::Item: Copy + NodeRef,
+          F: FilterNode<<I::Item as NodeRef>::NodeId>,
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        let f = self.f;
+        if !self.include_source {
+            None
+        } else {
+            self.iter.find(move |&target| f.include_node(target.id()))
+        }
+    }
+}
+
+impl<'a, G, F> IntoEdgeReferences for &'a NodeFiltered<G, F>
+    where G: IntoEdgeReferences,
+          F: FilterNode<G::NodeId>,
+{
+    type EdgeRef = G::EdgeRef;
+    type EdgeReferences = NodeFilteredEdgeReferences<'a, G, G::EdgeReferences, F>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        NodeFilteredEdgeReferences {
+            graph: PhantomData,
+            iter: self.0.edge_references(),
+            f: &self.1,
+        }
+    }
+}
+
+/// A filtered edges iterator.
+pub struct NodeFilteredEdgeReferences<'a, G, I, F: 'a>
+{
+    graph: PhantomData<G>,
+    iter: I,
+    f: &'a F,
+}
+
+impl<'a, G, I, F> Iterator for NodeFilteredEdgeReferences<'a, G, I, F>
+    where F: FilterNode<G::NodeId>,
+          G: IntoEdgeReferences,
+          I: Iterator<Item=G::EdgeRef>,
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        let f = self.f;
+        self.iter.find(move |&edge| f.include_node(edge.source()) &&
+                                    f.include_node(edge.target()))
+    }
+}
+
+impl<'a, G, F> IntoEdges for &'a NodeFiltered<G, F>
+    where G: IntoEdges,
+          F: FilterNode<G::NodeId>,
+{
+    type Edges = NodeFilteredEdges<'a, G, G::Edges, F>;
+    fn edges(self, a: G::NodeId) -> Self::Edges {
+        NodeFilteredEdges {
+            graph: PhantomData,
+            include_source: self.1.include_node(a),
+            iter: self.0.edges(a),
+            f: &self.1,
+        }
+    }
+}
+
+
+/// A filtered edges iterator.
+pub struct NodeFilteredEdges<'a, G, I, F: 'a>
+{
+    graph: PhantomData<G>,
+    include_source: bool,
+    iter: I,
+    f: &'a F,
+}
+
+
+impl<'a, G, I, F> Iterator for NodeFilteredEdges<'a, G, I, F>
+    where F: FilterNode<G::NodeId>,
+          G: IntoEdges,
+          I: Iterator<Item=G::EdgeRef>,
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        if !self.include_source {
+            None
+        } else {
+            let f = self.f;
+            self.iter.find(move |&edge| f.include_node(edge.target()))
+        }
+    }
+}
+
+impl<G, F> DataMap for NodeFiltered<G, F>
+    where G: DataMap,
+          F: FilterNode<G::NodeId>,
+{
+    fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
+        if self.1.include_node(id) {
+            self.0.node_weight(id)
+        } else {
+            None
+        }
+    }
+
+    fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> {
+        self.0.edge_weight(id)
+    }
+}
+
+macro_rules! access0 {
+    ($e:expr) => ($e.0)
+}
+
+Data!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+NodeIndexable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+GraphProp!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+Visitable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+
+/// A graph filter for edges
+pub trait FilterEdge<Edge> {
+    /// Return true to have the edge be part of the graph
+    fn include_edge(&self, edge: Edge) -> bool;
+}
+
+impl<F, N> FilterEdge<N> for F
+    where F: Fn(N) -> bool,
+{
+    fn include_edge(&self, n: N) -> bool {
+        (*self)(n)
+    }
+}
+
+/// An edge-filtering graph adaptor.
+///
+/// The adaptor may filter out edges. The filter implements the trait
+/// `FilterEdge`. Closures of type `Fn(G::EdgeRef) -> bool` already
+/// implement this trait.
+///
+/// The filter may use edge source, target, id, and weight to select whether to
+/// include the edge or not.
+#[derive(Copy, Clone, Debug)]
+pub struct EdgeFiltered<G, F>(pub G, pub F);
+
+impl<F, G> EdgeFiltered<G, F>
+    where G: IntoEdgeReferences,
+          F: Fn(G::EdgeRef) -> bool,
+{
+    /// Create an `EdgeFiltered` adaptor from the closure `filter`.
+    pub fn from_fn(graph: G, filter: F) -> Self {
+        EdgeFiltered(graph, filter)
+    }
+}
+
+impl<G, F> GraphBase for EdgeFiltered<G, F> where G: GraphBase {
+    type NodeId = G::NodeId;
+    type EdgeId = G::EdgeId;
+}
+
+impl<'a, G, F> IntoNeighbors for &'a EdgeFiltered<G, F>
+    where G: IntoEdges,
+          F: FilterEdge<G::EdgeRef>,
+{
+    type Neighbors = EdgeFilteredNeighbors<'a, G, F>;
+    fn neighbors(self, n: G::NodeId) -> Self::Neighbors {
+        EdgeFilteredNeighbors {
+            iter: self.0.edges(n),
+            f: &self.1,
+        }
+    }
+}
+
+/// A filtered neighbors iterator.
+pub struct EdgeFilteredNeighbors<'a, G, F: 'a>
+    where G: IntoEdges,
+{
+    iter: G::Edges,
+    f: &'a F,
+}
+
+impl<'a, G, F> Iterator for EdgeFilteredNeighbors<'a, G, F>
+    where F: FilterEdge<G::EdgeRef>,
+          G: IntoEdges,
+{
+    type Item = G::NodeId;
+    fn next(&mut self) -> Option<Self::Item> {
+        let f = self.f;
+        (&mut self.iter).filter_map(move |edge| {
+            if f.include_edge(edge) {
+                Some(edge.target())
+            } else { None }
+        }).next()
+    }
+}
+
+impl<'a, G, F> IntoEdgeReferences for &'a EdgeFiltered<G, F>
+    where G: IntoEdgeReferences,
+          F: FilterEdge<G::EdgeRef>,
+{
+    type EdgeRef = G::EdgeRef;
+    type EdgeReferences = EdgeFilteredEdges<'a, G, G::EdgeReferences, F>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        EdgeFilteredEdges {
+            graph: PhantomData,
+            iter: self.0.edge_references(),
+            f: &self.1,
+        }
+    }
+}
+
+impl<'a, G, F> IntoEdges for &'a EdgeFiltered<G, F>
+    where G: IntoEdges,
+          F: FilterEdge<G::EdgeRef>,
+{
+    type Edges = EdgeFilteredEdges<'a, G, G::Edges, F>;
+    fn edges(self, n: G::NodeId) -> Self::Edges {
+        EdgeFilteredEdges {
+            graph: PhantomData,
+            iter: self.0.edges(n),
+            f: &self.1,
+        }
+    }
+}
+
+/// A filtered edges iterator.
+pub struct EdgeFilteredEdges<'a, G, I, F: 'a>
+{
+    graph: PhantomData<G>,
+    iter: I,
+    f: &'a F,
+}
+
+impl<'a, G, I, F> Iterator for EdgeFilteredEdges<'a, G, I, F>
+    where F: FilterEdge<G::EdgeRef>,
+          G: IntoEdgeReferences,
+          I: Iterator<Item=G::EdgeRef>,
+{
+    type Item = I::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        let f = self.f;
+        self.iter.find(move |&edge| f.include_edge(edge))
+    }
+}
+
+Data!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+GraphProp!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+IntoNodeIdentifiers!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
+IntoNodeReferences!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
+NodeCompactIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+NodeCount!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+NodeIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+Visitable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/macros.rs
@@ -0,0 +1,133 @@
+
+/// Define a trait as usual, and a macro that can be used to instantiate
+/// implementations of it.
+///
+/// There *must* be section markers in the trait defition:
+/// @section type for associated types
+/// @section self for methods
+/// @section nodelegate for arbitrary tail that is not forwarded.
+macro_rules! trait_template {
+    ($(#[$doc:meta])* pub trait $name:ident $($methods:tt)*) => {
+        macro_rules! $name {
+            ($m:ident $extra:tt) => {
+                $m! {
+                    $extra
+                    pub trait $name $($methods)*
+                }
+            }
+        }
+
+        remove_sections! { [] 
+            $(#[$doc])*
+            pub trait $name $($methods)*
+
+            // This is where the trait definition is reproduced by the macro.
+            // It makes the source links point to this place!
+            //
+            // I'm sorry, you'll have to find the source by looking at the
+            // source of the module the trait is defined in.
+            //
+            // We use this nifty macro so that we can automatically generate
+            // delegation trait impls and implement the graph traits for more
+            // types and combinators.
+        }
+    }
+}
+
+macro_rules! remove_sections_inner {
+    ([$($stack:tt)*]) => {
+        $($stack)*
+    };
+    // escape the following tt
+    ([$($stack:tt)*] @escape $_x:tt $($t:tt)*) => {
+        remove_sections_inner!([$($stack)*] $($t)*);
+    };
+    ([$($stack:tt)*] @section $x:ident $($t:tt)*) => {
+        remove_sections_inner!([$($stack)*] $($t)*);
+    };
+    ([$($stack:tt)*] $t:tt $($tail:tt)*) => {
+        remove_sections_inner!([$($stack)* $t] $($tail)*);
+    };
+}
+
+// This is the outer layer, just find the { } of the actual trait definition
+// recurse once into { }, but not more.
+macro_rules! remove_sections {
+    ([$($stack:tt)*]) => {
+        $($stack)*
+    };
+    ([$($stack:tt)*] { $($tail:tt)* }) => {
+        $($stack)* {
+            remove_sections_inner!([] $($tail)*);
+        }
+    };
+    ([$($stack:tt)*] $t:tt $($tail:tt)*) => {
+        remove_sections!([$($stack)* $t] $($tail)*);
+    };
+}
+
+macro_rules! deref {
+    ($e:expr) => (*$e);
+}
+macro_rules! deref_twice {
+    ($e:expr) => (**$e);
+}
+
+/// Implement a trait by delegation. By default as if we are delegating
+/// from &G to G.
+macro_rules! delegate_impl {
+    ([] $($rest:tt)*) => {
+        delegate_impl! { [['a, G], G, &'a G, deref] $($rest)* }
+    };
+    ([[$($param:tt)*], $self_type:ident, $self_wrap:ty, $self_map:ident]
+     pub trait $name:ident $(: $sup:ident)* $(+ $more_sup:ident)* {
+
+        // "Escaped" associated types. Stripped before making the `trait`
+        // itself, but forwarded when delegating impls.
+        $(
+        @escape [type $assoc_name_ext:ident]
+        // Associated types. Forwarded.
+        )*
+        $(
+        @section type
+        $(
+            $(#[$_assoc_attr:meta])*
+            type $assoc_name:ident $(: $assoc_bound:ty)*;
+        )+
+        )*
+        // Methods. Forwarded. Using $self_map!(self) around the self argument.
+        // Methods must use receiver `self` or explicit type like `self: &Self`
+        // &self and &mut self are _not_ supported.
+        $(
+        @section self
+        $(
+            $(#[$_method_attr:meta])*
+            fn $method_name:ident(self $(: $self_selftype:ty)* $(,$marg:ident : $marg_ty:ty)*) -> $mret:ty;
+        )+
+        )*
+        // Arbitrary tail that is ignored when forwarding.
+        $(
+        @section nodelegate
+        $($tail:tt)*
+        )*
+    }) => {
+        impl<$($param)*> $name for $self_wrap where $self_type: $name {
+            $(
+            $(
+                type $assoc_name = $self_type::$assoc_name;
+            )*
+            )*
+            $(
+                type $assoc_name_ext = $self_type::$assoc_name_ext;
+            )*
+            $(
+            $(
+                fn $method_name(self $(: $self_selftype)* $(,$marg: $marg_ty)*) -> $mret {
+                    $self_map!(self).$method_name($($marg),*)
+                }
+            )*
+            )*
+        }
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/mod.rs
@@ -0,0 +1,714 @@
+//! Graph traits and graph traversals.
+//!
+//! ### The `Into-` Traits
+//!
+//! Graph traits like [`IntoNeighbors`][in] create iterators and use the same
+//! pattern that `IntoIterator` does: the trait takes a reference to a graph,
+//! and produces an iterator. These traits are quite composable, but with the
+//! limitation that they only use shared references to graphs.
+//!
+//! ### Graph Traversal
+//!
+//! [`Dfs`](struct.Dfs.html), [`Bfs`][bfs], [`DfsPostOrder`][dfspo] and
+//! [`Topo`][topo]  are basic visitors and they use “walker” methods: the
+//! visitors don't hold the graph as borrowed during traversal, only for the
+//! `.next()` call on the walker. They can be converted to iterators
+//! through the [`Walker`][w] trait.
+//!
+//! There is also the callback based traversal [`depth_first_search`][dfs].
+//!
+//! [bfs]: struct.Bfs.html
+//! [dfspo]: struct.DfsPostOrder.html
+//! [topo]: struct.Topo.html
+//! [dfs]: fn.depth_first_search.html
+//! [w]: trait.Walker.html
+//!
+//! ### Other Graph Traits
+//!
+//! The traits are rather loosely coupled at the moment (which is intentional,
+//! but will develop a bit), and there are traits missing that could be added.
+//!
+//! Not much is needed to be able to use the visitors on a graph. A graph
+//! needs to define [`GraphBase`][gb], [`IntoNeighbors`][in] and
+//! [`Visitable`][vis] as a minimum.
+//!
+//! [gb]: trait.GraphBase.html
+//! [in]: trait.IntoNeighbors.html
+//! [vis]: trait.Visitable.html
+//!
+
+// filter, reversed have their `mod` lines at the end,
+// so that they can use the trait template macros
+pub use self::filter::*;
+pub use self::reversed::*;
+
+#[macro_use] mod macros;
+
+mod dfsvisit;
+mod traversal;
+pub use self::dfsvisit::*;
+pub use self::traversal::*;
+
+use fixedbitset::FixedBitSet;
+use std::collections::{
+    HashSet,
+};
+use std::hash::{Hash, BuildHasher};
+
+use prelude::{Graph, Direction};
+#[cfg(feature = "graphmap")]
+use prelude::GraphMap;
+#[cfg(feature = "stable_graph")]
+use prelude::StableGraph;
+use graph::{NodeIndex};
+use super::{
+    graph,
+    EdgeType,
+};
+
+use graph::{
+    IndexType,
+};
+#[cfg(feature = "stable_graph")]
+use stable_graph;
+use graph::Frozen;
+
+#[cfg(feature = "graphmap")]
+use graphmap::{
+    self,
+    NodeTrait,
+};
+
+trait_template!{
+/// Base graph trait: defines the associated node identifier and
+/// edge identifier types.
+pub trait GraphBase {
+    // FIXME: We can drop this escape/nodelegate stuff in Rust 1.18
+    @escape [type NodeId]
+    @escape [type EdgeId]
+    @section nodelegate
+    /// edge identifier
+    type EdgeId: Copy + PartialEq;
+    /// node identifier
+    type NodeId: Copy + PartialEq;
+}
+}
+
+GraphBase!{delegate_impl []}
+GraphBase!{delegate_impl [['a, G], G, &'a mut G, deref]}
+
+/// A copyable reference to a graph.
+pub trait GraphRef : Copy + GraphBase { }
+
+impl<'a, G> GraphRef for &'a G where G: GraphBase { }
+
+impl<'a, G> GraphBase for Frozen<'a, G> where G: GraphBase {
+    type NodeId = G::NodeId;
+    type EdgeId = G::EdgeId;
+}
+
+#[cfg(feature = "stable_graph")]
+impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Neighbors = stable_graph::Neighbors<'a, E, Ix>;
+    fn neighbors(self, n: Self::NodeId) -> Self::Neighbors {
+        (*self).neighbors(n)
+    }
+}
+
+
+#[cfg(feature = "graphmap")]
+impl<'a, N: 'a, E, Ty> IntoNeighbors for &'a GraphMap<N, E, Ty>
+    where N: Copy + Ord + Hash,
+          Ty: EdgeType,
+{
+    type Neighbors = graphmap::Neighbors<'a, N, Ty>;
+    fn neighbors(self, n: Self::NodeId) -> Self::Neighbors {
+        self.neighbors(n)
+    }
+}
+
+
+trait_template! {
+/// Access to the neighbors of each node
+///
+/// The neighbors are, depending on the graph’s edge type:
+///
+/// - `Directed`: All targets of edges from `a`.
+/// - `Undirected`: All other endpoints of edges connected to `a`.
+pub trait IntoNeighbors : GraphRef {
+    @section type
+    type Neighbors: Iterator<Item=Self::NodeId>;
+    @section self
+    /// Return an iterator of the neighbors of node `a`.
+    fn neighbors(self: Self, a: Self::NodeId) -> Self::Neighbors;
+}
+}
+
+IntoNeighbors!{delegate_impl []}
+
+trait_template! {
+/// Access to the neighbors of each node, through incoming or outgoing edges.
+///
+/// Depending on the graph’s edge type, the neighbors of a given directionality
+/// are:
+///
+/// - `Directed`, `Outgoing`: All targets of edges from `a`.
+/// - `Directed`, `Incoming`: All sources of edges to `a`.
+/// - `Undirected`: All other endpoints of edges connected to `a`.
+pub trait IntoNeighborsDirected : IntoNeighbors {
+    @section type
+    type NeighborsDirected: Iterator<Item=Self::NodeId>;
+    @section self
+    fn neighbors_directed(self, n: Self::NodeId, d: Direction)
+        -> Self::NeighborsDirected;
+}
+}
+
+impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Neighbors = graph::Neighbors<'a, E, Ix>;
+    fn neighbors(self, n: graph::NodeIndex<Ix>)
+        -> graph::Neighbors<'a, E, Ix>
+    {
+        Graph::neighbors(self, n)
+    }
+}
+
+impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NeighborsDirected = graph::Neighbors<'a, E, Ix>;
+    fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction)
+        -> graph::Neighbors<'a, E, Ix>
+    {
+        Graph::neighbors_directed(self, n, d)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NeighborsDirected = stable_graph::Neighbors<'a, E, Ix>;
+    fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction)
+        -> Self::NeighborsDirected
+    {
+        StableGraph::neighbors_directed(self, n, d)
+    }
+}
+
+#[cfg(feature = "graphmap")]
+impl<'a, N: 'a, E, Ty> IntoNeighborsDirected for &'a GraphMap<N, E, Ty>
+    where N: Copy + Ord + Hash,
+          Ty: EdgeType,
+{
+    type NeighborsDirected = graphmap::NeighborsDirected<'a, N, Ty>;
+    fn neighbors_directed(self, n: N, dir: Direction)
+        -> Self::NeighborsDirected
+    {
+        self.neighbors_directed(n, dir)
+    }
+}
+
+trait_template! {
+/// Access to the edges of each node.
+///
+/// The edges are, depending on the graph’s edge type:
+///
+/// - `Directed`: All edges from `a`.
+/// - `Undirected`: All edges connected to `a`.
+///
+/// This is an extended version of the trait `IntoNeighbors`; the former
+/// only iterates over the target node identifiers, while this trait
+/// yields edge references (trait [`EdgeRef`][er]).
+///
+/// [er]: trait.EdgeRef.html
+pub trait IntoEdges : IntoEdgeReferences + IntoNeighbors {
+    @section type
+    type Edges: Iterator<Item=Self::EdgeRef>;
+    @section self
+    fn edges(self, a: Self::NodeId) -> Self::Edges;
+}
+}
+
+IntoEdges!{delegate_impl []}
+
+trait_template! {
+/// Access to all edges of each node, in the specified direction.
+///
+/// The edges are, depending on the direction and the graph’s edge type:
+///
+///
+/// - `Directed`, `Outgoing`: All edges from `a`.
+/// - `Directed`, `Incoming`: All edges to `a`.
+/// - `Undirected`: All edges connected to `a`.
+///
+/// This is an extended version of the trait `IntoNeighborsDirected`; the former
+/// only iterates over the target node identifiers, while this trait
+/// yields edge references (trait [`EdgeRef`][er]).
+///
+/// [er]: trait.EdgeRef.html
+pub trait IntoEdgesDirected : IntoEdges + IntoNeighborsDirected {
+    @section type
+    type EdgesDirected: Iterator<Item=Self::EdgeRef>;
+    @section self
+    fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected;
+}
+}
+
+IntoEdgesDirected!{delegate_impl []}
+
+trait_template! {
+/// Access to the sequence of the graph’s `NodeId`s.
+pub trait IntoNodeIdentifiers : GraphRef {
+    @section type
+    type NodeIdentifiers: Iterator<Item=Self::NodeId>;
+    @section self
+    fn node_identifiers(self) -> Self::NodeIdentifiers;
+}
+}
+
+IntoNodeIdentifiers!{delegate_impl []}
+
+impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeIdentifiers = graph::NodeIndices<Ix>;
+    fn node_identifiers(self) -> graph::NodeIndices<Ix> {
+        Graph::node_indices(self)
+    }
+}
+
+impl<N, E, Ty, Ix> NodeCount for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn node_count(&self) -> usize {
+        self.node_count()
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeIdentifiers = stable_graph::NodeIndices<'a, N, Ix>;
+    fn node_identifiers(self) -> Self::NodeIdentifiers {
+        StableGraph::node_indices(self)
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> NodeCount for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn node_count(&self) -> usize {
+        self.node_count()
+    }
+}
+
+IntoNeighborsDirected!{delegate_impl []}
+
+trait_template! {
+/// Define associated data for nodes and edges
+pub trait Data : GraphBase {
+    @section type
+    type NodeWeight;
+    type EdgeWeight;
+}
+}
+
+Data!{delegate_impl []}
+Data!{delegate_impl [['a, G], G, &'a mut G, deref]}
+
+/// An edge reference.
+///
+/// Edge references are used by traits `IntoEdges` and `IntoEdgeReferences`.
+pub trait EdgeRef : Copy {
+    type NodeId;
+    type EdgeId;
+    type Weight;
+    /// The source node of the edge.
+    fn source(&self) -> Self::NodeId;
+    /// The target node of the edge.
+    fn target(&self) -> Self::NodeId;
+    /// A reference to the weight of the edge.
+    fn weight(&self) -> &Self::Weight;
+    /// The edge’s identifier.
+    fn id(&self) -> Self::EdgeId;
+}
+
+impl<'a, N, E> EdgeRef for (N, N, &'a E)
+    where N: Copy
+{
+    type NodeId = N;
+    type EdgeId = (N, N);
+    type Weight = E;
+
+    fn source(&self) -> N { self.0 }
+    fn target(&self) -> N { self.1 }
+    fn weight(&self) -> &E { self.2 }
+    fn id(&self) -> (N, N) { (self.0, self.1) }
+}
+
+/// A node reference.
+pub trait NodeRef : Copy {
+    type NodeId;
+    type Weight;
+    fn id(&self) -> Self::NodeId;
+    fn weight(&self) -> &Self::Weight;
+}
+
+trait_template! {
+/// Access to the sequence of the graph’s nodes
+pub trait IntoNodeReferences : Data + IntoNodeIdentifiers {
+    @section type
+    type NodeRef: NodeRef<NodeId=Self::NodeId, Weight=Self::NodeWeight>;
+    type NodeReferences: Iterator<Item=Self::NodeRef>;
+    @section self
+    fn node_references(self) -> Self::NodeReferences;
+}
+}
+
+IntoNodeReferences!{delegate_impl []}
+
+impl<Id> NodeRef for (Id, ())
+    where Id: Copy,
+{
+    type NodeId = Id;
+    type Weight = ();
+    fn id(&self) -> Self::NodeId { self.0 }
+    fn weight(&self) -> &Self::Weight {
+        static DUMMY: () = ();
+        &DUMMY
+    }
+}
+
+impl<'a, Id, W> NodeRef for (Id, &'a W)
+    where Id: Copy,
+{
+    type NodeId = Id;
+    type Weight = W;
+    fn id(&self) -> Self::NodeId { self.0 }
+    fn weight(&self) -> &Self::Weight { self.1 }
+}
+
+
+trait_template! {
+/// Access to the sequence of the graph’s edges
+pub trait IntoEdgeReferences : Data + GraphRef {
+    @section type
+    type EdgeRef: EdgeRef<NodeId=Self::NodeId, EdgeId=Self::EdgeId,
+                          Weight=Self::EdgeWeight>;
+    type EdgeReferences: Iterator<Item=Self::EdgeRef>;
+    @section self
+    fn edge_references(self) -> Self::EdgeReferences;
+}
+}
+
+IntoEdgeReferences!{delegate_impl [] }
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> Data for GraphMap<N, E, Ty>
+    where N: Copy + PartialEq,
+          Ty: EdgeType,
+{
+    type NodeWeight = N;
+    type EdgeWeight = E;
+}
+
+trait_template! {
+    /// Edge kind property (directed or undirected edges)
+pub trait GraphProp : GraphBase {
+    @section type
+    /// The kind edges in the graph.
+    type EdgeType: EdgeType;
+
+    @section nodelegate
+    fn is_directed(&self) -> bool {
+        <Self::EdgeType>::is_directed()
+    }
+}
+}
+
+GraphProp!{delegate_impl []}
+
+impl<N, E, Ty, Ix> GraphProp for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeType = Ty;
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> GraphProp for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeType = Ty;
+}
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> GraphProp for GraphMap<N, E, Ty>
+    where N: NodeTrait,
+          Ty: EdgeType,
+{
+    type EdgeType = Ty;
+}
+
+
+impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type EdgeRef = graph::EdgeReference<'a, E, Ix>;
+    type EdgeReferences = graph::EdgeReferences<'a, E, Ix>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        (*self).edge_references()
+    }
+}
+
+
+trait_template!{
+    /// The graph’s `NodeId`s map to indices
+    pub trait NodeIndexable : GraphBase {
+        @section self
+        /// Return an upper bound of the node indices in the graph
+        /// (suitable for the size of a bitmap).
+        fn node_bound(self: &Self) -> usize;
+        /// Convert `a` to an integer index.
+        fn to_index(self: &Self, a: Self::NodeId) -> usize;
+        /// Convert `i` to a node index
+        fn from_index(self: &Self, i: usize) -> Self::NodeId;
+    }
+}
+
+NodeIndexable!{delegate_impl []}
+
+trait_template! {
+/// A graph with a known node count.
+pub trait NodeCount : GraphBase {
+    @section self
+    fn node_count(self: &Self) -> usize;
+}
+}
+
+NodeCount!{delegate_impl []}
+
+trait_template! {
+/// The graph’s `NodeId`s map to indices, in a range without holes.
+///
+/// The graph's node identifiers correspond to exactly the indices
+/// `0..self.node_bound()`.
+pub trait NodeCompactIndexable : NodeIndexable + NodeCount { }
+}
+
+NodeCompactIndexable!{delegate_impl []}
+
+impl<N, E, Ty, Ix> NodeIndexable for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    fn node_bound(&self) -> usize { self.node_count() }
+    fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() }
+    fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) }
+}
+
+impl<N, E, Ty, Ix> NodeCompactIndexable for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{ }
+
+/// A mapping for storing the visited status for NodeId `N`.
+pub trait VisitMap<N> {
+    /// Mark `a` as visited.
+    ///
+    /// Return **true** if this is the first visit, false otherwise.
+    fn visit(&mut self, a: N) -> bool;
+
+    /// Return whether `a` has been visited before.
+    fn is_visited(&self, a: &N) -> bool;
+}
+
+impl<Ix> VisitMap<graph::NodeIndex<Ix>> for FixedBitSet
+    where Ix: IndexType,
+{
+    fn visit(&mut self, x: graph::NodeIndex<Ix>) -> bool {
+        !self.put(x.index())
+    }
+    fn is_visited(&self, x: &graph::NodeIndex<Ix>) -> bool {
+        self.contains(x.index())
+    }
+}
+
+impl<Ix> VisitMap<graph::EdgeIndex<Ix>> for FixedBitSet
+    where Ix: IndexType,
+{
+    fn visit(&mut self, x: graph::EdgeIndex<Ix>) -> bool {
+        !self.put(x.index())
+    }
+    fn is_visited(&self, x: &graph::EdgeIndex<Ix>) -> bool {
+        self.contains(x.index())
+    }
+}
+
+impl<Ix> VisitMap<Ix> for FixedBitSet
+    where Ix: IndexType,
+{
+    fn visit(&mut self, x: Ix) -> bool {
+        !self.put(x.index())
+    }
+    fn is_visited(&self, x: &Ix) -> bool {
+        self.contains(x.index())
+    }
+}
+
+impl<N, S> VisitMap<N> for HashSet<N, S>
+    where N: Hash + Eq,
+          S: BuildHasher,
+{
+    fn visit(&mut self, x: N) -> bool {
+        self.insert(x)
+    }
+    fn is_visited(&self, x: &N) -> bool {
+        self.contains(x)
+    }
+}
+
+trait_template!{
+/// A graph that can create a map that tracks the visited status of its nodes.
+pub trait Visitable : GraphBase {
+    @section type
+    /// The associated map type
+    type Map: VisitMap<Self::NodeId>;
+    @section self
+    /// Create a new visitor map
+    fn visit_map(self: &Self) -> Self::Map;
+    /// Reset the visitor map (and resize to new size of graph if needed)
+    fn reset_map(self: &Self, map: &mut Self::Map) -> ();
+}
+}
+Visitable!{delegate_impl []}
+
+impl<N, E, Ty, Ix> GraphBase for Graph<N, E, Ty, Ix>
+    where Ix: IndexType,
+{
+    type NodeId = graph::NodeIndex<Ix>;
+    type EdgeId = graph::EdgeIndex<Ix>;
+}
+
+impl<N, E, Ty, Ix> Visitable for Graph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Map = FixedBitSet;
+    fn visit_map(&self) -> FixedBitSet { FixedBitSet::with_capacity(self.node_count()) }
+
+    fn reset_map(&self, map: &mut Self::Map) {
+        map.clear();
+        map.grow(self.node_count());
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> GraphBase for StableGraph<N, E, Ty, Ix>
+    where Ix: IndexType,
+{
+    type NodeId = graph::NodeIndex<Ix>;
+    type EdgeId = graph::EdgeIndex<Ix>;
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> Visitable for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type Map = FixedBitSet;
+    fn visit_map(&self) -> FixedBitSet {
+        FixedBitSet::with_capacity(self.node_bound())
+    }
+    fn reset_map(&self, map: &mut Self::Map) {
+        map.clear();
+        map.grow(self.node_bound());
+    }
+}
+
+#[cfg(feature = "stable_graph")]
+impl<N, E, Ty, Ix> Data for StableGraph<N, E, Ty, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    type NodeWeight = N;
+    type EdgeWeight = E;
+}
+
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> GraphBase for GraphMap<N, E, Ty>
+    where N: Copy + PartialEq,
+{
+    type NodeId = N;
+    type EdgeId = (N, N);
+}
+
+#[cfg(feature = "graphmap")]
+impl<N, E, Ty> Visitable for GraphMap<N, E, Ty>
+    where N: Copy + Ord + Hash,
+          Ty: EdgeType,
+{
+    type Map = HashSet<N>;
+    fn visit_map(&self) -> HashSet<N> { HashSet::with_capacity(self.node_count()) }
+    fn reset_map(&self, map: &mut Self::Map) {
+        map.clear();
+    }
+}
+
+trait_template! {
+/// Create or access the adjacency matrix of a graph.
+///
+/// The implementor can either create an adjacency matrix, or it can return
+/// a placeholder if it has the needed representation internally.
+pub trait GetAdjacencyMatrix : GraphBase {
+    @section type
+    /// The associated adjacency matrix type
+    type AdjMatrix;
+    @section self
+    /// Create the adjacency matrix
+    fn adjacency_matrix(self: &Self) -> Self::AdjMatrix;
+    /// Return true if there is an edge from `a` to `b`, false otherwise.
+    ///
+    /// Computes in O(1) time.
+    fn is_adjacent(self: &Self, matrix: &Self::AdjMatrix, a: Self::NodeId, b: Self::NodeId) -> bool;
+}
+}
+
+
+GetAdjacencyMatrix!{delegate_impl []}
+
+#[cfg(feature = "graphmap")]
+/// The `GraphMap` keeps an adjacency matrix internally.
+impl<N, E, Ty> GetAdjacencyMatrix for GraphMap<N, E, Ty>
+    where N: Copy + Ord + Hash,
+          Ty: EdgeType,
+{
+    type AdjMatrix = ();
+    #[inline]
+    fn adjacency_matrix(&self) { }
+    #[inline]
+    fn is_adjacent(&self, _: &(), a: N, b: N) -> bool {
+        self.contains_edge(a, b)
+    }
+}
+
+mod filter;
+mod reversed;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/reversed.rs
@@ -0,0 +1,135 @@
+
+use ::{
+    Direction,
+    Incoming,
+};
+
+use visit::{
+    GraphBase,
+    GraphRef,
+    IntoNodeIdentifiers,
+    IntoNodeReferences,
+    IntoNeighbors,
+    IntoNeighborsDirected,
+    IntoEdgeReferences,
+    NodeCompactIndexable,
+    NodeCount,
+    NodeIndexable,
+    Visitable,
+    EdgeRef,
+    Data,
+    GraphProp,
+};
+
+/// An edge-reversing graph adaptor.
+///
+/// All edges have the opposite direction with `Reversed`.
+#[derive(Copy, Clone, Debug)]
+pub struct Reversed<G>(pub G);
+
+impl<G: GraphBase> GraphBase for Reversed<G> {
+    type NodeId = G::NodeId;
+    type EdgeId = G::EdgeId;
+}
+
+impl<G: GraphRef> GraphRef for Reversed<G> { }
+
+Data!{delegate_impl [[G], G, Reversed<G>, access0]}
+
+impl<G> IntoNeighbors for Reversed<G>
+    where G: IntoNeighborsDirected
+{
+    type Neighbors = G::NeighborsDirected;
+    fn neighbors(self, n: G::NodeId) -> G::NeighborsDirected
+    {
+        self.0.neighbors_directed(n, Incoming)
+    }
+}
+
+impl<G> IntoNeighborsDirected for Reversed<G>
+    where G: IntoNeighborsDirected
+{
+    type NeighborsDirected = G::NeighborsDirected;
+    fn neighbors_directed(self, n: G::NodeId, d: Direction)
+        -> G::NeighborsDirected
+    {
+        self.0.neighbors_directed(n, d.opposite())
+    }
+}
+
+impl<G: Visitable> Visitable for Reversed<G>
+{
+    type Map = G::Map;
+    fn visit_map(&self) -> G::Map {
+        self.0.visit_map()
+    }
+    fn reset_map(&self, map: &mut Self::Map) {
+        self.0.reset_map(map);
+    }
+}
+
+
+/// A reversed edge reference
+#[derive(Copy, Clone, Debug)]
+pub struct ReversedEdgeReference<R>(R);
+
+/// An edge reference
+impl<R> EdgeRef for ReversedEdgeReference<R>
+    where R: EdgeRef,
+{
+    type NodeId = R::NodeId;
+    type EdgeId = R::EdgeId;
+    type Weight = R::Weight;
+    fn source(&self) -> Self::NodeId {
+        self.0.target()
+    }
+    fn target(&self) -> Self::NodeId {
+        self.0.source()
+    }
+    fn weight(&self) -> &Self::Weight {
+        self.0.weight()
+    }
+    fn id(&self) -> Self::EdgeId {
+        self.0.id()
+    }
+}
+
+impl<G> IntoEdgeReferences for Reversed<G>
+    where G: IntoEdgeReferences
+{
+    type EdgeRef = ReversedEdgeReference<G::EdgeRef>;
+    type EdgeReferences = ReversedEdgeReferences<G::EdgeReferences>;
+    fn edge_references(self) -> Self::EdgeReferences {
+        ReversedEdgeReferences {
+            iter: self.0.edge_references(),
+        }
+    }
+}
+
+/// A reversed edge references iterator.
+pub struct ReversedEdgeReferences<I> {
+    iter: I,
+}
+
+impl<I> Iterator for ReversedEdgeReferences<I>
+    where I: Iterator,
+          I::Item: EdgeRef,
+{
+    type Item = ReversedEdgeReference<I::Item>;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter.next().map(ReversedEdgeReference)
+    }
+}
+
+macro_rules! access0 {
+    ($e:expr) => ($e.0)
+}
+
+NodeIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
+NodeCompactIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
+IntoNodeIdentifiers!{delegate_impl [[G], G, Reversed<G>, access0]}
+IntoNodeReferences!{delegate_impl [[G], G, Reversed<G>, access0]}
+GraphProp!{delegate_impl [[G], G, Reversed<G>, access0]}
+NodeCount!{delegate_impl [[G], G, Reversed<G>, access0]}
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/src/visit/traversal.rs
@@ -0,0 +1,440 @@
+
+use {Incoming};
+use super::{IntoNeighbors, IntoNeighborsDirected, Visitable, VisitMap};
+use super::{GraphRef, Reversed, IntoNodeIdentifiers};
+use std::collections::VecDeque;
+
+/// Visit nodes of a graph in a depth-first-search (DFS) emitting nodes in
+/// preorder (when they are first discovered).
+///
+/// The traversal starts at a given node and only traverses nodes reachable
+/// from it.
+///
+/// `Dfs` is not recursive.
+///
+/// `Dfs` does not itself borrow the graph, and because of this you can run
+/// a traversal over a graph while still retaining mutable access to it, if you
+/// use it like the following example:
+///
+/// ```
+/// use petgraph::Graph;
+/// use petgraph::visit::Dfs;
+///
+/// let mut graph = Graph::<_,()>::new();
+/// let a = graph.add_node(0);
+///
+/// let mut dfs = Dfs::new(&graph, a);
+/// while let Some(nx) = dfs.next(&graph) {
+///     // we can access `graph` mutably here still
+///     graph[nx] += 1;
+/// }
+///
+/// assert_eq!(graph[a], 1);
+/// ```
+///
+/// **Note:** The algorithm may not behave correctly if nodes are removed
+/// during iteration. It may not necessarily visit added nodes or edges.
+#[derive(Clone, Debug)]
+pub struct Dfs<N, VM> {
+    /// The stack of nodes to visit
+    pub stack: Vec<N>,
+    /// The map of discovered nodes
+    pub discovered: VM,
+}
+
+impl<N, VM> Dfs<N, VM>
+    where N: Copy + PartialEq,
+          VM: VisitMap<N>,
+{
+    /// Create a new **Dfs**, using the graph's visitor map, and put **start**
+    /// in the stack of nodes to visit.
+    pub fn new<G>(graph: G, start: N) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        let mut dfs = Dfs::empty(graph);
+        dfs.move_to(start);
+        dfs
+    }
+
+    /// Create a `Dfs` from a vector and a visit map
+    pub fn from_parts(stack: Vec<N>, discovered: VM) -> Self {
+        Dfs {
+            stack: stack,
+            discovered: discovered,
+        }
+    }
+
+    /// Clear the visit state
+    pub fn reset<G>(&mut self, graph: G)
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        graph.reset_map(&mut self.discovered);
+        self.stack.clear();
+    }
+
+    /// Create a new **Dfs** using the graph's visitor map, and no stack.
+    pub fn empty<G>(graph: G) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        Dfs {
+            stack: Vec::new(),
+            discovered: graph.visit_map(),
+        }
+    }
+
+    /// Keep the discovered map, but clear the visit stack and restart
+    /// the dfs from a particular node.
+    pub fn move_to(&mut self, start: N)
+    {
+        self.discovered.visit(start);
+        self.stack.clear();
+        self.stack.push(start);
+    }
+
+    /// Return the next node in the dfs, or **None** if the traversal is done.
+    pub fn next<G>(&mut self, graph: G) -> Option<N>
+        where G: IntoNeighbors<NodeId=N>,
+    {
+        while let Some(node) = self.stack.pop() {
+            for succ in graph.neighbors(node) {
+                if self.discovered.visit(succ) {
+                    self.stack.push(succ);
+                }
+            }
+
+            return Some(node);
+        }
+        None
+    }
+}
+
+/// Visit nodes in a depth-first-search (DFS) emitting nodes in postorder
+/// (each node after all its descendants have been emitted).
+///
+/// `DfsPostOrder` is not recursive.
+///
+/// The traversal starts at a given node and only traverses nodes reachable
+/// from it.
+#[derive(Clone, Debug)]
+pub struct DfsPostOrder<N, VM> {
+    /// The stack of nodes to visit
+    pub stack: Vec<N>,
+    /// The map of discovered nodes
+    pub discovered: VM,
+    /// The map of finished nodes
+    pub finished: VM,
+}
+
+impl<N, VM> DfsPostOrder<N, VM>
+    where N: Copy + PartialEq,
+          VM: VisitMap<N>,
+{
+    /// Create a new `DfsPostOrder` using the graph's visitor map, and put
+    /// `start` in the stack of nodes to visit.
+    pub fn new<G>(graph: G, start: N) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        let mut dfs = Self::empty(graph);
+        dfs.move_to(start);
+        dfs
+    }
+
+    /// Create a new `DfsPostOrder` using the graph's visitor map, and no stack.
+    pub fn empty<G>(graph: G) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        DfsPostOrder {
+            stack: Vec::new(),
+            discovered: graph.visit_map(),
+            finished: graph.visit_map(),
+        }
+    }
+
+    /// Clear the visit state
+    pub fn reset<G>(&mut self, graph: G)
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        graph.reset_map(&mut self.discovered);
+        graph.reset_map(&mut self.finished);
+        self.stack.clear();
+    }
+
+    /// Keep the discovered and finished map, but clear the visit stack and restart
+    /// the dfs from a particular node.
+    pub fn move_to(&mut self, start: N)
+    {
+        self.stack.clear();
+        self.stack.push(start);
+    }
+
+    /// Return the next node in the traversal, or `None` if the traversal is done.
+    pub fn next<G>(&mut self, graph: G) -> Option<N>
+        where G: IntoNeighbors<NodeId=N>,
+    {
+        while let Some(&nx) = self.stack.last() {
+            if self.discovered.visit(nx) {
+                // First time visiting `nx`: Push neighbors, don't pop `nx`
+                for succ in graph.neighbors(nx) {
+                    if !self.discovered.is_visited(&succ) {
+                        self.stack.push(succ);
+                    }
+                }
+            } else {
+                self.stack.pop();
+                if self.finished.visit(nx) {
+                    // Second time: All reachable nodes must have been finished
+                    return Some(nx);
+                }
+            }
+        }
+        None
+    }
+}
+
+/// A breadth first search (BFS) of a graph.
+///
+/// The traversal starts at a given node and only traverses nodes reachable
+/// from it.
+///
+/// `Bfs` is not recursive.
+///
+/// `Bfs` does not itself borrow the graph, and because of this you can run
+/// a traversal over a graph while still retaining mutable access to it, if you
+/// use it like the following example:
+///
+/// ```
+/// use petgraph::Graph;
+/// use petgraph::visit::Bfs;
+///
+/// let mut graph = Graph::<_,()>::new();
+/// let a = graph.add_node(0);
+///
+/// let mut bfs = Bfs::new(&graph, a);
+/// while let Some(nx) = bfs.next(&graph) {
+///     // we can access `graph` mutably here still
+///     graph[nx] += 1;
+/// }
+///
+/// assert_eq!(graph[a], 1);
+/// ```
+///
+/// **Note:** The algorithm may not behave correctly if nodes are removed
+/// during iteration. It may not necessarily visit added nodes or edges.
+#[derive(Clone)]
+pub struct Bfs<N, VM> {
+    /// The queue of nodes to visit
+    pub stack: VecDeque<N>,
+    /// The map of discovered nodes
+    pub discovered: VM,
+}
+
+impl<N, VM> Bfs<N, VM>
+    where N: Copy + PartialEq,
+          VM: VisitMap<N>,
+{
+    /// Create a new **Bfs**, using the graph's visitor map, and put **start**
+    /// in the stack of nodes to visit.
+    pub fn new<G>(graph: G, start: N) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        let mut discovered = graph.visit_map();
+        discovered.visit(start);
+        let mut stack = VecDeque::new();
+        stack.push_front(start);
+        Bfs {
+            stack: stack,
+            discovered: discovered,
+        }
+    }
+
+    /// Return the next node in the bfs, or **None** if the traversal is done.
+    pub fn next<G>(&mut self, graph: G) -> Option<N>
+        where G: IntoNeighbors<NodeId=N>
+    {
+        while let Some(node) = self.stack.pop_front() {
+            for succ in graph.neighbors(node) {
+                if self.discovered.visit(succ) {
+                    self.stack.push_back(succ);
+                }
+            }
+
+            return Some(node);
+        }
+        None
+    }
+
+}
+
+/// A topological order traversal for a graph.
+///
+/// **Note** that `Topo` only visits nodes that are not part of cycles,
+/// i.e. nodes in a true DAG. Use other visitors like `DfsPostOrder` or
+/// algorithms like kosaraju_scc to handle graphs with possible cycles.
+#[derive(Clone)]
+pub struct Topo<N, VM> {
+    tovisit: Vec<N>,
+    ordered: VM,
+}
+
+impl<N, VM> Topo<N, VM>
+    where N: Copy + PartialEq,
+          VM: VisitMap<N>,
+{
+    /// Create a new `Topo`, using the graph's visitor map, and put all
+    /// initial nodes in the to visit list.
+    pub fn new<G>(graph: G) -> Self
+        where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    {
+        let mut topo = Self::empty(graph);
+        topo.extend_with_initials(graph);
+        topo
+    }
+
+    fn extend_with_initials<G>(&mut self, g: G)
+        where G: IntoNodeIdentifiers + IntoNeighborsDirected<NodeId=N>,
+    {
+        // find all initial nodes (nodes without incoming edges)
+        self.tovisit.extend(g.node_identifiers()
+                             .filter(move |&a| g.neighbors_directed(a, Incoming).next().is_none()));
+    }
+
+    /* Private until it has a use */
+    /// Create a new `Topo`, using the graph's visitor map with *no* starting
+    /// index specified.
+    fn empty<G>(graph: G) -> Self
+        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    {
+        Topo {
+            ordered: graph.visit_map(),
+            tovisit: Vec::new(),
+        }
+    }
+
+    /// Clear visited state, and put all initial nodes in the to visit list.
+    pub fn reset<G>(&mut self, graph: G)
+        where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    {
+        graph.reset_map(&mut self.ordered);
+        self.tovisit.clear();
+        self.extend_with_initials(graph);
+    }
+
+    /// Return the next node in the current topological order traversal, or
+    /// `None` if the traversal is at the end.
+    ///
+    /// *Note:* The graph may not have a complete topological order, and the only
+    /// way to know is to run the whole traversal and make sure it visits every node.
+    pub fn next<G>(&mut self, g: G) -> Option<N>
+        where G: IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    {
+        // Take an unvisited element and find which of its neighbors are next
+        while let Some(nix) = self.tovisit.pop() {
+            if self.ordered.is_visited(&nix) {
+                continue;
+            }
+            self.ordered.visit(nix);
+            for neigh in g.neighbors(nix) {
+                // Look at each neighbor, and those that only have incoming edges
+                // from the already ordered list, they are the next to visit.
+                if Reversed(g).neighbors(neigh).all(|b| self.ordered.is_visited(&b)) {
+                    self.tovisit.push(neigh);
+                }
+            }
+            return Some(nix);
+        }
+        None
+    }
+}
+
+
+/// A walker is a traversal state, but where part of the traversal
+/// information is supplied manually to each next call.
+///
+/// This for example allows graph traversals that don't hold a borrow of the
+/// graph they are traversing.
+pub trait Walker<Context> {
+    type Item;
+    /// Advance to the next item
+    fn walk_next(&mut self, context: Context) -> Option<Self::Item>;
+
+    /// Create an iterator out of the walker and given `context`.
+    fn iter(self, context: Context) -> WalkerIter<Self, Context>
+        where Self: Sized,
+              Context: Clone,
+    {
+        WalkerIter {
+            walker: self,
+            context: context,
+        }
+    }
+}
+
+/// A walker and its context wrapped into an iterator.
+#[derive(Clone, Debug)]
+pub struct WalkerIter<W, C> {
+    walker: W,
+    context: C,
+}
+
+impl<W, C> WalkerIter<W, C>
+    where W: Walker<C>,
+          C: Clone,
+{
+    pub fn context(&self) -> C {
+        self.context.clone()
+    }
+
+    pub fn inner_ref(&self) -> &W {
+        &self.walker
+    }
+
+    pub fn inner_mut(&mut self) -> &mut W {
+        &mut self.walker
+    }
+}
+
+impl<W, C> Iterator for WalkerIter<W, C>
+    where W: Walker<C>,
+          C: Clone,
+{
+    type Item = W::Item;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.walker.walk_next(self.context.clone())
+    }
+}
+
+impl<G> Walker<G> for Dfs<G::NodeId, G::Map>
+    where G: IntoNeighbors + Visitable
+{
+    type Item = G::NodeId;
+    fn walk_next(&mut self, context: G) -> Option<Self::Item> {
+        self.next(context)
+    }
+}
+
+impl<G> Walker<G> for DfsPostOrder<G::NodeId, G::Map>
+    where G: IntoNeighbors + Visitable
+{
+    type Item = G::NodeId;
+    fn walk_next(&mut self, context: G) -> Option<Self::Item> {
+        self.next(context)
+    }
+}
+
+impl<G> Walker<G> for Bfs<G::NodeId, G::Map>
+    where G: IntoNeighbors + Visitable
+{
+    type Item = G::NodeId;
+    fn walk_next(&mut self, context: G) -> Option<Self::Item> {
+        self.next(context)
+    }
+}
+
+impl<G> Walker<G> for Topo<G::NodeId, G::Map>
+    where G: IntoNeighborsDirected + Visitable,
+{
+    type Item = G::NodeId;
+    fn walk_next(&mut self, context: G) -> Option<Self::Item> {
+        self.next(context)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/graph.rs
@@ -0,0 +1,1787 @@
+extern crate petgraph;
+
+use std::collections::HashSet;
+use std::hash::Hash;
+
+use petgraph::prelude::*;
+use petgraph::{
+    EdgeType,
+};
+
+use petgraph as pg;
+
+use petgraph::algo::{
+    dominators,
+    has_path_connecting,
+    is_cyclic_undirected,
+    min_spanning_tree,
+    is_isomorphic_matching,
+};
+
+use petgraph::graph::node_index as n;
+use petgraph::graph::{
+    IndexType,
+};
+
+use petgraph::visit::{
+    IntoNodeIdentifiers,
+    NodeFiltered,
+    Reversed,
+    Topo,
+    IntoNeighbors,
+    VisitMap,
+    Walker,
+};
+use petgraph::algo::{
+    DfsSpace,
+    dijkstra,
+    astar,
+};
+
+use petgraph::dot::{
+    Dot,
+};
+
+fn set<I>(iter: I) -> HashSet<I::Item>
+    where I: IntoIterator,
+          I::Item: Hash + Eq,
+{
+    iter.into_iter().collect()
+}
+
+#[test]
+fn undirected()
+{
+    let mut og = Graph::new_undirected();
+    let a = og.add_node(0);
+    let b = og.add_node(1);
+    let c = og.add_node(2);
+    let d = og.add_node(3);
+    let _ = og.add_edge(a, b, 0);
+    let _ = og.add_edge(a, c, 1);
+    og.add_edge(c, a, 2);
+    og.add_edge(a, a, 3);
+    og.add_edge(b, c, 4);
+    og.add_edge(b, a, 5);
+    og.add_edge(a, d, 6);
+    assert_eq!(og.node_count(), 4);
+    assert_eq!(og.edge_count(), 7);
+
+    assert!(og.find_edge(a, b).is_some());
+    assert!(og.find_edge(d, a).is_some());
+    assert!(og.find_edge(a, a).is_some());
+
+    for edge in og.raw_edges() {
+        assert!(og.find_edge(edge.source(), edge.target()).is_some());
+        assert!(og.find_edge(edge.target(), edge.source()).is_some());
+    }
+
+    assert_eq!(og.neighbors(b).collect::<Vec<_>>(), vec![a, c, a]);
+
+    og.remove_node(a);
+    assert_eq!(og.neighbors(b).collect::<Vec<_>>(), vec![c]);
+    assert_eq!(og.node_count(), 3);
+    assert_eq!(og.edge_count(), 1);
+    assert!(og.find_edge(a, b).is_none());
+    assert!(og.find_edge(d, a).is_none());
+    assert!(og.find_edge(a, a).is_none());
+    assert!(og.find_edge(b, c).is_some());
+    assert_graph_consistent(&og);
+
+}
+
+#[test]
+fn dfs() {
+    let mut gr = Graph::new();
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    let k = gr.add_node("K");
+    // Z is disconnected.
+    let _ = gr.add_node("Z");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+    gr.add_edge(i, k, 2.);
+
+    println!("{}", Dot::new(&gr));
+
+    assert_eq!(Dfs::new(&gr, h).iter(&gr).count(), 4);
+    assert_eq!(Dfs::new(&gr, h).iter(&gr).clone().count(), 4);
+
+    assert_eq!(Dfs::new(&gr, h).iter(Reversed(&gr)).count(), 1);
+
+    assert_eq!(Dfs::new(&gr, k).iter(Reversed(&gr)).count(), 3);
+
+    assert_eq!(Dfs::new(&gr, i).iter(&gr).count(), 3);
+}
+
+
+#[test]
+fn bfs() {
+    let mut gr = Graph::new();
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    let k = gr.add_node("K");
+    // Z is disconnected.
+    let _ = gr.add_node("Z");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+    gr.add_edge(i, k, 2.);
+
+    assert_eq!(Bfs::new(&gr, h).iter(&gr).count(), 4);
+    assert_eq!(Bfs::new(&gr, h).iter(&gr).clone().count(), 4);
+
+    assert_eq!(Bfs::new(&gr, h).iter(Reversed(&gr)).count(), 1);
+
+    assert_eq!(Bfs::new(&gr, k).iter(Reversed(&gr)).count(), 3);
+
+    assert_eq!(Bfs::new(&gr, i).iter(&gr).count(), 3);
+
+    let mut bfs = Bfs::new(&gr, h);
+    let nx = bfs.next(&gr);
+    assert_eq!(nx, Some(h));
+
+    let nx1 = bfs.next(&gr);
+    assert!(nx1 == Some(i) || nx1 == Some(j));
+
+    let nx2 = bfs.next(&gr);
+    assert!(nx2 == Some(i) || nx2 == Some(j));
+    assert!(nx1 != nx2);
+
+    let nx = bfs.next(&gr);
+    assert_eq!(nx, Some(k));
+    assert_eq!(bfs.next(&gr), None);
+}
+
+
+
+#[test]
+fn mst() {
+    use petgraph::data::FromElements;
+
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let f = gr.add_node("F");
+    let g = gr.add_node("G");
+    gr.add_edge(a, b, 7.);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+
+    // add a disjoint part
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+
+    println!("{}", Dot::new(&gr));
+
+    let mst = UnGraph::from_elements(min_spanning_tree(&gr));
+
+    println!("{}", Dot::new(&mst));
+    println!("{:?}", Dot::new(&mst));
+    println!("MST is:\n{:#?}", mst);
+    assert!(mst.node_count() == gr.node_count());
+    // |E| = |N| - 2  because there are two disconnected components.
+    assert!(mst.edge_count() == gr.node_count() - 2);
+
+    // check the exact edges are there
+    assert!(mst.find_edge(a, b).is_some());
+    assert!(mst.find_edge(a, d).is_some());
+    assert!(mst.find_edge(b, e).is_some());
+    assert!(mst.find_edge(e, c).is_some());
+    assert!(mst.find_edge(e, g).is_some());
+    assert!(mst.find_edge(d, f).is_some());
+
+    assert!(mst.find_edge(h, i).is_some());
+    assert!(mst.find_edge(i, j).is_some());
+
+    assert!(mst.find_edge(d, b).is_none());
+    assert!(mst.find_edge(b, c).is_none());
+
+}
+
+#[test]
+fn selfloop() {
+    let mut gr = Graph::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    gr.add_edge(a, b, 7.);
+    gr.add_edge(c, a, 6.);
+    let sed = gr.add_edge(a, a, 2.);
+
+    assert!(gr.find_edge(a, b).is_some());
+    assert!(gr.find_edge(b, a).is_none());
+    assert!(gr.find_edge_undirected(b, a).is_some());
+    assert!(gr.find_edge(a, a).is_some());
+    println!("{:?}", gr);
+
+    gr.remove_edge(sed);
+    assert!(gr.find_edge(a, a).is_none());
+    println!("{:?}", gr);
+}
+
+#[test]
+fn cyclic() {
+    let mut gr = Graph::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+
+    assert!(!is_cyclic_undirected(&gr));
+    gr.add_edge(a, b, 7.);
+    gr.add_edge(c, a, 6.);
+    assert!(!is_cyclic_undirected(&gr));
+    {
+        let e = gr.add_edge(a, a, 0.);
+        assert!(is_cyclic_undirected(&gr));
+        gr.remove_edge(e);
+        assert!(!is_cyclic_undirected(&gr));
+    }
+
+    {
+        let e = gr.add_edge(b, c, 0.);
+        assert!(is_cyclic_undirected(&gr));
+        gr.remove_edge(e);
+        assert!(!is_cyclic_undirected(&gr));
+    }
+
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    gr.add_edge(b, d, 0.);
+    gr.add_edge(d, e, 0.);
+    assert!(!is_cyclic_undirected(&gr));
+    gr.add_edge(c, e, 0.);
+    assert!(is_cyclic_undirected(&gr));
+    assert_graph_consistent(&gr);
+}
+
+#[test]
+fn multi() {
+    let mut gr = Graph::new();
+    let a = gr.add_node("a");
+    let b = gr.add_node("b");
+    gr.add_edge(a, b, ());
+    gr.add_edge(a, b, ());
+    assert_eq!(gr.edge_count(), 2);
+
+}
+#[test]
+fn update_edge()
+{
+    {
+        let mut gr = Graph::new();
+        let a = gr.add_node("a");
+        let b = gr.add_node("b");
+        let e = gr.update_edge(a, b, 1);
+        let f = gr.update_edge(a, b, 2);
+        let _ = gr.update_edge(b, a, 3);
+        assert_eq!(gr.edge_count(), 2);
+        assert_eq!(e, f);
+        assert_eq!(*gr.edge_weight(f).unwrap(), 2);
+    }
+
+    {
+        let mut gr = Graph::new_undirected();
+        let a = gr.add_node("a");
+        let b = gr.add_node("b");
+        let e = gr.update_edge(a, b, 1);
+        let f = gr.update_edge(b, a, 2);
+        assert_eq!(gr.edge_count(), 1);
+        assert_eq!(e, f);
+        assert_eq!(*gr.edge_weight(f).unwrap(), 2);
+    }
+}
+
+#[test]
+fn dijk() {
+    let mut g = Graph::new_undirected();
+    let a = g.add_node("A");
+    let b = g.add_node("B");
+    let c = g.add_node("C");
+    let d = g.add_node("D");
+    let e = g.add_node("E");
+    let f = g.add_node("F");
+    g.add_edge(a, b, 7);
+    g.add_edge(c, a, 9);
+    g.add_edge(a, d, 14);
+    g.add_edge(b, c, 10);
+    g.add_edge(d, c, 2);
+    g.add_edge(d, e, 9);
+    g.add_edge(b, f, 15);
+    g.add_edge(c, f, 11);
+    g.add_edge(e, f, 6);
+    println!("{:?}", g);
+    for no in Bfs::new(&g, a).iter(&g) {
+        println!("Visit {:?} = {:?}", no, g.node_weight(no));
+    }
+
+    let scores = dijkstra(&g, a, None, |e| *e.weight());
+    let mut scores: Vec<_> = scores.into_iter().map(|(n, s)| (g[n], s)).collect();
+    scores.sort();
+    assert_eq!(scores,
+       vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]);
+
+    let scores = dijkstra(&g, a, Some(c), |e| *e.weight());
+    assert_eq!(scores[&c], 9);
+}
+
+#[test]
+fn test_astar_null_heuristic() {
+    let mut g = Graph::new();
+    let a = g.add_node("A");
+    let b = g.add_node("B");
+    let c = g.add_node("C");
+    let d = g.add_node("D");
+    let e = g.add_node("E");
+    let f = g.add_node("F");
+    g.add_edge(a, b, 7);
+    g.add_edge(c, a, 9);
+    g.add_edge(a, d, 14);
+    g.add_edge(b, c, 10);
+    g.add_edge(d, c, 2);
+    g.add_edge(d, e, 9);
+    g.add_edge(b, f, 15);
+    g.add_edge(c, f, 11);
+    g.add_edge(e, f, 6);
+
+    let path = astar(&g, a, |finish| finish == e, |e| *e.weight(), |_| 0);
+    assert_eq!(path, Some((23, vec![a, d, e])));
+
+    // check against dijkstra
+    let dijkstra_run = dijkstra(&g, a, Some(e), |e| *e.weight());
+    assert_eq!(dijkstra_run[&e], 23);
+
+    let path = astar(&g, e, |finish| finish == b, |e| *e.weight(), |_| 0);
+    assert_eq!(path, None);
+}
+
+#[test]
+fn test_astar_manhattan_heuristic() {
+    let mut g = Graph::new();
+    let a = g.add_node((0., 0.));
+    let b = g.add_node((2., 0.));
+    let c = g.add_node((1., 1.));
+    let d = g.add_node((0., 2.));
+    let e = g.add_node((3., 3.));
+    let f = g.add_node((4., 2.));
+    let _ = g.add_node((5., 5.)); // no path to node
+    g.add_edge(a, b, 2.);
+    g.add_edge(a, d, 4.);
+    g.add_edge(b, c, 1.);
+    g.add_edge(b, f, 7.);
+    g.add_edge(c, e, 5.);
+    g.add_edge(e, f, 1.);
+    g.add_edge(d, e, 1.);
+
+    let heuristic_for = |f: NodeIndex| {
+        let g = &g;
+        move |node: NodeIndex| -> f32 {
+            let (x1, y1): (f32, f32) = g[node];
+            let (x2, y2): (f32, f32) = g[f];
+
+            (x2 - x1).abs() + (y2 - y1).abs()
+        }
+    };
+    let path = astar(&g, a, |finish| finish == f, |e| *e.weight(), heuristic_for(f));
+
+    assert_eq!(path, Some((6., vec![a, d, e, f])));
+
+    // check against dijkstra
+    let dijkstra_run = dijkstra(&g, a, None, |e| *e.weight());
+
+    for end in g.node_indices() {
+        let astar_path = astar(&g, a, |finish| finish == end, |e| *e.weight(),
+                               heuristic_for(end));
+        assert_eq!(dijkstra_run.get(&end).cloned(),
+                   astar_path.map(|t| t.0));
+    }
+}
+
+#[cfg(feature = "generate")]
+#[test]
+fn test_generate_undirected() {
+    for size in 0..4 {
+        let mut gen = pg::generate::Generator::<Undirected>::all(size, true);
+        let nedges = (size * size - size) / 2 + size;
+        let mut n = 0;
+        while let Some(g) = gen.next_ref() {
+            n += 1;
+            println!("{:?}", g);
+        }
+
+        assert_eq!(n, 1 << nedges);
+    }
+}
+
+#[cfg(feature = "generate")]
+#[test]
+fn test_generate_directed() {
+    // Number of DAG out of all graphs (all permutations) per node size
+    //            0, 1, 2, 3,  4,   5 ..
+    let n_dag = &[1, 1, 3, 25, 543, 29281, 3781503];
+    for (size, &dags_exp) in (0..4).zip(n_dag) {
+        let mut gen = pg::generate::Generator::<Directed>::all(size, true);
+        let nedges = size * size;
+        let mut n = 0;
+        let mut dags = 0;
+        while let Some(g) = gen.next_ref() {
+            n += 1;
+            if !pg::algo::is_cyclic_directed(g) {
+                dags += 1;
+            }
+        }
+
+        /*
+        // check that all generated graphs have unique adjacency matrices
+        let mut adjmats = graphs.iter().map(Graph::adjacency_matrix).collect::<Vec<_>>();
+        adjmats.sort(); adjmats.dedup();
+        assert_eq!(adjmats.len(), n);
+        */
+        assert_eq!(dags_exp, dags);
+        assert_eq!(n, 1 << nedges);
+    }
+}
+
+#[cfg(feature = "generate")]
+#[test]
+fn test_generate_dag() {
+    use petgraph::visit::GetAdjacencyMatrix;
+    for size in 1..5 {
+        let gen = pg::generate::Generator::directed_acyclic(size);
+        let nedges = (size - 1) * size / 2;
+        let graphs = gen.collect::<Vec<_>>();
+
+        assert_eq!(graphs.len(), 1 << nedges);
+
+        // check that all generated graphs have unique adjacency matrices
+        let mut adjmats = graphs.iter().map(Graph::adjacency_matrix).collect::<Vec<_>>();
+        adjmats.sort();
+        adjmats.dedup();
+        assert_eq!(adjmats.len(), graphs.len());
+        for gr in &graphs {
+            assert!(!petgraph::algo::is_cyclic_directed(gr),
+                    "Assertion failed: {:?} acyclic", gr);
+        }
+    }
+}
+
+#[test]
+fn without()
+{
+    let mut og = Graph::new_undirected();
+    let a = og.add_node(0);
+    let b = og.add_node(1);
+    let c = og.add_node(2);
+    let d = og.add_node(3);
+    let _ = og.add_edge(a, b, 0);
+    let _ = og.add_edge(a, c, 1);
+    let v: Vec<NodeIndex> = og.externals(Outgoing).collect();
+    assert_eq!(v, vec![d]);
+
+    let mut og = Graph::new();
+    let a = og.add_node(0);
+    let b = og.add_node(1);
+    let c = og.add_node(2);
+    let d = og.add_node(3);
+    let _ = og.add_edge(a, b, 0);
+    let _ = og.add_edge(a, c, 1);
+    let init: Vec<NodeIndex> = og.externals(Incoming).collect();
+    let term: Vec<NodeIndex> = og.externals(Outgoing).collect();
+    assert_eq!(init, vec![a, d]);
+    assert_eq!(term, vec![b, c, d]);
+}
+
+fn assert_is_topo_order<N, E>(gr: &Graph<N, E, Directed>, order: &[NodeIndex])
+{
+    assert_eq!(gr.node_count(), order.len());
+    // check all the edges of the graph
+    for edge in gr.raw_edges() {
+        let a = edge.source();
+        let b = edge.target();
+        let ai = order.iter().position(|x| *x == a).unwrap();
+        let bi = order.iter().position(|x| *x == b).unwrap();
+        println!("Check that {:?} is before {:?}", a, b);
+        assert!(ai < bi, "Topo order: assertion that node {:?} is before {:?} failed",
+                a, b);
+    }
+}
+
+#[test]
+fn test_toposort() {
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let f = gr.add_node("F");
+    let g = gr.add_node("G");
+    gr.extend_with_edges(&[
+        (a, b, 7.),
+        (a, d, 5.),
+        (d, b, 9.),
+        (b, c, 8.),
+        (b, e, 7.),
+        (c, e, 5.),
+        (d, e, 15.),
+        (d, f, 6.),
+        (f, e, 8.),
+        (f, g, 11.),
+        (e, g, 9.),
+    ]);
+
+    // add a disjoint part
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+
+    let order = petgraph::algo::toposort(&gr, None).unwrap();
+    println!("{:?}", order);
+    assert_eq!(order.len(), gr.node_count());
+
+    assert_is_topo_order(&gr, &order);
+}
+
+#[test]
+fn test_toposort_eq() {
+    let mut g = Graph::<_,_>::new();
+    let a = g.add_node("A");
+    let b = g.add_node("B");
+    g.add_edge(a, b, ());
+
+    assert_eq!(petgraph::algo::toposort(&g, None), Ok(vec![a, b]));
+}
+
+#[test]
+fn is_cyclic_directed() {
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let f = gr.add_node("F");
+    let g = gr.add_node("G");
+    gr.add_edge(a, b, 7.0);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+
+    assert!(!petgraph::algo::is_cyclic_directed(&gr));
+
+    // add a disjoint part
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+    assert!(!petgraph::algo::is_cyclic_directed(&gr));
+
+    gr.add_edge(g, e, 0.);
+    assert!(petgraph::algo::is_cyclic_directed(&gr));
+}
+
+/// Compare two scc sets. Inside each scc, the order does not matter,
+/// but the order of the sccs is significant.
+fn assert_sccs_eq(mut res: Vec<Vec<NodeIndex>>, mut answer: Vec<Vec<NodeIndex>>,
+                  scc_order_matters: bool) {
+    // normalize the result and compare with the answer.
+    for scc in &mut res {
+        scc.sort();
+    }
+    for scc in &mut answer {
+        scc.sort();
+    }
+    if !scc_order_matters {
+        res.sort();
+        answer.sort();
+    }
+    assert_eq!(res, answer);
+}
+
+#[test]
+fn scc() {
+    let gr: Graph<(), ()> = Graph::from_edges(&[
+        (6, 0),
+        (0, 3),
+        (3, 6),
+        (8, 6),
+        (8, 2),
+        (2, 5),
+        (5, 8),
+        (7, 5),
+        (1, 7),
+        (7, 4),
+        (4, 1)]);
+
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
+        vec![n(0), n(3), n(6)],
+        vec![n(2), n(5), n(8)],
+        vec![n(1), n(4), n(7)],
+    ], true);
+    // Reversed edges gives the same sccs (when sorted)
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(Reversed(&gr)), vec![
+        vec![n(1), n(4), n(7)],
+        vec![n(2), n(5), n(8)],
+        vec![n(0), n(3), n(6)],
+    ], true);
+
+
+    // Test an undirected graph just for fun.
+    // Sccs are just connected components.
+    let mut hr = gr.into_edge_type::<Undirected>();
+    // Delete an edge to disconnect it
+    let ed = hr.find_edge(n(6), n(8)).unwrap();
+    assert!(hr.remove_edge(ed).is_some());
+
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(&hr), vec![
+        vec![n(0), n(3), n(6)],
+        vec![n(1), n(2), n(4), n(5), n(7), n(8)],
+    ], false);
+
+
+    // acyclic non-tree, #14
+    let n = NodeIndex::new;
+    let mut gr = Graph::new();
+    gr.add_node(0);
+    gr.add_node(1);
+    gr.add_node(2);
+    gr.add_node(3);
+    gr.add_edge(n(3), n(2), ());
+    gr.add_edge(n(3), n(1), ());
+    gr.add_edge(n(2), n(0), ());
+    gr.add_edge(n(1), n(0), ());
+
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
+        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
+    ], true);
+
+    // Kosaraju bug from PR #60
+    let mut gr = Graph::<(), ()>::new();
+    gr.extend_with_edges(&[
+        (0, 0),
+        (1, 0),
+        (2, 0),
+        (2, 1),
+        (2, 2),
+    ]);
+    gr.add_node(());
+    // no order for the disconnected one
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
+        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
+    ], false);
+}
+
+
+#[test]
+fn tarjan_scc() {
+    let gr: Graph<(), ()> = Graph::from_edges(&[
+        (6, 0),
+        (0, 3),
+        (3, 6),
+        (8, 6),
+        (8, 2),
+        (2, 5),
+        (5, 8),
+        (7, 5),
+        (1, 7),
+        (7, 4),
+        (4, 1)]);
+
+    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
+        vec![n(0), n(3), n(6)],
+        vec![n(2), n(5), n(8)],
+        vec![n(1), n(4), n(7)],
+    ], true);
+
+
+    // Test an undirected graph just for fun.
+    // Sccs are just connected components.
+    let mut hr = gr.into_edge_type::<Undirected>();
+    // Delete an edge to disconnect it
+    let ed = hr.find_edge(n(6), n(8)).unwrap();
+    assert!(hr.remove_edge(ed).is_some());
+
+    assert_sccs_eq(petgraph::algo::tarjan_scc(&hr), vec![
+        vec![n(1), n(2), n(4), n(5), n(7), n(8)],
+        vec![n(0), n(3), n(6)],
+    ], false);
+
+
+    // acyclic non-tree, #14
+    let n = NodeIndex::new;
+    let mut gr = Graph::new();
+    gr.add_node(0);
+    gr.add_node(1);
+    gr.add_node(2);
+    gr.add_node(3);
+    gr.add_edge(n(3), n(2), ());
+    gr.add_edge(n(3), n(1), ());
+    gr.add_edge(n(2), n(0), ());
+    gr.add_edge(n(1), n(0), ());
+
+    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
+        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
+    ], true);
+
+    // Kosaraju bug from PR #60
+    let mut gr = Graph::<(), ()>::new();
+    gr.extend_with_edges(&[
+        (0, 0),
+        (1, 0),
+        (2, 0),
+        (2, 1),
+        (2, 2),
+    ]);
+    gr.add_node(());
+    // no order for the disconnected one
+    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
+        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
+    ], false);
+}
+
+
+#[test]
+fn condensation()
+{
+    let gr: Graph<(), ()> = Graph::from_edges(&[
+        (6, 0),
+        (0, 3),
+        (3, 6),
+        (8, 6),
+        (8, 2),
+        (2, 3),
+        (2, 5),
+        (5, 8),
+        (7, 5),
+        (1, 7),
+        (7, 4),
+        (4, 1)]);
+
+
+    // make_acyclic = true
+
+    let cond = petgraph::algo::condensation(gr.clone(), true);
+
+    assert!(cond.node_count() == 3);
+    assert!(cond.edge_count() == 2);
+    assert!(!petgraph::algo::is_cyclic_directed(&cond),
+            "Assertion failed: {:?} acyclic", cond);
+
+
+    // make_acyclic = false
+
+    let cond = petgraph::algo::condensation(gr.clone(), false);
+
+    assert!(cond.node_count() == 3);
+    assert!(cond.edge_count() == gr.edge_count());
+}
+
+#[test]
+fn connected_comp()
+{
+    let n = NodeIndex::new;
+    let mut gr = Graph::new();
+    gr.add_node(0);
+    gr.add_node(1);
+    gr.add_node(2);
+    gr.add_node(3);
+    gr.add_node(4);
+    gr.add_node(5);
+    gr.add_node(6);
+    gr.add_node(7);
+    gr.add_node(8);
+    gr.add_edge(n(6), n(0), ());
+    gr.add_edge(n(0), n(3), ());
+    gr.add_edge(n(3), n(6), ());
+    gr.add_edge(n(8), n(6), ());
+    gr.add_edge(n(8), n(2), ());
+    gr.add_edge(n(2), n(5), ());
+    gr.add_edge(n(5), n(8), ());
+    gr.add_edge(n(7), n(5), ());
+    gr.add_edge(n(1), n(7), ());
+    gr.add_edge(n(7), n(4), ());
+    gr.add_edge(n(4), n(1), ());
+    assert_eq!(petgraph::algo::connected_components(&gr), 1);
+
+    gr.add_node(9);
+    gr.add_node(10);
+    assert_eq!(petgraph::algo::connected_components(&gr), 3);
+
+    gr.add_edge(n(9), n(10), ());
+    assert_eq!(petgraph::algo::connected_components(&gr), 2);
+
+    let gr = gr.into_edge_type::<Undirected>();
+    assert_eq!(petgraph::algo::connected_components(&gr), 2);
+}
+
+#[should_panic]
+#[test]
+fn oob_index()
+{
+    let mut gr = Graph::<_, ()>::new();
+    let a = gr.add_node(0);
+    let b = gr.add_node(1);
+    gr.remove_node(a);
+    gr[b];
+}
+
+#[test]
+fn usize_index()
+{
+    let mut gr = Graph::<_, _, Directed, usize>::with_capacity(0, 0);
+    let a = gr.add_node(0);
+    let b = gr.add_node(1);
+    let e = gr.add_edge(a, b, 1.2);
+    let mut dfs = Dfs::new(&gr, a);
+    while let Some(nx) = dfs.next(&gr) {
+        gr[nx] += 1;
+    }
+    assert_eq!(gr[a], 1);
+    assert_eq!(gr[b], 2);
+    assert_eq!(gr[e], 1.2);
+}
+
+#[test]
+fn u8_index()
+{
+    let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
+    for _ in 0..255 {
+        gr.add_node(());
+    }
+}
+
+#[should_panic]
+#[test]
+fn u8_index_overflow()
+{
+    let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
+    for _ in 0..256 {
+        gr.add_node(());
+    }
+}
+
+#[should_panic]
+#[test]
+fn u8_index_overflow_edges()
+{
+    let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
+    let a = gr.add_node('a');
+    let b = gr.add_node('b');
+    for _ in 0..256 {
+        gr.add_edge(a, b, ());
+    }
+}
+
+#[test]
+fn test_weight_iterators() {
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let f = gr.add_node("F");
+    let g = gr.add_node("G");
+    gr.add_edge(a, b, 7.0);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+
+    assert_eq!(gr.node_weights_mut().count(), gr.node_count());
+    assert_eq!(gr.edge_weights_mut().count(), gr.edge_count());
+
+    // add a disjoint part
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+
+    assert_eq!(gr.node_weights_mut().count(), gr.node_count());
+    assert_eq!(gr.edge_weights_mut().count(), gr.edge_count());
+
+    for nw in gr.node_weights_mut() {
+        *nw = "x";
+    }
+    for node in gr.raw_nodes() {
+        assert_eq!(node.weight, "x");
+    }
+
+    let old = gr.clone();
+    for (index, ew) in gr.edge_weights_mut().enumerate() {
+        assert_eq!(old[EdgeIndex::new(index)], *ew);
+        *ew = - *ew;
+    }
+    for (index, edge) in gr.raw_edges().iter().enumerate() {
+        assert_eq!(edge.weight, -1. * old[EdgeIndex::new(index)]);
+    }
+}
+
+#[test]
+fn walk_edges() {
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node(0.);
+    let b = gr.add_node(1.);
+    let c = gr.add_node(2.);
+    let d = gr.add_node(3.);
+    let e0 = gr.add_edge(a, b, 0.);
+    let e1 = gr.add_edge(a, d, 0.);
+    let e2 = gr.add_edge(b, c, 0.);
+    let e3 = gr.add_edge(c, a, 0.);
+
+    // Set edge weights to difference: target - source.
+    let mut dfs = Dfs::new(&gr, a);
+    while let Some(source) = dfs.next(&gr) {
+        let mut edges = gr.neighbors_directed(source, Outgoing).detach();
+        while let Some((edge, target)) = edges.next(&gr) {
+            gr[edge] = gr[target] - gr[source];
+        }
+    }
+    assert_eq!(gr[e0], 1.);
+    assert_eq!(gr[e1], 3.);
+    assert_eq!(gr[e2], 1.);
+    assert_eq!(gr[e3], -2.);
+
+    let mut nedges = 0;
+    let mut dfs = Dfs::new(&gr, a);
+    while let Some(node) = dfs.next(&gr) {
+        let mut edges = gr.neighbors_directed(node, Incoming).detach();
+        while let Some((edge, source)) = edges.next(&gr) {
+            assert_eq!(gr.find_edge(source, node), Some(edge));
+            nedges += 1;
+        }
+
+        let mut edges = gr.neighbors_directed(node, Outgoing).detach();
+        while let Some((edge, target)) = edges.next(&gr) {
+            assert_eq!(gr.find_edge(node, target), Some(edge));
+            nedges += 1;
+        }
+    }
+    assert_eq!(nedges, 8);
+}
+
+#[test]
+fn index_twice_mut() {
+    let mut gr = Graph::<_,_>::new();
+    let a = gr.add_node(0.);
+    let b = gr.add_node(0.);
+    let c = gr.add_node(0.);
+    let d = gr.add_node(0.);
+    let e = gr.add_node(0.);
+    let f = gr.add_node(0.);
+    let g = gr.add_node(0.);
+    gr.add_edge(a, b, 7.0);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+
+    for dir in &[Incoming, Outgoing] {
+        for nw in gr.node_weights_mut() { *nw = 0.; }
+
+        // walk the graph and sum incoming edges
+        let mut dfs = Dfs::new(&gr, a);
+        while let Some(node) = dfs.next(&gr) {
+            let mut edges = gr.neighbors_directed(node, *dir).detach();
+            while let Some(edge) = edges.next_edge(&gr) {
+                let (nw, ew) = gr.index_twice_mut(node, edge);
+                *nw += *ew;
+            }
+        }
+
+        // check the sums
+        for i in 0..gr.node_count() {
+            let ni = NodeIndex::new(i);
+            let s = gr.edges_directed(ni, *dir).map(|e| *e.weight()).fold(0., |a, b| a + b);
+            assert_eq!(s, gr[ni]);
+        }
+        println!("Sum {:?}: {:?}", dir, gr);
+    }
+}
+
+#[test]
+fn toposort_generic() {
+    // This is a DAG, visit it in order
+    let mut gr = Graph::<_,_>::new();
+    let b = gr.add_node(("B", 0.));
+    let a = gr.add_node(("A", 0.));
+    let c = gr.add_node(("C", 0.));
+    let d = gr.add_node(("D", 0.));
+    let e = gr.add_node(("E", 0.));
+    let f = gr.add_node(("F", 0.));
+    let g = gr.add_node(("G", 0.));
+    gr.add_edge(a, b, 7.0);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+
+    assert!(!pg::algo::is_cyclic_directed(&gr));
+    let mut index = 0.;
+    let mut topo = Topo::new(&gr);
+    while let Some(nx) = topo.next(&gr) {
+        gr[nx].1 = index;
+        index += 1.;
+    }
+
+    let mut order = Vec::new();
+    index = 0.;
+    let mut topo = Topo::new(&gr);
+    while let Some(nx) = topo.next(&gr) {
+        order.push(nx);
+        assert_eq!(gr[nx].1, index);
+        index += 1.;
+    }
+    println!("{:?}", gr);
+    assert_is_topo_order(&gr, &order);
+
+    {
+        order.clear();
+        let mut topo = Topo::new(&gr);
+        while let Some(nx) = topo.next(&gr) {
+            order.push(nx);
+        }
+        println!("{:?}", gr);
+        assert_is_topo_order(&gr, &order);
+    }
+    let mut gr2 = gr.clone();
+    gr.add_edge(e, d, -1.);
+    assert!(pg::algo::is_cyclic_directed(&gr));
+    assert!(pg::algo::toposort(&gr, None).is_err());
+    gr2.add_edge(d, d, 0.);
+    assert!(pg::algo::is_cyclic_directed(&gr2));
+    assert!(pg::algo::toposort(&gr2, None).is_err());
+}
+
+#[test]
+fn test_has_path() {
+    // This is a DAG, visit it in order
+    let mut gr = Graph::<_,_>::new();
+    let b = gr.add_node(("B", 0.));
+    let a = gr.add_node(("A", 0.));
+    let c = gr.add_node(("C", 0.));
+    let d = gr.add_node(("D", 0.));
+    let e = gr.add_node(("E", 0.));
+    let f = gr.add_node(("F", 0.));
+    let g = gr.add_node(("G", 0.));
+    gr.add_edge(a, b, 7.0);
+    gr.add_edge(a, d, 5.);
+    gr.add_edge(d, b, 9.);
+    gr.add_edge(b, c, 8.);
+    gr.add_edge(b, e, 7.);
+    gr.add_edge(c, e, 5.);
+    gr.add_edge(d, e, 15.);
+    gr.add_edge(d, f, 6.);
+    gr.add_edge(f, e, 8.);
+    gr.add_edge(f, g, 11.);
+    gr.add_edge(e, g, 9.);
+    // disconnected island
+
+    let h = gr.add_node(("H", 0.));
+    let i = gr.add_node(("I", 0.));
+    gr.add_edge(h, i, 2.);
+    gr.add_edge(i, h, -2.);
+
+    let mut state = DfsSpace::default();
+
+    gr.add_edge(b, a, 99.);
+
+    assert!(has_path_connecting(&gr, c, c, None));
+
+    for edge in gr.edge_references() {
+        assert!(has_path_connecting(&gr, edge.source(), edge.target(), None));
+    }
+    assert!(has_path_connecting(&gr, a, g, Some(&mut state)));
+    assert!(!has_path_connecting(&gr, a, h, Some(&mut state)));
+    assert!(has_path_connecting(&gr, a, c, None));
+    assert!(has_path_connecting(&gr, a, c, Some(&mut state)));
+    assert!(!has_path_connecting(&gr, h, a, Some(&mut state)));
+}
+
+#[test]
+fn map_filter_map() {
+    let mut g = Graph::new_undirected();
+    let a = g.add_node("A");
+    let b = g.add_node("B");
+    let c = g.add_node("C");
+    let d = g.add_node("D");
+    let e = g.add_node("E");
+    let f = g.add_node("F");
+    g.add_edge(a, b, 7);
+    g.add_edge(c, a, 9);
+    g.add_edge(a, d, 14);
+    g.add_edge(b, c, 10);
+    g.add_edge(d, c, 2);
+    g.add_edge(d, e, 9);
+    g.add_edge(b, f, 15);
+    g.add_edge(c, f, 11);
+    g.add_edge(e, f, 6);
+    println!("{:?}", g);
+
+    let g2 = g.filter_map(|_, name| Some(*name), |_, &weight| if weight >= 10 {
+        Some(weight)
+    } else { None });
+    assert_eq!(g2.edge_count(), 4);
+    for edge in g2.raw_edges() {
+        assert!(edge.weight >= 10);
+    }
+
+    let g3 = g.filter_map(|i, &name| if i == a || i == e { None } else { Some(name) },
+                          |i, &weight| {
+                              let (source, target) = g.edge_endpoints(i).unwrap();
+                              // don't map edges from a removed node
+                              assert!(source != a);
+                              assert!(target != a);
+                              assert!(source != e);
+                              assert!(target != e);
+                              Some(weight)
+                          });
+    assert_eq!(g3.node_count(), g.node_count() - 2);
+    assert_eq!(g3.edge_count(), g.edge_count() - 5);
+    assert_graph_consistent(&g3);
+
+    let mut g4 = g.clone();
+    g4.retain_edges(|gr, i| {
+        let (s, t) = gr.edge_endpoints(i).unwrap();
+        !(s == a || s == e || t == a || t == e)
+    });
+    assert_eq!(g4.edge_count(), g.edge_count() - 5);
+    assert_graph_consistent(&g4);
+}
+
+#[test]
+fn from_edges() {
+    let n = NodeIndex::new;
+    let gr = Graph::<(), (), Undirected>::from_edges(&[
+        (0, 1), (0, 2), (0, 3),
+        (1, 2), (1, 3),
+        (2, 3),
+    ]);
+    assert_eq!(gr.node_count(), 4);
+    assert_eq!(gr.edge_count(), 6);
+    assert_eq!(gr.neighbors(n(0)).count(), 3);
+    assert_eq!(gr.neighbors(n(1)).count(), 3);
+    assert_eq!(gr.neighbors(n(2)).count(), 3);
+    assert_eq!(gr.neighbors(n(3)).count(), 3);
+    assert_graph_consistent(&gr);
+}
+
+#[test]
+fn retain() {
+    let mut gr = Graph::<i32, i32, Undirected>::from_edges(&[
+        (0, 1, 2),
+        (1, 1, 1),
+        (0, 2, 0),
+        (1, 2, 3),
+        (2, 3, 3),
+    ]);
+    gr.retain_edges(|mut gr, i| {
+        if gr[i] <= 0 { false }
+        else {
+            gr[i] -= 1;
+            let (s, t) = gr.edge_endpoints(i).unwrap();
+            gr[s] += 1;
+            gr[t] += 1;
+
+            gr[i] > 0
+        }
+    });
+
+    assert_eq!(gr.edge_count(), 3);
+    assert_eq!(gr[n(0)], 1);
+    assert_eq!(gr[n(1)], 4);
+    assert_eq!(gr[n(2)], 2);
+    assert_eq!(gr[n(3)], 1);
+    assert!(gr.find_edge(n(1), n(1)).is_none());
+    assert!(gr.find_edge(n(0), n(2)).is_none());
+    assert_graph_consistent(&gr);
+}
+
+fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>)
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    assert_eq!(g.node_count(), g.node_indices().count());
+    assert_eq!(g.edge_count(), g.edge_indices().count());
+    for edge in g.raw_edges() {
+        assert!(g.find_edge(edge.source(), edge.target()).is_some(),
+                "Edge not in graph! {:?} to {:?}", edge.source(), edge.target());
+    }
+}
+
+#[test]
+fn neighbors_selfloops() {
+    // Directed graph
+    let mut gr = Graph::<_ ,()>::new();
+    let a = gr.add_node("a");
+    let b = gr.add_node("b");
+    let c = gr.add_node("c");
+    gr.extend_with_edges(&[
+        (a, a),
+        (a, b),
+        (c, a),
+        (a, a),
+    ]);
+
+    let out_edges = [a, a, b];
+    let in_edges = [a, a, c];
+    let undir_edges = [a, a, b, c];
+    let mut seen_out = gr.neighbors(a).collect::<Vec<_>>();
+    seen_out.sort();
+    assert_eq!(&seen_out, &out_edges);
+    let mut seen_in = gr.neighbors_directed(a, Incoming).collect::<Vec<_>>();
+    seen_in.sort();
+    assert_eq!(&seen_in, &in_edges);
+
+    let mut seen_undir = gr.neighbors_undirected(a).collect::<Vec<_>>();
+    seen_undir.sort();
+    assert_eq!(&seen_undir, &undir_edges);
+
+    let mut seen_out = gr.edges(a).map(|e| e.target()).collect::<Vec<_>>();
+    seen_out.sort();
+    assert_eq!(&seen_out, &out_edges);
+
+    let mut seen_walk = Vec::new();
+    let mut walk = gr.neighbors(a).detach();
+    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    seen_walk.sort();
+    assert_eq!(&seen_walk, &out_edges);
+
+    seen_walk.clear();
+    let mut walk = gr.neighbors_directed(a, Incoming).detach();
+    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    seen_walk.sort();
+    assert_eq!(&seen_walk, &in_edges);
+
+    seen_walk.clear();
+    let mut walk = gr.neighbors_undirected(a).detach();
+    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    seen_walk.sort();
+    assert_eq!(&seen_walk, &undir_edges);
+
+    // Undirected graph
+    let mut gr: Graph<_, (), _> = Graph::new_undirected();
+    let a = gr.add_node("a");
+    let b = gr.add_node("b");
+    let c = gr.add_node("c");
+    gr.extend_with_edges(&[
+        (a, a),
+        (a, b),
+        (c, a),
+    ]);
+
+    let out_edges = [a, b, c];
+    let in_edges = [a, b, c];
+    let undir_edges = [a, b, c];
+    let mut seen_out = gr.neighbors(a).collect::<Vec<_>>();
+    seen_out.sort();
+    assert_eq!(&seen_out, &out_edges);
+
+    let mut seen_out = gr.edges(a).map(|e| e.target()).collect::<Vec<_>>();
+    seen_out.sort();
+    assert_eq!(&seen_out, &out_edges);
+
+    let mut seen_in = gr.neighbors_directed(a, Incoming).collect::<Vec<_>>();
+    seen_in.sort();
+    assert_eq!(&seen_in, &in_edges);
+
+    let mut seen_undir = gr.neighbors_undirected(a).collect::<Vec<_>>();
+    seen_undir.sort();
+    assert_eq!(&seen_undir, &undir_edges);
+}
+
+
+fn degree<'a, G>(g: G, node: G::NodeId) -> usize
+    where G: IntoNeighbors,
+          G::NodeId: PartialEq,
+{
+    // self loops count twice
+    let original_node = node.clone();
+    let mut degree = 0;
+    for v in g.neighbors(node) {
+        degree += if v == original_node { 2 } else { 1 };
+    }
+    degree
+}
+
+#[cfg(feature = "graphmap")]
+#[test]
+fn degree_sequence() {
+    let mut gr = Graph::<usize, (), Undirected>::from_edges(&[
+        (0, 1),
+        (1, 2), (1, 3),
+        (2, 4), (3, 4),
+        (4, 4),
+        (4, 5), (3, 5),
+    ]);
+    gr.add_node(0); // add isolated node
+    let mut degree_sequence = gr.node_indices()
+                                .map(|i| degree(&gr, i))
+                                .collect::<Vec<_>>();
+
+    degree_sequence.sort_by(|x, y| Ord::cmp(y, x));
+    assert_eq!(&degree_sequence, &[5, 3, 3, 2, 2, 1, 0]);
+
+    let mut gr = GraphMap::<_, (), Undirected>::from_edges(&[
+        (0, 1),
+        (1, 2), (1, 3),
+        (2, 4), (3, 4),
+        (4, 4),
+        (4, 5), (3, 5),
+    ]);
+    gr.add_node(6); // add isolated node
+    let mut degree_sequence = gr.nodes()
+                                .map(|i| degree(&gr, i))
+                                .collect::<Vec<_>>();
+
+    degree_sequence.sort_by(|x, y| Ord::cmp(y, x));
+    assert_eq!(&degree_sequence, &[5, 3, 3, 2, 2, 1, 0]);
+}
+
+#[test]
+fn neighbor_order() {
+    let mut gr = Graph::new();
+    let a = gr.add_node("a");
+    let b = gr.add_node("b");
+    let c = gr.add_node("c");
+    gr.add_edge(a, b, 0);
+    gr.add_edge(a, a, 1);
+
+    gr.add_edge(c, a, 2);
+
+    gr.add_edge(a, c, 3);
+
+    gr.add_edge(c, a, 4);
+    gr.add_edge(b, a, 5);
+
+    // neighbors (edges) are in lifo order, if it's a directed graph
+    assert_eq!(gr.neighbors(a).collect::<Vec<_>>(),
+               vec![c, a, b]);
+    assert_eq!(gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(),
+               vec![b, c, c, a]);
+}
+
+#[test]
+fn dot() {
+    // test alternate formatting
+    #[derive(Debug)]
+    struct Record {
+        a: i32,
+        b: &'static str,
+    };
+    let mut gr = Graph::new();
+    let a = gr.add_node(Record { a: 1, b: "abc" });
+    gr.add_edge(a, a, (1, 2));
+    let dot_output = format!("{:#?}", Dot::new(&gr));
+    assert_eq!(dot_output,
+r#"digraph {
+    0 [label="Record {\l    a: 1,\l    b: \"abc\"\l}\l"]
+    0 -> 0 [label="(\l    1,\l    2\l)\l"]
+}
+"#);
+}
+
+#[test]
+fn filtered() {
+    let mut g = Graph::new();
+    let a = g.add_node("A");
+    let b = g.add_node("B");
+    let c = g.add_node("C");
+    let d = g.add_node("D");
+    let e = g.add_node("E");
+    let f = g.add_node("F");
+    g.add_edge(a, b, 7);
+    g.add_edge(c, a, 9);
+    g.add_edge(a, d, 14);
+    g.add_edge(b, c, 10);
+    g.add_edge(d, c, 2);
+    g.add_edge(d, e, 9);
+    g.add_edge(b, f, 15);
+    g.add_edge(c, f, 11);
+    g.add_edge(e, f, 6);
+    println!("{:?}", g);
+
+    let filt = NodeFiltered(&g, |n: NodeIndex| n != c && n != e);
+
+    let mut dfs = DfsPostOrder::new(&filt, a);
+    let mut po = Vec::new();
+    while let Some(nx) = dfs.next(&filt) {
+        println!("Next: {:?}", nx);
+        po.push(nx);
+    }
+    assert_eq!(set(po), set(g.node_identifiers().filter(|n| (filt.1)(*n))));
+}
+
+
+
+#[test]
+fn dfs_visit() {
+    use petgraph::visit::{Visitable, VisitMap};
+    use petgraph::visit::DfsEvent::*;
+    use petgraph::visit::{Time, depth_first_search};
+    use petgraph::visit::Control;
+    let gr: Graph<(), ()> = Graph::from_edges(&[
+        (0, 5), (0, 2), (0, 3), (0, 1),
+        (1, 3),
+        (2, 3), (2, 4),
+        (4, 0), (4, 5),
+    ]);
+
+    let invalid_time = Time(!0);
+    let mut discover_time = vec![invalid_time; gr.node_count()];
+    let mut finish_time = vec![invalid_time; gr.node_count()];
+    let mut has_tree_edge = gr.visit_map();
+    let mut edges = HashSet::new();
+    depth_first_search(&gr, Some(n(0)), |evt| {
+        println!("Event: {:?}", evt);
+        match evt {
+            Discover(n, t) => discover_time[n.index()] = t,
+            Finish(n, t) => finish_time[n.index()] = t,
+            TreeEdge(u, v) => {
+                // v is an ancestor of u
+                assert!(has_tree_edge.visit(v), "Two tree edges to {:?}!", v);
+                assert!(discover_time[v.index()] == invalid_time);
+                assert!(discover_time[u.index()] != invalid_time);
+                assert!(finish_time[u.index()] == invalid_time);
+                edges.insert((u, v));
+            }
+            BackEdge(u, v) => {
+                // u is an ancestor of v
+                assert!(discover_time[v.index()] != invalid_time);
+                assert!(finish_time[v.index()] == invalid_time);
+                edges.insert((u, v));
+            }
+            CrossForwardEdge(u, v) => {
+                edges.insert((u, v));
+            }
+        }
+    });
+    assert!(discover_time.iter().all(|x| *x != invalid_time));
+    assert!(finish_time.iter().all(|x| *x != invalid_time));
+    assert_eq!(edges.len(), gr.edge_count());
+    assert_eq!(edges, set(gr.edge_references().map(|e| (e.source(), e.target()))));
+    println!("{:?}", discover_time);
+    println!("{:?}", finish_time);
+
+    // find path from 0 to 4
+    let mut predecessor = vec![NodeIndex::end(); gr.node_count()];
+    let start = n(0);
+    let goal = n(4);
+    let ret = depth_first_search(&gr, Some(start), |event| {
+        if let TreeEdge(u, v) = event {
+            predecessor[v.index()] = u;
+            if v == goal {
+                return Control::Break(u);
+            }
+        }
+        Control::Continue
+    });
+    // assert we did terminate early
+    assert!(ret.break_value().is_some());
+    assert!(predecessor.iter().any(|x| *x == NodeIndex::end()));
+
+    let mut next = goal;
+    let mut path = vec![next];
+    while next != start {
+        let pred = predecessor[next.index()];
+        path.push(pred);
+        next = pred;
+    }
+    path.reverse();
+    assert_eq!(&path, &[n(0), n(2), n(4)]);
+}
+
+
+#[test]
+fn filtered_post_order() {
+    use petgraph::visit::NodeFiltered;
+
+    let mut gr: Graph<(), ()> = Graph::from_edges(&[
+        (0, 2),
+        (1, 2),
+        (0, 3),
+        (1, 4),
+        (2, 4),
+        (4, 5),
+        (3, 5),
+    ]);
+    // map reachable nodes
+    let mut dfs = Dfs::new(&gr, n(0));
+    while let Some(_) = dfs.next(&gr) { }
+
+    let map = dfs.discovered;
+    gr.add_edge(n(0), n(1), ());
+    let mut po = Vec::new();
+    let mut dfs = DfsPostOrder::new(&gr, n(0));
+    let f = NodeFiltered(&gr, map);
+    while let Some(n) = dfs.next(&f) {
+        po.push(n);
+    }
+    assert!(!po.contains(&n(1)));
+}
+
+#[test]
+fn filter_elements() {
+    use petgraph::data::Element::{Node, Edge};
+    use petgraph::data::FromElements;
+    use petgraph::data::ElementIterator;
+    let elements = vec![
+        Node { weight: "A"},
+        Node { weight: "B"},
+        Node { weight: "C"},
+        Node { weight: "D"},
+        Node { weight: "E"},
+        Node { weight: "F"},
+
+        Edge { source: 0, target: 1, weight: 7 },
+        Edge { source: 2, target: 0, weight: 9 },
+        Edge { source: 0, target: 3, weight: 14 },
+        Edge { source: 1, target: 2, weight: 10 },
+        Edge { source: 3, target: 2, weight: 2 },
+        Edge { source: 3, target: 4, weight: 9 },
+        Edge { source: 1, target: 5, weight: 15 },
+        Edge { source: 2, target: 5, weight: 11 },
+        Edge { source: 4, target: 5, weight: 6 },
+    ];
+    let mut g = DiGraph::<_, _>::from_elements(elements.iter().cloned());
+    println!("{:#?}", g);
+    assert!(g.contains_edge(n(1), n(5)));
+    let g2 = DiGraph::<_, _>::from_elements(elements.iter().cloned().filter_elements(|elt| {
+        match elt {
+            Node { ref weight } if **weight == "B" => false,
+            _ => true,
+        }
+    }));
+    println!("{:#?}", g2);
+    g.remove_node(n(1));
+    assert!(is_isomorphic_matching(&g, &g2, PartialEq::eq, PartialEq::eq));
+}
+
+#[test]
+fn test_edge_filtered() {
+    use petgraph::algo::connected_components;
+    use petgraph::visit::EdgeFiltered;
+    use petgraph::visit::IntoEdgeReferences;
+
+    let gr = UnGraph::<(), _>::from_edges(&[
+            // cycle
+            (0, 1, 7),
+            (1, 2, 9),
+            (2, 1, 14),
+
+            // cycle
+            (3, 4, 10),
+            (4, 5, 2),
+            (5, 3, 9),
+
+            // cross edges
+            (0, 3, -1),
+            (1, 4, -2),
+            (2, 5, -3),
+    ]);
+    assert_eq!(connected_components(&gr), 1);
+    let positive_edges = EdgeFiltered::from_fn(&gr, |edge| *edge.weight() >= 0);
+    assert_eq!(positive_edges.edge_references().count(), 6);
+    assert!(positive_edges.edge_references().all(|edge| *edge.weight() >= 0));
+    assert_eq!(connected_components(&positive_edges), 2);
+
+    let mut dfs = DfsPostOrder::new(&positive_edges, n(0));
+    while let Some(_) = dfs.next(&positive_edges) { }
+
+    let n = n::<u32>;
+    for node in &[n(0), n(1), n(2)] {
+        assert!(dfs.discovered.is_visited(node));
+    }
+    for node in &[n(3), n(4), n(5)] {
+        assert!(!dfs.discovered.is_visited(node));
+    }
+}
+
+#[test]
+fn test_dominators_simple_fast() {
+    // Construct the following graph:
+    //
+    //                                  .-----.
+    //                                  |     <--------------------------------.
+    //          .--------+--------------|  r  |--------------.                 |
+    //          |        |              |     |              |                 |
+    //          |        |              '-----'              |                 |
+    //          |     .--V--.                             .--V--.              |
+    //          |     |     |                             |     |              |
+    //          |     |  b  |                             |  c  |--------.     |
+    //          |     |     |                             |     |        |     |
+    //          |     '-----'                             '-----'        |     |
+    //       .--V--.     |                                   |        .--V--.  |
+    //       |     |     |                                   |        |     |  |
+    //       |  a  <-----+                                   |   .----|  g  |  |
+    //       |     |     |                              .----'   |    |     |  |
+    //       '-----'     |                              |        |    '-----'  |
+    //          |        |                              |        |       |     |
+    //       .--V--.     |    .-----.                .--V--.     |       |     |
+    //       |     |     |    |     |                |     |     |       |     |
+    //       |  d  <-----+---->  e  <----.           |  f  |     |       |     |
+    //       |     |          |     |    |           |     |     |       |     |
+    //       '-----'          '-----'    |           '-----'     |       |     |
+    //          |     .-----.    |       |              |        |    .--V--.  |
+    //          |     |     |    |       |              |      .-'    |     |  |
+    //          '----->  l  |    |       |              |      |      |  j  |  |
+    //                |     |    '--.    |              |      |      |     |  |
+    //                '-----'       |    |              |      |      '-----'  |
+    //                   |       .--V--. |              |   .--V--.      |     |
+    //                   |       |     | |              |   |     |      |     |
+    //                   '------->  h  |-'              '--->  i  <------'     |
+    //                           |     |          .--------->     |            |
+    //                           '-----'          |         '-----'            |
+    //                              |          .-----.         |               |
+    //                              |          |     |         |               |
+    //                              '---------->  k  <---------'               |
+    //                                         |     |                         |
+    //                                         '-----'                         |
+    //                                            |                            |
+    //                                            '----------------------------'
+    //
+    // This graph has the following dominator tree:
+    //
+    //     r
+    //     |-- a
+    //     |-- b
+    //     |-- c
+    //     |   |-- f
+    //     |   `-- g
+    //     |       `-- j
+    //     |-- d
+    //     |   `-- l
+    //     |-- e
+    //     |-- i
+    //     |-- k
+    //     `-- h
+    //
+    // This graph and dominator tree are taken from figures 1 and 2 of "A Fast
+    // Algorithm for Finding Dominators in a Flowgraph" by Lengauer et al:
+    // http://www.cs.princeton.edu/courses/archive/spr03/cs423/download/dominators.pdf.
+
+    let mut graph = DiGraph::<_, _>::new();
+    
+    let r = graph.add_node("r");
+    let a = graph.add_node("a");
+    let b = graph.add_node("b");
+    let c = graph.add_node("c");
+    let d = graph.add_node("d");
+    let e = graph.add_node("e");
+    let f = graph.add_node("f");
+    let g = graph.add_node("g");
+    let h = graph.add_node("h");
+    let i = graph.add_node("i");
+    let j = graph.add_node("j");
+    let k = graph.add_node("k");
+    let l = graph.add_node("l");
+
+    graph.add_edge(r, a, ());
+    graph.add_edge(r, b, ());
+    graph.add_edge(r, c, ());
+    graph.add_edge(a, d, ());
+    graph.add_edge(b, a, ());
+    graph.add_edge(b, d, ());
+    graph.add_edge(b, e, ());
+    graph.add_edge(c, f, ());
+    graph.add_edge(c, g, ());
+    graph.add_edge(d, l, ());
+    graph.add_edge(e, h, ());
+    graph.add_edge(f, i, ());
+    graph.add_edge(g, i, ());
+    graph.add_edge(g, j, ());
+    graph.add_edge(h, e, ());
+    graph.add_edge(h, k, ());
+    graph.add_edge(i, k, ());
+    graph.add_edge(j, i, ());
+    graph.add_edge(k, r, ());
+    graph.add_edge(k, i, ());
+    graph.add_edge(l, h, ());
+
+    let doms = dominators::simple_fast(&graph, r);
+
+    assert_eq!(doms.root(), r);
+    assert_eq!(doms.immediate_dominator(r), None,
+               "The root node has no idom");
+
+    assert_eq!(doms.immediate_dominator(a), Some(r),
+               "r is the immediate dominator of a");
+    assert_eq!(doms.immediate_dominator(b), Some(r),
+               "r is the immediate dominator of b");
+    assert_eq!(doms.immediate_dominator(c), Some(r),
+               "r is the immediate dominator of c");
+    assert_eq!(doms.immediate_dominator(f), Some(c),
+               "c is the immediate dominator of f");
+    assert_eq!(doms.immediate_dominator(g), Some(c),
+               "c is the immediate dominator of g");
+    assert_eq!(doms.immediate_dominator(j), Some(g),
+               "g is the immediate dominator of j");
+    assert_eq!(doms.immediate_dominator(d), Some(r),
+               "r is the immediate dominator of d");
+    assert_eq!(doms.immediate_dominator(l), Some(d),
+               "d is the immediate dominator of l");
+    assert_eq!(doms.immediate_dominator(e), Some(r),
+               "r is the immediate dominator of e");
+    assert_eq!(doms.immediate_dominator(i), Some(r),
+               "r is the immediate dominator of i");
+    assert_eq!(doms.immediate_dominator(k), Some(r),
+               "r is the immediate dominator of k");
+    assert_eq!(doms.immediate_dominator(h), Some(r),
+               "r is the immediate dominator of h");
+
+    let mut graph = graph.clone();
+    let z = graph.add_node("z");
+    let doms = dominators::simple_fast(&graph, r);
+    assert_eq!(doms.immediate_dominator(z), None,
+               "nodes that aren't reachable from the root do not have an idom");
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/graphmap.rs
@@ -0,0 +1,301 @@
+#![cfg(feature = "graphmap")]
+extern crate petgraph;
+
+use std::collections::HashSet;
+use std::fmt;
+
+use petgraph::prelude::*;
+use petgraph::visit::{ Walker, };
+
+use petgraph::algo::{ dijkstra, };
+
+use petgraph::dot::{Dot, Config};
+
+#[test]
+fn simple() {
+    //let root = TypedArena::<Node<_>>::new();
+    let mut gr = UnGraphMap::new();
+    //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string())));
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let f = gr.add_node("F");
+    gr.add_edge(a, b, 7);
+    gr.add_edge(a, c, 9);
+    gr.add_edge(a, d, 14);
+    gr.add_edge(b, c, 10);
+    gr.add_edge(c, d, 2);
+    gr.add_edge(d, e, 9);
+    gr.add_edge(b, f, 15);
+    gr.add_edge(c, f, 11);
+
+    assert!(gr.add_edge(e, f, 5).is_none());
+
+    // duplicate edges
+    assert_eq!(gr.add_edge(f, b, 16), Some(15));
+    assert_eq!(gr.add_edge(f, e, 6), Some(5));
+    println!("{:?}", gr);
+    println!("{}", Dot::with_config(&gr, &[]));
+
+    assert_eq!(gr.node_count(), 6);
+    assert_eq!(gr.edge_count(), 9);
+
+    // check updated edge weight
+    assert_eq!(gr.edge_weight(e, f), Some(&6));
+    let scores = dijkstra(&gr, a, None, |e| *e.weight());
+    let mut scores: Vec<_> = scores.into_iter().collect();
+    scores.sort();
+    assert_eq!(scores,
+       vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]);
+}
+
+#[test]
+fn remov()
+{
+    let mut g = UnGraphMap::new();
+    g.add_node(1);
+    g.add_node(2);
+    g.add_edge(1, 2, -1);
+
+    assert_eq!(g.edge_weight(1, 2), Some(&-1));
+    assert_eq!(g.edge_weight(2, 1), Some(&-1));
+    assert_eq!(g.neighbors(1).count(), 1);
+
+    let noexist = g.remove_edge(2, 3);
+    assert_eq!(noexist, None);
+
+    let exist = g.remove_edge(2, 1);
+    assert_eq!(exist, Some(-1));
+    assert_eq!(g.edge_count(), 0);
+    assert_eq!(g.edge_weight(1, 2), None);
+    assert_eq!(g.edge_weight(2, 1), None);
+    assert_eq!(g.neighbors(1).count(), 0);
+}
+
+#[test]
+fn remove_directed()
+{
+    let mut g = GraphMap::<_, _, Directed>::with_capacity(0, 0);
+    g.add_edge(1, 2, -1);
+    println!("{:?}", g);
+
+    assert_eq!(g.edge_weight(1, 2), Some(&-1));
+    assert_eq!(g.edge_weight(2, 1), None);
+    assert_eq!(g.neighbors(1).count(), 1);
+
+    let noexist = g.remove_edge(2, 3);
+    assert_eq!(noexist, None);
+
+    let exist = g.remove_edge(2, 1);
+    assert_eq!(exist, None);
+    let exist = g.remove_edge(1, 2);
+    assert_eq!(exist, Some(-1));
+    println!("{:?}", g);
+    assert_eq!(g.edge_count(), 0);
+    assert_eq!(g.edge_weight(1, 2), None);
+    assert_eq!(g.edge_weight(2, 1), None);
+    assert_eq!(g.neighbors(1).count(), 0);
+}
+
+#[test]
+fn dfs() {
+    let mut gr = UnGraphMap::default();
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    let k = gr.add_node("K");
+    // Z is disconnected.
+    let z = gr.add_node("Z");
+    gr.add_edge(h, i, 1.);
+    gr.add_edge(h, j, 3.);
+    gr.add_edge(i, j, 1.);
+    gr.add_edge(i, k, 2.);
+
+    println!("{:?}", gr);
+
+    {
+        let mut cnt = 0;
+        let mut dfs = Dfs::new(&gr, h);
+        while let Some(_) = dfs.next(&gr) { cnt += 1; }
+        assert_eq!(cnt, 4);
+    }
+    {
+        let mut cnt = 0;
+        let mut dfs = Dfs::new(&gr, z);
+        while let Some(_) = dfs.next(&gr) { cnt += 1; }
+        assert_eq!(cnt, 1);
+    }
+
+    assert_eq!(Dfs::new(&gr, h).iter(&gr).count(), 4);
+    assert_eq!(Dfs::new(&gr, i).iter(&gr).count(), 4);
+    assert_eq!(Dfs::new(&gr, z).iter(&gr).count(), 1);
+}
+
+#[test]
+fn edge_iterator() {
+    let mut gr = UnGraphMap::new();
+    let h = gr.add_node("H");
+    let i = gr.add_node("I");
+    let j = gr.add_node("J");
+    let k = gr.add_node("K");
+    gr.add_edge(h, i, 1);
+    gr.add_edge(h, j, 2);
+    gr.add_edge(i, j, 3);
+    gr.add_edge(i, k, 4);
+
+    let real_edges: HashSet<_> = gr.all_edges().map(|(a, b, &w)| (a, b, w)).collect();
+    let expected_edges: HashSet<_> = vec![
+        ("H", "I", 1),
+        ("H", "J", 2),
+        ("I", "J", 3),
+        ("I", "K", 4)
+    ].into_iter().collect();
+
+    assert_eq!(real_edges, expected_edges);
+}
+
+#[test]
+fn from_edges() {
+    let gr = GraphMap::<_, _, Undirected>::from_edges(&[
+        ("a", "b", 1),
+        ("a", "c", 2),
+        ("c", "d", 3),
+    ]);
+    assert_eq!(gr.node_count(), 4);
+    assert_eq!(gr.edge_count(), 3);
+    assert_eq!(gr[("a", "c")], 2);
+
+    let gr = GraphMap::<_, (), Undirected>::from_edges(&[
+        (0, 1), (0, 2), (0, 3),
+        (1, 2), (1, 3),
+        (2, 3),
+    ]);
+    assert_eq!(gr.node_count(), 4);
+    assert_eq!(gr.edge_count(), 6);
+    assert_eq!(gr.neighbors(0).count(), 3);
+    assert_eq!(gr.neighbors(1).count(), 3);
+    assert_eq!(gr.neighbors(2).count(), 3);
+    assert_eq!(gr.neighbors(3).count(), 3);
+
+    println!("{:?}", Dot::with_config(&gr, &[Config::EdgeNoLabel]));
+}
+
+
+#[test]
+fn graphmap_directed() {
+    //let root = TypedArena::<Node<_>>::new();
+    let mut gr = DiGraphMap::<_, ()>::with_capacity(0, 0);
+    //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string())));
+    let a = gr.add_node("A");
+    let b = gr.add_node("B");
+    let c = gr.add_node("C");
+    let d = gr.add_node("D");
+    let e = gr.add_node("E");
+    let edges = [
+        (a, b),
+        (a, c),
+        (a, d),
+        (b, c),
+        (c, d),
+        (d, e),
+        (b, b),
+    ];
+    gr.extend(&edges);
+
+    // Add reverse edges -- ok!
+    assert!(gr.add_edge(e, d, ()).is_none());
+    // duplicate edge - no
+    assert!(!gr.add_edge(a, b, ()).is_none());
+
+    // duplicate self loop - no
+    assert!(!gr.add_edge(b, b, ()).is_none());
+    println!("{:#?}", gr);
+}
+
+fn assert_sccs_eq<N>(mut res: Vec<Vec<N>>, mut answer: Vec<Vec<N>>)
+    where N: Ord + fmt::Debug,
+{
+    // normalize the result and compare with the answer.
+    for scc in &mut res {
+        scc.sort();
+    }
+    res.sort();
+    for scc in &mut answer {
+        scc.sort();
+    }
+    answer.sort();
+    assert_eq!(res, answer);
+}
+
+#[test]
+fn scc() {
+    let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[
+        (6, 0, 0),
+        (0, 3, 1),
+        (3, 6, 2),
+        (8, 6, 3),
+        (8, 2, 4),
+        (2, 5, 5),
+        (5, 8, 6),
+        (7, 5, 7),
+        (1, 7, 8),
+        (7, 4, 9),
+        (4, 1, 10)]);
+
+    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
+        vec![0, 3, 6],
+        vec![1, 4, 7],
+        vec![2, 5, 8],
+    ]);
+}
+
+#[test]
+fn test_into_graph() {
+    let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[
+        (6, 0, 0),
+        (0, 3, 1),
+        (3, 6, 2),
+        (8, 6, 3),
+        (8, 2, 4),
+        (2, 5, 5),
+        (5, 8, 6),
+        (7, 5, 7),
+        (1, 7, 8),
+        (7, 4, 9),
+        (4, 1, 10)]);
+
+    let graph: Graph<_, _, _> = gr.clone().into_graph();
+    println!("{}", Dot::new(&gr));
+    println!("{}", Dot::new(&graph));
+
+    // node weigths in `graph` are node identifiers in `gr`.
+    for edge in graph.edge_references() {
+        let a = edge.source();
+        let b = edge.target();
+        let aw = graph[a];
+        let bw = graph[b];
+        assert_eq!(&gr[(aw, bw)], edge.weight());
+    }
+}
+
+#[test]
+fn test_all_edges_mut() {
+    // graph with edge weights equal to in+out
+    let mut graph: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[
+        (0, 1, 1),
+        (1, 2, 3),
+        (2, 0, 2),
+    ]);
+
+    // change it so edge weight is equal to 2 * (in+out)
+    for (start, end, weight) in graph.all_edges_mut() {
+        *weight = (start + end) * 2;
+    }
+
+    // test it
+    for (start, end, weight) in graph.all_edges() {
+        assert_eq!((start + end) * 2, *weight);
+    }
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/iso.rs
@@ -0,0 +1,565 @@
+extern crate petgraph;
+
+use petgraph::prelude::*;
+use petgraph::{
+    EdgeType,
+};
+use petgraph::graph::{
+    node_index,
+    edge_index,
+};
+
+use petgraph::algo::{
+    is_isomorphic,
+    is_isomorphic_matching,
+};
+
+/// Petersen A and B are isomorphic
+///
+/// http://www.dharwadker.org/tevet/isomorphism/
+const PETERSEN_A: &'static str = "
+ 0 1 0 0 1 0 1 0 0 0 
+ 1 0 1 0 0 0 0 1 0 0 
+ 0 1 0 1 0 0 0 0 1 0 
+ 0 0 1 0 1 0 0 0 0 1 
+ 1 0 0 1 0 1 0 0 0 0 
+ 0 0 0 0 1 0 0 1 1 0 
+ 1 0 0 0 0 0 0 0 1 1 
+ 0 1 0 0 0 1 0 0 0 1 
+ 0 0 1 0 0 1 1 0 0 0 
+ 0 0 0 1 0 0 1 1 0 0
+";
+
+const PETERSEN_B: &'static str = "
+ 0 0 0 1 0 1 0 0 0 1 
+ 0 0 0 1 1 0 1 0 0 0 
+ 0 0 0 0 0 0 1 1 0 1 
+ 1 1 0 0 0 0 0 1 0 0
+ 0 1 0 0 0 0 0 0 1 1 
+ 1 0 0 0 0 0 1 0 1 0 
+ 0 1 1 0 0 1 0 0 0 0 
+ 0 0 1 1 0 0 0 0 1 0 
+ 0 0 0 0 1 1 0 1 0 0 
+ 1 0 1 0 1 0 0 0 0 0
+";
+
+/// An almost full set, isomorphic
+const FULL_A: &'static str = "
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 0 1 1 1 0 1 
+ 1 1 1 1 1 1 1 1 1 1
+";
+
+const FULL_B: &'static str = "
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 0 1 1 1 0 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1 
+ 1 1 1 1 1 1 1 1 1 1
+";
+
+/// Praust A and B are not isomorphic
+const PRAUST_A: &'static str = "
+ 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+ 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 
+ 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 
+ 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 
+ 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 
+ 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 
+ 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 
+ 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0
+";
+
+const PRAUST_B: &'static str = "
+ 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+ 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 
+ 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 
+ 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 
+ 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 
+ 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 
+ 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 
+";
+
+const G1U: &'static str = "
+0 1 1 0 1
+1 0 1 0 0
+1 1 0 0 0
+0 0 0 0 0
+1 0 0 0 0
+";
+
+const G2U: &'static str = "
+0 1 0 1 0
+1 0 0 1 1
+0 0 0 0 0
+1 1 0 0 0
+0 1 0 0 0
+";
+
+const G4U: &'static str = "
+0 1 1 0 1
+1 0 0 1 0
+1 0 0 0 0
+0 1 0 0 0
+1 0 0 0 0
+";
+
+const G1D: &'static str = "
+0 1 1 0 1
+0 0 1 0 0
+0 0 0 0 0
+0 0 0 0 0
+0 0 0 0 0
+";
+
+const G4D: &'static str = "
+0 1 1 0 1
+0 0 0 1 0
+0 0 0 0 0
+0 0 0 0 0
+0 0 0 0 0
+";
+
+// G8 1,2 are not iso
+const G8_1: &'static str = "
+0 1 1 0 0 1 1 1
+1 0 1 0 1 0 1 1
+1 1 0 1 0 0 1 1
+0 0 1 0 1 1 1 1
+0 1 0 1 0 1 1 1
+1 0 0 1 1 0 1 1
+1 1 1 1 1 1 0 1
+1 1 1 1 1 1 1 0
+";
+
+const G8_2: &'static str = "
+0 1 0 1 0 1 1 1
+1 0 1 0 1 0 1 1
+0 1 0 1 0 1 1 1
+1 0 1 0 1 0 1 1
+0 1 0 1 0 1 1 1
+1 0 1 0 1 0 1 1
+1 1 1 1 1 1 0 1
+1 1 1 1 1 1 1 0
+";
+
+// G3 1,2 are not iso
+const G3_1: &'static str = "
+0 1 0
+1 0 1
+0 1 0
+";
+const G3_2: &'static str = "
+0 1 1
+1 0 1
+1 1 0
+";
+
+// Non-isomorphic due to selfloop difference
+const S1: &'static str = "
+1 1 1
+1 0 1
+1 0 0
+";
+const S2: &'static str = "
+1 1 1
+0 1 1
+1 0 0
+";
+
+/// Parse a text adjacency matrix format into a directed graph
+fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty>
+{
+    let mut gr = Graph::with_capacity(0, 0);
+    let s = s.trim();
+    let lines = s.lines().filter(|l| !l.is_empty());
+    for (row, line) in lines.enumerate() {
+        for (col, word) in line.split(' ')
+                                .filter(|s| s.len() > 0)
+                                .enumerate()
+        {
+            let has_edge = word.parse::<i32>().unwrap();
+            assert!(has_edge == 0 || has_edge == 1);
+            if has_edge == 0 {
+                continue;
+            }
+            while col >= gr.node_count() || row >= gr.node_count() {
+                gr.add_node(());
+            }
+            gr.update_edge(node_index(row), node_index(col), ());
+        }
+    }
+    gr
+}
+
+fn str_to_graph(s: &str) -> Graph<(), (), Undirected> {
+    parse_graph(s)
+}
+
+fn str_to_digraph(s: &str) -> Graph<(), (), Directed> {
+    parse_graph(s)
+}
+
+/*
+fn graph_to_ad_matrix<N, E, Ty: EdgeType>(g: &Graph<N,E,Ty>)
+{
+    let n = g.node_count();
+    for i in (0..n) {
+        for j in (0..n) {
+            let ix = NodeIndex::new(i);
+            let jx = NodeIndex::new(j);
+            let out = match g.find_edge(ix, jx) {
+                None => "0",
+                Some(_) => "1",
+            };
+            print!("{} ", out);
+        }
+        println!("");
+    }
+}
+*/
+
+#[test]
+fn petersen_iso()
+{
+    // The correct isomorphism is
+    // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9
+    let peta = str_to_digraph(PETERSEN_A);
+    let petb = str_to_digraph(PETERSEN_B);
+    /*
+    println!("{:?}", peta);
+    graph_to_ad_matrix(&peta);
+    println!("");
+    graph_to_ad_matrix(&petb);
+    */
+
+    assert!(petgraph::algo::is_isomorphic(&peta, &petb));
+}
+
+#[test]
+fn petersen_undir_iso()
+{
+    // The correct isomorphism is
+    // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9
+    let peta = str_to_digraph(PETERSEN_A);
+    let petb = str_to_digraph(PETERSEN_B);
+
+    assert!(petgraph::algo::is_isomorphic(&peta, &petb));
+}
+
+#[test]
+fn full_iso()
+{
+    let a = str_to_graph(FULL_A);
+    let b = str_to_graph(FULL_B);
+
+    assert!(petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn praust_dir_no_iso()
+{
+    let a = str_to_digraph(PRAUST_A);
+    let b = str_to_digraph(PRAUST_B);
+
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn praust_undir_no_iso()
+{
+    let a = str_to_graph(PRAUST_A);
+    let b = str_to_graph(PRAUST_B);
+
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn coxeter_di_iso()
+{
+    // The correct isomorphism is
+    let a = str_to_digraph(COXETER_A);
+    let b = str_to_digraph(COXETER_B);
+    assert!(petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn coxeter_undi_iso()
+{
+    // The correct isomorphism is
+    let a = str_to_graph(COXETER_A);
+    let b = str_to_graph(COXETER_B);
+    assert!(petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn g14_dir_not_iso()
+{
+    let a = str_to_digraph(G1D);
+    let b = str_to_digraph(G4D);
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn g14_undir_not_iso()
+{
+    let a = str_to_digraph(G1U);
+    let b = str_to_digraph(G4U);
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn g12_undir_iso()
+{
+    let a = str_to_digraph(G1U);
+    let b = str_to_digraph(G2U);
+    assert!(petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn g3_not_iso()
+{
+    let a = str_to_digraph(G3_1);
+    let b = str_to_digraph(G3_2);
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn g8_not_iso()
+{
+    let a = str_to_digraph(G8_1);
+    let b = str_to_digraph(G8_2);
+    assert_eq!(a.edge_count(), b.edge_count());
+    assert_eq!(a.node_count(), b.node_count());
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn s12_not_iso()
+{
+    let a = str_to_digraph(S1);
+    let b = str_to_digraph(S2);
+    assert_eq!(a.edge_count(), b.edge_count());
+    assert_eq!(a.node_count(), b.node_count());
+    assert!(!petgraph::algo::is_isomorphic(&a, &b));
+}
+
+#[test]
+fn iso1()
+{
+    let mut g0 = Graph::<_, ()>::new();
+    let mut g1 = Graph::<_, ()>::new();
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+
+    // very simple cases
+    let a0 = g0.add_node(0);
+    let a1 = g1.add_node(0);
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    let b0 = g0.add_node(1);
+    let b1 = g1.add_node(1);
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    let _ = g0.add_node(2);
+    assert!(!petgraph::algo::is_isomorphic(&g0, &g1));
+    let _ = g1.add_node(2);
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    g0.add_edge(a0, b0, ());
+    assert!(!petgraph::algo::is_isomorphic(&g0, &g1));
+    g1.add_edge(a1, b1, ());
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+}
+
+#[test]
+fn iso2()
+{
+    let mut g0 = Graph::<_, ()>::new();
+    let mut g1 = Graph::<_, ()>::new();
+
+    let a0 = g0.add_node(0);
+    let a1 = g1.add_node(0);
+    let b0 = g0.add_node(1);
+    let b1 = g1.add_node(1);
+    let c0 = g0.add_node(2);
+    let c1 = g1.add_node(2);
+    g0.add_edge(a0, b0, ());
+    g1.add_edge(c1, b1, ());
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    // a -> b
+    // a -> c
+    // vs.
+    // c -> b
+    // c -> a
+    g0.add_edge(a0, c0, ());
+    g1.add_edge(c1, a1, ());
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+
+    // add
+    // b -> c
+    // vs
+    // b -> a
+
+    let _ = g0.add_edge(b0, c0, ());
+    let _ = g1.add_edge(b1, a1, ());
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    let d0 = g0.add_node(3);
+    let d1 = g1.add_node(3);
+    let e0 = g0.add_node(4);
+    let e1 = g1.add_node(4);
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+    // add
+    // b -> e -> d
+    // vs
+    // b -> d -> e
+    g0.add_edge(b0, e0, ());
+    g0.add_edge(e0, d0, ());
+    g1.add_edge(b1, d1, ());
+    g1.add_edge(d1, e1, ());
+    assert!(petgraph::algo::is_isomorphic(&g0, &g1));
+}
+
+#[test]
+fn iso_matching() {
+    let g0 = Graph::<(), _>::from_edges(&[
+        (0, 0, 1),
+        (0, 1, 2),
+        (0, 2, 3),
+        (1, 2, 4),
+    ]);
+
+    let mut g1 = g0.clone();
+    g1[edge_index(0)] = 0;
+    assert!(!is_isomorphic_matching(&g0, &g1, |x, y| x == y, |x, y| x == y));
+    let mut g2 = g0.clone();
+    g2[edge_index(1)] = 0;
+    assert!(!is_isomorphic_matching(&g0, &g2, |x, y| x == y, |x, y| x == y));
+}
+
+// isomorphism isn't correct for multigraphs.
+// Keep this testcase to document how
+#[should_panic]
+#[test]
+fn iso_multigraph_failure() {
+    let g0 = Graph::<(), ()>::from_edges(&[
+        (0, 0),
+        (0, 0),
+        (0, 1),
+        (1, 1),
+        (1, 1),
+        (1, 0),
+    ]);
+
+    let g1 = Graph::<(), ()>::from_edges(&[
+        (0, 0),
+        (0, 1),
+        (0, 1),
+        (1, 1),
+        (1, 0),
+        (1, 0),
+    ]);
+    assert!(!is_isomorphic(&g0, &g1));
+}
+
+
+/// Isomorphic pair
+const COXETER_A: &'static str = "
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
+ 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
+ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
+ 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 1 0 0 0 0 0 1 0 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 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 1 0 0 0 0 0 0 0 1 0 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 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 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 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 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 1 0 1 0 0 0 0 0 1 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 
+";
+
+const COXETER_B: &'static str = "
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 
+ 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 1 0 0 0 0 0 1 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 
+ 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
+ 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
+ 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
+ 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
+ 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 1 
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0
+";
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/quickcheck.rs
@@ -0,0 +1,926 @@
+#![cfg(feature="quickcheck")]
+#[macro_use] extern crate quickcheck;
+extern crate rand;
+extern crate petgraph;
+#[macro_use] extern crate defmac;
+
+extern crate odds;
+extern crate itertools;
+
+mod utils;
+
+use utils::Small;
+
+use odds::prelude::*;
+use std::collections::HashSet;
+use std::hash::Hash;
+
+use rand::Rng;
+use itertools::assert_equal;
+use itertools::cloned;
+
+use petgraph::prelude::*;
+use petgraph::{
+    EdgeType, 
+};
+use petgraph::dot::{Dot, Config};
+use petgraph::algo::{
+    condensation,
+    min_spanning_tree,
+    is_cyclic_undirected,
+    is_cyclic_directed,
+    is_isomorphic,
+    is_isomorphic_matching,
+    toposort,
+    kosaraju_scc,
+    tarjan_scc,
+    dijkstra,
+    bellman_ford,
+};
+use petgraph::visit::{Topo, Reversed};
+use petgraph::visit::{
+    IntoNodeReferences,
+    IntoEdgeReferences,
+    NodeIndexable,
+    EdgeRef,
+};
+use petgraph::data::FromElements;
+use petgraph::graph::{IndexType, node_index, edge_index};
+use petgraph::graphmap::{
+    NodeTrait,
+};
+
+fn mst_graph<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>) -> Graph<N, E, Undirected, Ix>
+    where Ty: EdgeType,
+          Ix: IndexType,
+          N: Clone, E: Clone + PartialOrd,
+{
+    Graph::from_elements(min_spanning_tree(&g))
+}
+
+use std::fmt;
+
+quickcheck! {
+    fn mst_directed(g: Small<Graph<(), u32>>) -> bool {
+        // filter out isolated nodes
+        let no_singles = g.filter_map(
+            |nx, w| g.neighbors_undirected(nx).next().map(|_| w),
+            |_, w| Some(w));
+        for i in no_singles.node_indices() {
+            assert!(no_singles.neighbors_undirected(i).count() > 0);
+        }
+        assert_eq!(no_singles.edge_count(), g.edge_count());
+        let mst = mst_graph(&no_singles);
+        assert!(!is_cyclic_undirected(&mst));
+        true
+    }
+}
+
+quickcheck! {
+    fn mst_undirected(g: Graph<(), u32, Undirected>) -> bool {
+        // filter out isolated nodes
+        let no_singles = g.filter_map(
+            |nx, w| g.neighbors_undirected(nx).next().map(|_| w),
+            |_, w| Some(w));
+        for i in no_singles.node_indices() {
+            assert!(no_singles.neighbors_undirected(i).count() > 0);
+        }
+        assert_eq!(no_singles.edge_count(), g.edge_count());
+        let mst = mst_graph(&no_singles);
+        assert!(!is_cyclic_undirected(&mst));
+        true
+    }
+}
+
+quickcheck! {
+    fn reverse_undirected(g: Small<UnGraph<(), ()>>) -> bool {
+        let mut h = (*g).clone();
+        h.reverse();
+        is_isomorphic(&g, &h)
+    }
+}
+
+fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>)
+    where Ty: EdgeType,
+          Ix: IndexType,
+{
+    assert_eq!(g.node_count(), g.node_indices().count());
+    assert_eq!(g.edge_count(), g.edge_indices().count());
+    for edge in g.raw_edges() {
+        assert!(g.find_edge(edge.source(), edge.target()).is_some(),
+                "Edge not in graph! {:?} to {:?}", edge.source(), edge.target());
+    }
+}
+
+#[test]
+fn reverse_directed() {
+    fn prop<Ty: EdgeType>(mut g: Graph<(), (), Ty>) -> bool {
+        let node_outdegrees = g.node_indices()
+                                .map(|i| g.neighbors_directed(i, Outgoing).count())
+                                .collect::<Vec<_>>();
+        let node_indegrees = g.node_indices()
+                                .map(|i| g.neighbors_directed(i, Incoming).count())
+                                .collect::<Vec<_>>();
+
+        g.reverse();
+        let new_outdegrees = g.node_indices()
+                                .map(|i| g.neighbors_directed(i, Outgoing).count())
+                                .collect::<Vec<_>>();
+        let new_indegrees = g.node_indices()
+                                .map(|i| g.neighbors_directed(i, Incoming).count())
+                                .collect::<Vec<_>>();
+        assert_eq!(node_outdegrees, new_indegrees);
+        assert_eq!(node_indegrees, new_outdegrees);
+        assert_graph_consistent(&g);
+        true
+    }
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool);
+}
+
+#[test]
+fn graph_retain_nodes() {
+    fn prop<Ty: EdgeType>(mut g: Graph<i32, i32, Ty>) -> bool {
+        // Remove all negative nodes, these should be randomly spread
+        let og = g.clone();
+        let nodes = g.node_count();
+        let num_negs = g.raw_nodes().iter().filter(|n| n.weight < 0).count();
+        let mut removed = 0;
+        g.retain_nodes(|g, i| {
+            let keep = g[i] >= 0;
+            if !keep {
+                removed += 1;
+            }
+            keep
+        });
+        let num_negs_post = g.raw_nodes().iter().filter(|n| n.weight < 0).count();
+        let num_pos_post = g.raw_nodes().iter().filter(|n| n.weight >= 0).count();
+        assert_eq!(num_negs_post, 0);
+        assert_eq!(removed, num_negs);
+        assert_eq!(num_negs + g.node_count(), nodes);
+        assert_eq!(num_pos_post, g.node_count());
+
+        // check against filter_map
+        let filtered = og.filter_map(|_, w| if *w >= 0 { Some(*w) } else { None },
+                                     |_, w| Some(*w));
+        assert_eq!(g.node_count(), filtered.node_count());
+        /*
+        println!("Iso of graph with nodes={}, edges={}",
+                 g.node_count(), g.edge_count());
+                 */
+        assert!(is_isomorphic_matching(&filtered, &g, PartialEq::eq, PartialEq::eq));
+
+        true
+    }
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool);
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>) -> bool);
+}
+
+#[test]
+fn graph_retain_edges() {
+    fn prop<Ty: EdgeType>(mut g: Graph<(), i32, Ty>) -> bool {
+        // Remove all negative edges, these should be randomly spread
+        let og = g.clone();
+        let edges = g.edge_count();
+        let num_negs = g.raw_edges().iter().filter(|n| n.weight < 0).count();
+        let mut removed = 0;
+        g.retain_edges(|g, i| {
+            let keep = g[i] >= 0;
+            if !keep {
+                removed += 1;
+            }
+            keep
+        });
+        let num_negs_post = g.raw_edges().iter().filter(|n| n.weight < 0).count();
+        let num_pos_post = g.raw_edges().iter().filter(|n| n.weight >= 0).count();
+        assert_eq!(num_negs_post, 0);
+        assert_eq!(removed, num_negs);
+        assert_eq!(num_negs + g.edge_count(), edges);
+        assert_eq!(num_pos_post, g.edge_count());
+        if og.edge_count() < 30 {
+            // check against filter_map
+            let filtered = og.filter_map(
+                |_, w| Some(*w),
+                |_, w| if *w >= 0 { Some(*w) } else { None });
+            assert_eq!(g.node_count(), filtered.node_count());
+            assert!(is_isomorphic(&filtered, &g));
+        }
+        true
+    }
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool);
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>) -> bool);
+}
+
+#[test]
+fn stable_graph_retain_edges() {
+    fn prop<Ty: EdgeType>(mut g: StableGraph<(), i32, Ty>) -> bool {
+        // Remove all negative edges, these should be randomly spread
+        let og = g.clone();
+        let edges = g.edge_count();
+        let num_negs = g.edge_references().filter(|n| *n.weight() < 0).count();
+        let mut removed = 0;
+        g.retain_edges(|g, i| {
+            let keep = g[i] >= 0;
+            if !keep {
+                removed += 1;
+            }
+            keep
+        });
+        let num_negs_post = g.edge_references().filter(|n| *n.weight() < 0).count();
+        let num_pos_post = g.edge_references().filter(|n| *n.weight() >= 0).count();
+        assert_eq!(num_negs_post, 0);
+        assert_eq!(removed, num_negs);
+        assert_eq!(num_negs + g.edge_count(), edges);
+        assert_eq!(num_pos_post, g.edge_count());
+        if og.edge_count() < 30 {
+            // check against filter_map
+            let filtered = og.filter_map(
+                |_, w| Some(*w),
+                |_, w| if *w >= 0 { Some(*w) } else { None });
+            assert_eq!(g.node_count(), filtered.node_count());
+        }
+        true
+    }
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>) -> bool);
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>) -> bool);
+}
+
+#[test]
+fn isomorphism_1() {
+    // using small weights so that duplicates are likely
+    fn prop<Ty: EdgeType>(g: Small<Graph<i8, i8, Ty>>) -> bool {
+        let mut rng = rand::thread_rng();
+        // several trials of different isomorphisms of the same graph
+        // mapping of node indices
+        let mut map = g.node_indices().collect::<Vec<_>>();
+        let mut ng = Graph::<_, _, Ty>::with_capacity(g.node_count(), g.edge_count());
+        for _ in 0..1 {
+            rng.shuffle(&mut map);
+            ng.clear();
+
+            for _ in g.node_indices() {
+                ng.add_node(0);
+            }
+            // Assign node weights
+            for i in g.node_indices() {
+                ng[map[i.index()]] = g[i];
+            }
+            // Add edges
+            for i in g.edge_indices() {
+                let (s, t) = g.edge_endpoints(i).unwrap();
+                ng.add_edge(map[s.index()],
+                            map[t.index()],
+                            g[i]);
+            }
+            if g.node_count() < 20 && g.edge_count() < 50 {
+                assert!(is_isomorphic(&g, &ng));
+            }
+            assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+        }
+        true
+    }
+    quickcheck::quickcheck(prop::<Undirected> as fn(_) -> bool);
+    quickcheck::quickcheck(prop::<Directed> as fn(_) -> bool);
+}
+
+#[test]
+fn isomorphism_modify() {
+    // using small weights so that duplicates are likely
+    fn prop<Ty: EdgeType>(g: Small<Graph<i16, i8, Ty>>, node: u8, edge: u8) -> bool {
+        println!("graph {:#?}", g);
+        let mut ng = (*g).clone();
+        let i = node_index(node as usize);
+        let j = edge_index(edge as usize);
+        if i.index() < g.node_count() {
+            ng[i] = (g[i] == 0) as i16;
+        }
+        if j.index() < g.edge_count() {
+            ng[j] = (g[j] == 0) as i8;
+        }
+        if i.index() < g.node_count() || j.index() < g.edge_count() {
+            assert!(!is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+        } else {
+            assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+        }
+        true
+    }
+    quickcheck::quickcheck(prop::<Undirected> as fn(_, _, _) -> bool);
+    quickcheck::quickcheck(prop::<Directed> as fn(_, _, _) -> bool);
+}
+
+#[test]
+fn graph_remove_edge() {
+    fn prop<Ty: EdgeType>(mut g: Graph<(), (), Ty>, a: u8, b: u8) -> bool {
+        let a = node_index(a as usize);
+        let b = node_index(b as usize);
+        let edge = g.find_edge(a, b);
+        if !g.is_directed() {
+            assert_eq!(edge.is_some(), g.find_edge(b, a).is_some());
+        }
+        if let Some(ex) = edge {
+            assert!(g.remove_edge(ex).is_some());
+        }
+        assert_graph_consistent(&g);
+        assert!(g.find_edge(a, b).is_none());
+        assert!(g.neighbors(a).find(|x| *x == b).is_none());
+        if !g.is_directed() {
+            assert!(g.neighbors(b).find(|x| *x == a).is_none());
+        }
+        true
+    }
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>, _, _) -> bool);
+    quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>, _, _) -> bool);
+}
+
+#[cfg(feature = "stable_graph")]
+#[test]
+fn stable_graph_remove_edge() {
+    fn prop<Ty: EdgeType>(mut g: StableGraph<(), (), Ty>, a: u8, b: u8) -> bool {
+        let a = node_index(a as usize);
+        let b = node_index(b as usize);
+        let edge = g.find_edge(a, b);
+        if !g.is_directed() {
+            assert_eq!(edge.is_some(), g.find_edge(b, a).is_some());
+        }
+        if let Some(ex) = edge {
+            assert!(g.remove_edge(ex).is_some());
+        }
+        //assert_graph_consistent(&g);
+        assert!(g.find_edge(a, b).is_none());
+        assert!(g.neighbors(a).find(|x| *x == b).is_none());
+        if !g.is_directed() {
+            assert!(g.find_edge(b, a).is_none());
+            assert!(g.neighbors(b).find(|x| *x == a).is_none());
+        }
+        true
+    }
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>, _, _) -> bool);
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>, _, _) -> bool);
+}
+
+#[cfg(feature = "stable_graph")]
+#[test]
+fn stable_graph_add_remove_edges() {
+    fn prop<Ty: EdgeType>(mut g: StableGraph<(), (), Ty>, edges: Vec<(u8, u8)>) -> bool {
+        for &(a, b) in &edges {
+            let a = node_index(a as usize);
+            let b = node_index(b as usize);
+            let edge = g.find_edge(a, b);
+
+            if edge.is_none() && g.contains_node(a) && g.contains_node(b) {
+                let _index = g.add_edge(a, b, ());
+                continue;
+            }
+
+            if !g.is_directed() {
+                assert_eq!(edge.is_some(), g.find_edge(b, a).is_some());
+            }
+            if let Some(ex) = edge {
+                assert!(g.remove_edge(ex).is_some());
+            }
+            //assert_graph_consistent(&g);
+            assert!(g.find_edge(a, b).is_none(), "failed to remove edge {:?} from graph {:?}", (a, b), g);
+            assert!(g.neighbors(a).find(|x| *x == b).is_none());
+            if !g.is_directed() {
+                assert!(g.find_edge(b, a).is_none());
+                assert!(g.neighbors(b).find(|x| *x == a).is_none());
+            }
+        }
+        true
+    }
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>, _) -> bool);
+    quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>, _) -> bool);
+}
+
+fn assert_graphmap_consistent<N, E, Ty>(g: &GraphMap<N, E, Ty>)
+    where Ty: EdgeType,
+          N: NodeTrait + fmt::Debug,
+{
+    for (a, b, _weight) in g.all_edges() {
+        assert!(g.contains_edge(a, b),
+                "Edge not in graph! {:?} to {:?}", a, b);
+        assert!(g.neighbors(a).find(|x| *x == b).is_some(),
+                "Edge {:?} not in neighbor list for {:?}", (a, b), a);
+        if !g.is_directed() {
+            assert!(g.neighbors(b).find(|x| *x == a).is_some(),
+                    "Edge {:?} not in neighbor list for {:?}", (b, a), b);
+        }
+    }
+}
+
+#[test]
+fn graphmap_remove() {
+    fn prop<Ty: EdgeType>(mut g: GraphMap<i8, (), Ty>, a: i8, b: i8) -> bool {
+        //if g.edge_count() > 20 { return true; }
+        assert_graphmap_consistent(&g);
+        let contains = g.contains_edge(a, b);
+        if !g.is_directed() {
+            assert_eq!(contains, g.contains_edge(b, a));
+        }
+        assert_eq!(g.remove_edge(a, b).is_some(), contains);
+        assert!(!g.contains_edge(a, b) &&
+            g.neighbors(a).find(|x| *x == b).is_none());
+            //(g.is_directed() || g.neighbors(b).find(|x| *x == a).is_none()));
+        assert!(g.remove_edge(a, b).is_none());
+        assert_graphmap_consistent(&g);
+        true
+    }
+    quickcheck::quickcheck(prop as fn(DiGraphMap<_, _>, _, _) -> bool);
+    quickcheck::quickcheck(prop as fn(UnGraphMap<_, _>, _, _) -> bool);
+}
+
+#[test]
+fn graphmap_add_remove() {
+    fn prop(mut g: UnGraphMap<i8, ()>, a: i8, b: i8) -> bool {
+        assert_eq!(g.contains_edge(a, b), g.add_edge(a, b, ()).is_some());
+        g.remove_edge(a, b);
+        !g.contains_edge(a, b) &&
+            g.neighbors(a).find(|x| *x == b).is_none() &&
+            g.neighbors(b).find(|x| *x == a).is_none()
+    }
+    quickcheck::quickcheck(prop as fn(_, _, _) -> bool);
+}
+
+fn sort_sccs<T: Ord>(v: &mut [Vec<T>]) {
+    for scc in &mut *v {
+        scc.sort();
+    }
+    v.sort();
+}
+
+quickcheck! {
+    fn graph_sccs(g: Graph<(), ()>) -> bool {
+        let mut sccs = kosaraju_scc(&g);
+        let mut tsccs = tarjan_scc(&g);
+        sort_sccs(&mut sccs);
+        sort_sccs(&mut tsccs);
+        if sccs != tsccs {
+            println!("{:?}",
+                     Dot::with_config(&g, &[Config::EdgeNoLabel,
+                                      Config::NodeIndexLabel]));
+            println!("Sccs {:?}", sccs);
+            println!("Sccs (Tarjan) {:?}", tsccs);
+            return false;
+        }
+        true
+    }
+}
+
+quickcheck! {
+    fn kosaraju_scc_is_topo_sort(g: Graph<(), ()>) -> bool {
+        let tsccs = kosaraju_scc(&g);
+        let firsts = vec(tsccs.iter().rev().map(|v| v[0]));
+        subset_is_topo_order(&g, &firsts)
+    }
+}
+
+quickcheck! {
+    fn tarjan_scc_is_topo_sort(g: Graph<(), ()>) -> bool {
+        let tsccs = tarjan_scc(&g);
+        let firsts = vec(tsccs.iter().rev().map(|v| v[0]));
+        subset_is_topo_order(&g, &firsts)
+    }
+}
+
+
+quickcheck! {
+    // Reversed edges gives the same sccs (when sorted)
+    fn graph_reverse_sccs(g: Graph<(), ()>) -> bool {
+        let mut sccs = kosaraju_scc(&g);
+        let mut tsccs = kosaraju_scc(Reversed(&g));
+        sort_sccs(&mut sccs);
+        sort_sccs(&mut tsccs);
+        if sccs != tsccs {
+            println!("{:?}",
+                     Dot::with_config(&g, &[Config::EdgeNoLabel,
+                                      Config::NodeIndexLabel]));
+            println!("Sccs {:?}", sccs);
+            println!("Sccs (Reversed) {:?}", tsccs);
+            return false;
+        }
+        true
+    }
+}
+
+quickcheck! {
+    // Reversed edges gives the same sccs (when sorted)
+    fn graphmap_reverse_sccs(g: DiGraphMap<u16, ()>) -> bool {
+        let mut sccs = kosaraju_scc(&g);
+        let mut tsccs = kosaraju_scc(Reversed(&g));
+        sort_sccs(&mut sccs);
+        sort_sccs(&mut tsccs);
+        if sccs != tsccs {
+            println!("{:?}",
+                     Dot::with_config(&g, &[Config::EdgeNoLabel,
+                                      Config::NodeIndexLabel]));
+            println!("Sccs {:?}", sccs);
+            println!("Sccs (Reversed) {:?}", tsccs);
+            return false;
+        }
+        true
+    }
+}
+
+#[test]
+fn graph_condensation_acyclic() {
+    fn prop(g: Graph<(), ()>) -> bool {
+        !is_cyclic_directed(&condensation(g, /* make_acyclic */ true))
+    }
+    quickcheck::quickcheck(prop as fn(_) -> bool);
+}
+
+#[derive(Debug, Clone)]
+struct DAG<N: Default + Clone + Send + 'static>(Graph<N, ()>);
+
+impl<N: Default + Clone + Send + 'static> quickcheck::Arbitrary for DAG<N> {
+    fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Self {
+        let nodes = usize::arbitrary(g);
+        if nodes == 0 {
+            return DAG(Graph::with_capacity(0, 0));
+        }
+        let split = g.gen_range(0., 1.);
+        let max_width = f64::sqrt(nodes as f64) as usize;
+        let tall = (max_width as f64 * split) as usize;
+        let fat = max_width - tall;
+
+        let edge_prob = 1. - (1. - g.gen_range(0., 1.)) * (1. - g.gen_range(0., 1.));
+        let edges = ((nodes as f64).powi(2) * edge_prob) as usize;
+        let mut gr = Graph::with_capacity(nodes, edges);
+        let mut nodes = 0;
+        for _ in 0..tall {
+            let cur_nodes = g.gen_range(0, fat);
+            for _ in 0..cur_nodes {
+                gr.add_node(N::default());
+            }
+            for j in 0..nodes {
+                for k in 0..cur_nodes {
+                    if g.gen_range(0., 1.) < edge_prob {
+                        gr.add_edge(NodeIndex::new(j), NodeIndex::new(k + nodes), ());
+                    }
+                }
+            }
+            nodes += cur_nodes;
+        }
+        DAG(gr)
+    }
+
+    // shrink the graph by splitting it in two by a very
+    // simple algorithm, just even and odd node indices
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        let self_ = self.clone();
+        Box::new((0..2).filter_map(move |x| {
+            let gr = self_.0.filter_map(|i, w| {
+                if i.index() % 2 == x {
+                    Some(w.clone())
+                } else {
+                    None
+                }
+            },
+            |_, w| Some(w.clone())
+            );
+            // make sure we shrink
+            if gr.node_count() < self_.0.node_count() {
+                Some(DAG(gr))
+            } else {
+                None
+            }
+        }))
+    }
+}
+
+fn is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool {
+    if gr.node_count() != order.len() {
+        println!("Graph ({}) and count ({}) had different amount of nodes.", gr.node_count(), order.len());
+        return false;
+    }
+    // check all the edges of the graph
+    for edge in gr.raw_edges() {
+        let a = edge.source();
+        let b = edge.target();
+        let ai = order.find(&a).unwrap();
+        let bi = order.find(&b).unwrap();
+        if ai >= bi {
+            println!("{:?} > {:?} ", a, b);
+            return false;
+        }
+    }
+    true
+}
+
+
+fn subset_is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool {
+    if gr.node_count() < order.len() {
+        println!("Graph (len={}) had less nodes than order (len={})", gr.node_count(), order.len());
+        return false;
+    }
+    // check all the edges of the graph
+    for edge in gr.raw_edges() {
+        let a = edge.source();
+        let b = edge.target();
+        if a == b {
+            continue;
+        }
+        // skip those that are not in the subset
+        let ai = match order.find(&a) {
+            Some(i) => i,
+            None => continue,
+        };
+        let bi = match order.find(&b) {
+            Some(i) => i,
+            None => continue,
+        };
+        if ai >= bi {
+            println!("{:?} > {:?} ", a, b);
+            return false;
+        }
+    }
+    true
+}
+
+#[test]
+fn full_topo() {
+    fn prop(DAG(gr): DAG<()>) -> bool {
+        let order = toposort(&gr, None).unwrap();
+        is_topo_order(&gr, &order)
+    }
+    quickcheck::quickcheck(prop as fn(_) -> bool);
+}
+
+#[test]
+fn full_topo_generic() {
+    fn prop_generic(DAG(mut gr): DAG<usize>) -> bool {
+        assert!(!is_cyclic_directed(&gr));
+        let mut index = 0;
+        let mut topo = Topo::new(&gr);
+        while let Some(nx) = topo.next(&gr) {
+            gr[nx] = index;
+            index += 1;
+        }
+
+        let mut order = Vec::new();
+        index = 0;
+        let mut topo = Topo::new(&gr);
+        while let Some(nx) = topo.next(&gr) {
+            order.push(nx);
+            assert_eq!(gr[nx], index);
+            index += 1;
+        }
+        if !is_topo_order(&gr, &order) {
+            println!("{:?}", gr);
+            return false;
+        }
+
+        {
+            order.clear();
+            let mut topo = Topo::new(&gr);
+            while let Some(nx) = topo.next(&gr) {
+                order.push(nx);
+            }
+            if !is_topo_order(&gr, &order) {
+                println!("{:?}", gr);
+                return false;
+            }
+        }
+        true
+    }
+    quickcheck::quickcheck(prop_generic as fn(_) -> bool);
+}
+
+quickcheck! {
+    // checks that the distances computed by dijkstra satisfy the triangle
+    // inequality.
+    fn dijkstra_triangle_ineq(g: Graph<u32, u32>, node: usize) -> bool {
+        if g.node_count() == 0 {
+            return true;
+        }
+        let v = node_index(node % g.node_count());
+        let distances = dijkstra(&g, v, None, |e| *e.weight());
+        for v2 in distances.keys() {
+            let dv2 = distances[v2];
+            // triangle inequality:
+            // d(v,u) <= d(v,v2) + w(v2,u)
+            for edge in g.edges(*v2) {
+                let u = edge.target();
+                let w = edge.weight();
+                if distances.contains_key(&u) && distances[&u] > dv2 + w {
+                    return false;
+                }
+            }
+        }
+        true
+    }
+}
+
+fn set<I>(iter: I) -> HashSet<I::Item>
+    where I: IntoIterator,
+          I::Item: Hash + Eq,
+{
+    iter.into_iter().collect()
+}
+
+
+quickcheck! {
+    fn dfs_visit(gr: Graph<(), ()>, node: usize) -> bool {
+        use petgraph::visit::{Visitable, VisitMap};
+        use petgraph::visit::DfsEvent::*;
+        use petgraph::visit::{Time, depth_first_search};
+        if gr.node_count() == 0 {
+            return true;
+        }
+        let start_node = node_index(node % gr.node_count());
+
+        let invalid_time = Time(!0);
+        let mut discover_time = vec![invalid_time; gr.node_count()];
+        let mut finish_time = vec![invalid_time; gr.node_count()];
+        let mut has_tree_edge = gr.visit_map();
+        let mut edges = HashSet::new();
+        depth_first_search(&gr, Some(start_node).into_iter().chain(gr.node_indices()),
+                           |evt| {
+            match evt {
+                Discover(n, t) => discover_time[n.index()] = t,
+                Finish(n, t) => finish_time[n.index()] = t,
+                TreeEdge(u, v) => {
+                    // v is an ancestor of u
+                    assert!(has_tree_edge.visit(v), "Two tree edges to {:?}!", v);
+                    assert!(discover_time[v.index()] == invalid_time);
+                    assert!(discover_time[u.index()] != invalid_time);
+                    assert!(finish_time[u.index()] == invalid_time);
+                    edges.insert((u, v));
+                }
+                BackEdge(u, v) => {
+                    // u is an ancestor of v
+                    assert!(discover_time[v.index()] != invalid_time);
+                    assert!(finish_time[v.index()] == invalid_time);
+                    edges.insert((u, v));
+                }
+                CrossForwardEdge(u, v) => {
+                    edges.insert((u, v));
+                }
+            }
+        });
+        assert!(discover_time.iter().all(|x| *x != invalid_time));
+        assert!(finish_time.iter().all(|x| *x != invalid_time));
+        assert_eq!(edges.len(), gr.edge_count());
+        assert_eq!(edges, set(gr.edge_references().map(|e| (e.source(), e.target()))));
+        true
+    }
+}
+
+quickcheck! {
+    fn test_bellman_ford(gr: Graph<(), f32>) -> bool {
+        let mut gr = gr;
+        for elt in gr.edge_weights_mut() {
+            *elt = elt.abs();
+        }
+        if gr.node_count() == 0 {
+            return true;
+        }
+        for (i, start) in gr.node_indices().enumerate() {
+            if i >= 10 { break; } // testing all is too slow
+            bellman_ford(&gr, start).unwrap();
+        }
+        true
+    }
+}
+
+quickcheck! {
+    fn test_bellman_ford_undir(gr: Graph<(), f32, Undirected>) -> bool {
+        let mut gr = gr;
+        for elt in gr.edge_weights_mut() {
+            *elt = elt.abs();
+        }
+        if gr.node_count() == 0 {
+            return true;
+        }
+        for (i, start) in gr.node_indices().enumerate() {
+            if i >= 10 { break; } // testing all is too slow
+            bellman_ford(&gr, start).unwrap();
+        }
+        true
+    }
+}
+
+defmac!(iter_eq a, b => a.eq(b));
+defmac!(nodes_eq ref a, ref b => a.node_references().eq(b.node_references()));
+defmac!(edgew_eq ref a, ref b => a.edge_references().eq(b.edge_references()));
+defmac!(edges_eq ref a, ref b =>
+        iter_eq!(
+            a.edge_references().map(|e| (e.source(), e.target())),
+            b.edge_references().map(|e| (e.source(), e.target()))));
+
+quickcheck! {
+    fn test_di_from(gr1: DiGraph<i32, i32>) -> () {
+        let sgr = StableGraph::from(gr1.clone());
+        let gr2 = Graph::from(sgr);
+
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+    fn test_un_from(gr1: UnGraph<i32, i32>) -> () {
+        let sgr = StableGraph::from(gr1.clone());
+        let gr2 = Graph::from(sgr);
+
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+
+    fn test_graph_from_stable_graph(gr1: StableDiGraph<usize, usize>) -> () {
+        let mut gr1 = gr1;
+        let gr2 = Graph::from(gr1.clone());
+
+        // renumber the stablegraph nodes and put the new index in the
+        // associated data
+        let mut index = 0;
+        for i in 0..gr1.node_bound() {
+            let ni = node_index(i);
+            if gr1.contains_node(ni) {
+                gr1[ni] = index;
+                index += 1;
+            }
+        }
+        if let Some(edge_bound) = gr1.edge_references().next_back()
+            .map(|ed| ed.id().index() + 1)
+        {
+            index = 0;
+            for i in 0..edge_bound {
+                let ni = edge_index(i);
+                if gr1.edge_weight(ni).is_some() {
+                    gr1[ni] = index;
+                    index += 1;
+                }
+            }
+        }
+
+        assert_equal(
+            // Remap the stablegraph to compact indices
+            gr1.edge_references().map(|ed| (edge_index(*ed.weight()), gr1[ed.source()], gr1[ed.target()])),
+            gr2.edge_references().map(|ed| (ed.id(), ed.source().index(), ed.target().index()))
+        );
+    }
+
+    fn stable_di_graph_map_id(gr1: StableDiGraph<usize, usize>) -> () {
+        let gr2 = gr1.map(|_, &nw| nw, |_, &ew| ew);
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+
+    fn stable_un_graph_map_id(gr1: StableUnGraph<usize, usize>) -> () {
+        let gr2 = gr1.map(|_, &nw| nw, |_, &ew| ew);
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+
+    fn stable_di_graph_filter_map_id(gr1: StableDiGraph<usize, usize>) -> () {
+        let gr2 = gr1.filter_map(|_, &nw| Some(nw), |_, &ew| Some(ew));
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+
+    fn test_stable_un_graph_filter_map_id(gr1: StableUnGraph<usize, usize>) -> () {
+        let gr2 = gr1.filter_map(|_, &nw| Some(nw), |_, &ew| Some(ew));
+        assert!(nodes_eq!(gr1, gr2));
+        assert!(edgew_eq!(gr1, gr2));
+        assert!(edges_eq!(gr1, gr2));
+    }
+
+    fn stable_di_graph_filter_map_remove(gr1: Small<StableDiGraph<i32, i32>>,
+                                         nodes: Vec<usize>,
+                                         edges: Vec<usize>) -> ()
+    {
+        let gr2 = gr1.filter_map(|ix, &nw| {
+            if !nodes.contains(&ix.index()) { Some(nw) } else { None }
+        },
+        |ix, &ew| {
+            if !edges.contains(&ix.index()) { Some(ew) } else { None }
+        });
+        let check_nodes = &set(gr1.node_indices()) - &set(cloned(&nodes).map(node_index));
+        let mut check_edges = &set(gr1.edge_indices()) - &set(cloned(&edges).map(edge_index));
+        // remove all edges with endpoint in removed nodes
+        for edge in gr1.edge_references() {
+            if nodes.contains(&edge.source().index()) ||
+                nodes.contains(&edge.target().index()) {
+                check_edges.remove(&edge.id());
+            }
+        }
+        // assert maintained
+        for i in check_nodes {
+            assert_eq!(gr1[i], gr2[i]);
+        }
+        for i in check_edges {
+            assert_eq!(gr1[i], gr2[i]);
+            assert_eq!(gr1.edge_endpoints(i), gr2.edge_endpoints(i));
+        }
+
+        // assert removals
+        for i in nodes {
+            assert!(gr2.node_weight(node_index(i)).is_none());
+        }
+        for i in edges {
+            assert!(gr2.edge_weight(edge_index(i)).is_none());
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/stable_graph.rs
@@ -0,0 +1,345 @@
+#![cfg(feature = "stable_graph")]
+
+extern crate petgraph;
+extern crate itertools;
+#[macro_use] extern crate defmac;
+
+use petgraph::prelude::*;
+use petgraph::stable_graph::node_index as n;
+use petgraph::EdgeType;
+use petgraph::algo::{kosaraju_scc, tarjan_scc};
+use petgraph::visit::{
+    NodeIndexable,
+    IntoNodeReferences,
+    IntoEdgeReferences,
+};
+use petgraph::dot::Dot;
+
+use itertools::assert_equal;
+
+#[test]
+fn node_indices() {
+    let mut g = StableGraph::<_, ()>::new();
+    let a = g.add_node(0);
+    let b = g.add_node(1);
+    let c = g.add_node(2);
+    g.remove_node(b);
+    let mut iter = g.node_indices();
+    assert_eq!(iter.next(), Some(a));
+    assert_eq!(iter.next(), Some(c));
+    assert_eq!(iter.next(), None);
+}
+
+#[test]
+fn node_bound() {
+    let mut g = StableGraph::<_, ()>::new();
+    assert_eq!(g.node_bound(), g.node_count());
+    for i in 0..10 {
+        g.add_node(i);
+        assert_eq!(g.node_bound(), g.node_count());
+    }
+    let full_count = g.node_count();
+    g.remove_node(n(0));
+    g.remove_node(n(2));
+    assert_eq!(g.node_bound(), full_count);
+    g.clear();
+    assert_eq!(g.node_bound(), 0);
+}
+
+#[test]
+fn clear_edges() {
+    let mut gr = scc_graph();
+    gr.remove_node(n(1));
+    gr.clear_edges();
+    // check that we use the free list for the vacancies
+    assert_eq!(gr.add_node(()), n(1));
+    assert_eq!(gr.add_node(()), n(4));
+    assert!(gr.edge_references().next().is_none());
+    assert!(gr.node_indices().all(|i| gr.neighbors(i).next().is_none()));
+}
+
+fn assert_sccs_eq(mut res: Vec<Vec<NodeIndex>>, normalized: Vec<Vec<NodeIndex>>) {
+    // normalize the result and compare with the answer.
+    for scc in &mut res {
+        scc.sort();
+    }
+    // sort by minimum element
+    res.sort_by(|v, w| v[0].cmp(&w[0]));
+    assert_eq!(res, normalized);
+}
+
+fn scc_graph() -> StableGraph<(), ()> {
+    let mut gr: StableGraph<(), ()> = StableGraph::from_edges(&[
+        (6, 0),
+        (0, 3),
+        (3, 6),
+        (8, 6), (8, 2),
+        (2, 5), (5, 8), (7, 5),
+        (1, 7),
+        (7, 4),
+        (4, 1)]);
+    // make an identical replacement of n(4) and leave a hole
+    let x = gr.add_node(());
+    gr.add_edge(n(7), x, ());
+    gr.add_edge(x, n(1), ());
+    gr.remove_node(n(4));
+    gr
+}
+
+#[test]
+fn test_scc() {
+    let gr = scc_graph();
+    println!("{:?}", gr);
+
+    let x = n(gr.node_bound() - 1);
+    assert_sccs_eq(kosaraju_scc(&gr), vec![
+        vec![n(0), n(3), n(6)],
+        vec![n(1), n(7),   x ],
+        vec![n(2), n(5), n(8)],
+    ]);
+}
+
+
+#[test]
+fn test_tarjan_scc() {
+    let gr = scc_graph();
+
+    let x = n(gr.node_bound() - 1);
+    assert_sccs_eq(tarjan_scc(&gr), vec![
+        vec![n(0), n(3), n(6)],
+        vec![n(1), n(7),   x ],
+        vec![n(2), n(5), n(8)],
+    ]);
+}
+
+fn make_graph<Ty>() -> StableGraph<(), i32, Ty>
+    where Ty: EdgeType,
+{
+    let mut gr = StableGraph::default();
+    let mut c = 0..;
+    let mut e = || -> i32 { c.next().unwrap() };
+    gr.extend_with_edges(&[
+        (6, 0, e()),
+        (0, 3, e()),
+        (3, 6, e()),
+        (8, 6, e()),
+        (8, 2, e()),
+        (2, 5, e()),
+        (5, 8, e()),
+        (7, 5, e()),
+        (1, 7, e()),
+        (7, 4, e()),
+        (8, 6, e()), // parallel edge
+        (4, 1, e())]);
+    // make an identical replacement of n(4) and leave a hole
+    let x = gr.add_node(());
+    gr.add_edge(n(7), x, e());
+    gr.add_edge(x, n(1), e());
+    gr.add_edge(x, x, e()); // make two self loops
+    let rm_self_loop = gr.add_edge(x, x, e());
+    gr.add_edge(x, x, e());
+    gr.remove_node(n(4));
+    gr.remove_node(n(6));
+    gr.remove_edge(rm_self_loop);
+    gr
+}
+
+defmac!(edges ref gr, x => gr.edges(x).map(|r| (r.target(), *r.weight())));
+
+#[test]
+fn test_edges_directed() {
+    let gr = make_graph::<Directed>();
+    let x = n(9);
+    assert_equal(edges!(gr, x), vec![(x, 16), (x, 14), (n(1), 13)]);
+    assert_equal(edges!(gr, n(0)), vec![(n(3), 1)]);
+    assert_equal(edges!(gr, n(4)), vec![]);
+}
+
+#[test]
+fn test_edge_references() {
+    let gr = make_graph::<Directed>();
+    assert_eq!(gr.edge_count(), gr.edge_references().count());
+}
+
+#[test]
+fn test_edges_undirected() {
+    let gr = make_graph::<Undirected>();
+    let x = n(9);
+    assert_equal(edges!(gr, x), vec![(x, 16), (x, 14), (n(1), 13), (n(7), 12)]);
+    assert_equal(edges!(gr, n(0)), vec![(n(3), 1)]);
+    assert_equal(edges!(gr, n(4)), vec![]);
+}
+
+#[test]
+fn test_edge_iterators_directed() {
+    let gr = make_graph::<Directed>();
+    for i in gr.node_indices() {
+        itertools::assert_equal(
+            gr.edges_directed(i, Outgoing),
+            gr.edges(i));
+    }
+    let mut incoming = vec![Vec::new(); gr.node_bound()];
+
+    for i in gr.node_indices() {
+        for j in gr.neighbors(i) {
+            incoming[j.index()].push(i);
+        }
+    }
+
+    println!("{:#?}", gr);
+    for i in gr.node_indices() {
+        itertools::assert_equal(
+            gr.edges_directed(i, Incoming).map(|e| e.source()),
+            incoming[i.index()].iter().rev().cloned());
+    }
+}
+
+#[test]
+fn test_edge_iterators_undir() {
+    let gr = make_graph::<Undirected>();
+    for i in gr.node_indices() {
+        itertools::assert_equal(
+            gr.edges_directed(i, Outgoing),
+            gr.edges(i));
+    }
+    for i in gr.node_indices() {
+        itertools::assert_equal(
+            gr.edges_directed(i, Incoming),
+            gr.edges(i));
+    }
+}
+
+#[test]
+#[should_panic(expected="is not a node")]
+fn add_edge_vacant() {
+    let mut g = StableGraph::<_, _>::new();
+    let a = g.add_node(0);
+    let b = g.add_node(1);
+    let _ = g.add_node(2);
+    let _ = g.remove_node(b);
+    g.add_edge(a, b, 1);
+}
+
+#[test]
+#[should_panic(expected="is not a node")]
+fn add_edge_oob() {
+    let mut g = StableGraph::<_, _>::new();
+    let a = g.add_node(0);
+    let _ = g.add_node(1);
+    let _ = g.add_node(2);
+    g.add_edge(a, n(4), 1);
+}
+
+#[test]
+fn test_node_references() {
+    let gr = scc_graph();
+
+    itertools::assert_equal(
+        gr.node_references().map(|(i, _)| i),
+        gr.node_indices());
+}
+
+#[test]
+fn iterators_undir() {
+    let mut g = StableUnGraph::<_, _>::default();
+    let a = g.add_node(0);
+    let b = g.add_node(1);
+    let c = g.add_node(2);
+    let d = g.add_node(3);
+    g.extend_with_edges(&[
+        (a, b, 1),
+        (a, c, 2),
+        (b, c, 3),
+        (c, c, 4),
+        (a, d, 5),
+    ]);
+    g.remove_node(b);
+
+    itertools::assert_equal(
+        g.neighbors(a),
+        vec![d, c],
+    );
+    itertools::assert_equal(
+        g.neighbors(c),
+        vec![c, a],
+    );
+    itertools::assert_equal(
+        g.neighbors(d),
+        vec![a],
+    );
+
+    // the node that was removed
+    itertools::assert_equal(
+        g.neighbors(b),
+        vec![],
+    );
+
+    // remove one more
+    g.remove_node(c);
+    itertools::assert_equal(
+        g.neighbors(c),
+        vec![],
+    );
+}
+
+#[test]
+fn dot() {
+    let mut gr = StableGraph::new();
+    let a = gr.add_node("x");
+    let b = gr.add_node("y");
+    gr.add_edge(a, a, "10");
+    gr.add_edge(a, b, "20");
+    let dot_output = format!("{}", Dot::new(&gr));
+    assert_eq!(dot_output,
+r#"digraph {
+    0 [label="x"]
+    1 [label="y"]
+    0 -> 0 [label="10"]
+    0 -> 1 [label="20"]
+}
+"#);
+}
+
+defmac!(iter_eq a, b => a.eq(b));
+defmac!(nodes_eq ref a, ref b => a.node_references().eq(b.node_references()));
+defmac!(edgew_eq ref a, ref b => a.edge_references().eq(b.edge_references()));
+defmac!(edges_eq ref a, ref b =>
+        iter_eq!(
+            a.edge_references().map(|e| (e.source(), e.target())),
+            b.edge_references().map(|e| (e.source(), e.target()))));
+
+#[test]
+fn from() {
+    let mut gr1 = StableGraph::new();
+    let a = gr1.add_node(1);
+    let b = gr1.add_node(2);
+    let c = gr1.add_node(3);
+    gr1.add_edge(a, a, 10);
+    gr1.add_edge(a, b, 20);
+    gr1.add_edge(b, c, 30);
+    gr1.add_edge(a, c, 40);
+
+    let gr2 = Graph::from(gr1.clone());
+    let gr3 = StableGraph::from(gr2.clone());
+    assert!(nodes_eq!(gr1, gr3));
+    assert!(edgew_eq!(gr1, gr3));
+    assert!(edges_eq!(gr1, gr3));
+
+    gr1.remove_node(b);
+
+    let gr4 = Graph::from(gr1.clone());
+    let gr5 = StableGraph::from(gr4.clone());
+
+    let mut ans = StableGraph::new();
+    let a = ans.add_node(1);
+    let c = ans.add_node(3);
+    ans.add_edge(a, a, 10);
+    ans.add_edge(a, c, 40);
+
+    assert!(nodes_eq!(gr4, ans));
+    assert!(edges_eq!(gr4, ans));
+
+    assert!(nodes_eq!(gr5, ans));
+    assert!(edgew_eq!(gr5, ans));
+    assert!(edges_eq!(gr5, ans));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/unionfind.rs
@@ -0,0 +1,78 @@
+extern crate rand;
+extern crate petgraph;
+
+use rand::{Rng, thread_rng, ChaChaRng};
+use std::collections::HashSet;
+use petgraph::unionfind::UnionFind;
+
+#[test]
+fn uf_test() {
+    let n = 8;
+    let mut u = UnionFind::new(n);
+    for i in 0..n {
+        assert_eq!(u.find(i), i);
+        assert_eq!(u.find_mut(i), i);
+        assert!(!u.union(i, i));
+    }
+
+    u.union(0, 1);
+    assert_eq!(u.find(0), u.find(1));
+    u.union(1, 3);
+    u.union(1, 4);
+    u.union(4, 7);
+    assert_eq!(u.find(0), u.find(3));
+    assert_eq!(u.find(1), u.find(3));
+    assert!(u.find(0) != u.find(2));
+    assert_eq!(u.find(7), u.find(0));
+    u.union(5, 6);
+    assert_eq!(u.find(6), u.find(5));
+    assert!(u.find(6) != u.find(7));
+
+    // check that there are now 3 disjoint sets
+    let set = (0..n).map(|i| u.find(i)).collect::<HashSet<_>>();
+    assert_eq!(set.len(), 3);
+}
+
+#[test]
+fn uf_rand() {
+    let n = 1 << 14;
+    let mut rng: ChaChaRng = thread_rng().gen();
+    let mut u = UnionFind::new(n);
+    for _ in 0..100 {
+        let a = rng.gen_range(0, n);
+        let b = rng.gen_range(0, n);
+        let ar = u.find(a);
+        let br = u.find(b);
+        assert_eq!(ar != br, u.union(a, b));
+    }
+}
+
+#[test]
+fn uf_u8() {
+    let n = 256;
+    let mut rng: ChaChaRng = thread_rng().gen();
+    let mut u = UnionFind::<u8>::new(n);
+    for _ in 0..(n * 8) {
+        let a = rng.gen();
+        let b = rng.gen();
+        let ar = u.find(a);
+        let br = u.find(b);
+        assert_eq!(ar != br, u.union(a, b));
+    }
+}
+
+#[test]
+fn labeling()
+{
+    let mut u = UnionFind::<u32>::new(48);
+    for i in 0..24 {
+        u.union(i + 1, i);
+    }
+    for i in 25..47 {
+        u.union(i, i + 1);
+    }
+    u.union(23, 25);
+    u.union(24, 23);
+    let v = u.into_labeling();
+    assert!(v.iter().all(|x| *x == v[0]));
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/utils/mod.rs
@@ -0,0 +1,5 @@
+
+
+mod qc;
+
+pub use self::qc::*;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/petgraph/tests/utils/qc.rs
@@ -0,0 +1,26 @@
+
+use quickcheck::{Arbitrary, Gen, StdGen};
+use std::ops::Deref;
+
+#[derive(Copy, Clone, Debug)]
+/// quickcheck Arbitrary adaptor - half the size of `T` on average
+pub struct Small<T>(pub T);
+
+impl<T> Deref for Small<T> {
+    type Target = T;
+    fn deref(&self) -> &T { &self.0 }
+}
+
+impl<T> Arbitrary for Small<T>
+    where T: Arbitrary
+{
+    fn arbitrary<G: Gen>(g: &mut G) -> Self {
+        let sz = g.size() / 2;
+        Small(T::arbitrary(&mut StdGen::new(g, sz)))
+    }
+
+    fn shrink(&self) -> Box<Iterator<Item=Self>> {
+        Box::new((**self).shrink().map(Small))
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"dc24c2b07c61ee79ec6190cf2245f9522b86af8468301270fc3d65ffbbe3afd2","Cargo.toml":"54737ed24e861323b4aa09439d84d523126075a5f04c76e8b90107e1b74d6c24","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"9998bb7a1a14ca250c3571ae2beed5905824057359aef2c7f19c8f4aeedc996f","build.rs":"c9fd295a8a84459f29ba6e1460118efab8d02f875d95eccc36d7ca66876f6713","src/atom.rs":"fe85bb6aa6f40dc69ffe0537445ba5dd46f83e93bac95316178d72d01e5b8f7c","src/bench.rs":"c4738a6709ca77e99f174d6c0b640c72c20cbe49a10e4765e4df79882dfd2983","src/event.rs":"b97e45ed554583f7badb83fa751fc2260a87348dc7a4cd4fa00befe345cf7638","src/lib.rs":"0c546862d24fbfedba0192b0e52e00487a76b7a6de5b8a57daa07f108c21c4d9"},"package":"39cb4173bcbd1319da31faa5468a7e3870683d7a237150b0b0aaafd546f6ad12"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/.travis.yml
@@ -0,0 +1,19 @@
+sudo: false
+language: rust
+rust:
+  - nightly
+  - beta
+  - stable
+os:
+  - linux
+script:
+  - cargo build
+  - cargo test
+  - cargo test --features log-events
+  - "if [ $TRAVIS_RUST_VERSION = nightly ]; then cargo test --features unstable; fi"
+  - cargo test
+  - "cd string-cache-codegen/ && cargo build && cd .."
+  - "cd examples/event-log/ && cargo build && cd ../.."
+  - "cd examples/summarize-events/ && cargo build && cd ../.."
+notifications:
+  webhooks: http://build.servo.org:54856/travis
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/Cargo.toml
@@ -0,0 +1,49 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "string_cache"
+version = "0.7.1"
+authors = ["The Servo Project Developers"]
+build = "build.rs"
+description = "A string interning library for Rust, developed as part of the Servo project."
+documentation = "https://docs.rs/string_cache/"
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/string-cache"
+
+[lib]
+name = "string_cache"
+[dependencies.debug_unreachable]
+version = "0.1.1"
+
+[dependencies.lazy_static]
+version = "1"
+
+[dependencies.phf_shared]
+version = "0.7.4"
+
+[dependencies.precomputed-hash]
+version = "0.1"
+
+[dependencies.serde]
+version = "1"
+
+[dependencies.string_cache_shared]
+version = "0.3"
+[dev-dependencies.rand]
+version = "0.3"
+[build-dependencies.string_cache_codegen]
+version = "0.4"
+
+[features]
+log-events = []
+unstable = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/README.md
@@ -0,0 +1,78 @@
+# string-cache
+
+[![Build Status](https://travis-ci.org/servo/string-cache.svg?branch=master)](https://travis-ci.org/servo/string-cache)
+
+[Documentation](https://docs.rs/string_cache/)
+
+A string interning library for Rust, developed as part of the [Servo](https://github.com/servo/servo) project.
+
+## Simple usage
+
+In `Cargo.toml`:
+
+```toml
+[dependencies]
+string_cache = "0.7"
+```
+
+In `lib.rs`:
+
+```rust
+extern crate string_cache;
+use string_cache::DefaultAtom as Atom;
+```
+
+## With static atoms
+
+In `Cargo.toml`:
+
+```toml
+[package]
+build = "build.rs"
+
+[dependencies]
+string_cache = "0.7"
+
+[build-dependencies]
+string_cache_codegen = "0.4"
+```
+
+In `build.rs`:
+
+```rust
+extern crate string_cache_codegen;
+
+use std::env;
+use std::path::Path;
+
+fn main() {
+    string_cache_codegen::AtomType::new("foo::FooAtom", "foo_atom!")
+        .atoms(&["foo", "bar"])
+        .write_to_file(&Path::new(&env::var("OUT_DIR").unwrap()).join("foo_atom.rs"))
+        .unwrap()
+}
+```
+
+In `lib.rs`:
+
+```rust
+extern crate string_cache;
+
+mod foo {
+    include!(concat!(env!("OUT_DIR"), "/foo_atom.rs"));
+}
+```
+
+The generated code will define a `FooAtom` type and a `foo_atom!` macro.
+The macro can be used in expression or patterns, with strings listed in `build.rs`.
+For example:
+
+```rust
+fn compute_something(input: &foo::FooAtom) -> u32 {
+    match *input {
+        foo_atom!("foo") => 1,
+        foo_atom!("bar") => 2,
+        _ => 3,
+    }
+}
+```
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/build.rs
@@ -0,0 +1,13 @@
+extern crate string_cache_codegen;
+
+use std::env;
+use std::path::Path;
+
+fn main() {
+    string_cache_codegen::AtomType::new("atom::tests::TestAtom", "test_atom!")
+        .atoms(&[
+            "a", "b", "address", "area", "body", "font-weight", "br", "html", "head", "id",
+        ])
+        .write_to_file(&Path::new(&env::var("OUT_DIR").unwrap()).join("test_atom.rs"))
+        .unwrap()
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/src/atom.rs
@@ -0,0 +1,916 @@
+// Copyright 2014 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_upper_case_globals)]
+
+use phf_shared;
+use serde::{Deserialize, Deserializer, Serialize, Serializer};
+
+#[allow(unused_imports)] use std::ascii::AsciiExt;
+use std::borrow::Cow;
+use std::cmp::Ordering::{self, Equal};
+use std::fmt;
+use std::hash::{Hash, Hasher};
+use std::marker::PhantomData;
+use std::mem;
+use std::ops;
+use std::slice;
+use std::str;
+use std::sync::Mutex;
+use std::sync::atomic::AtomicIsize;
+use std::sync::atomic::Ordering::SeqCst;
+
+use shared::{STATIC_TAG, INLINE_TAG, DYNAMIC_TAG, TAG_MASK, MAX_INLINE_LEN, STATIC_SHIFT_BITS,
+             ENTRY_ALIGNMENT, pack_static};
+use self::UnpackedAtom::{Dynamic, Inline, Static};
+
+#[cfg(feature = "log-events")]
+use event::Event;
+
+#[cfg(not(feature = "log-events"))]
+macro_rules! log (($e:expr) => (()));
+
+const NB_BUCKETS: usize = 1 << 12;  // 4096
+const BUCKET_MASK: u64 = (1 << 12) - 1;
+
+struct StringCache {
+    buckets: [Option<Box<StringCacheEntry>>; NB_BUCKETS],
+}
+
+lazy_static! {
+    static ref STRING_CACHE: Mutex<StringCache> = Mutex::new(StringCache::new());
+}
+
+struct StringCacheEntry {
+    next_in_bucket: Option<Box<StringCacheEntry>>,
+    hash: u64,
+    ref_count: AtomicIsize,
+    string: Box<str>,
+}
+
+impl StringCacheEntry {
+    fn new(next: Option<Box<StringCacheEntry>>, hash: u64, string: String)
+           -> StringCacheEntry {
+        StringCacheEntry {
+            next_in_bucket: next,
+            hash: hash,
+            ref_count: AtomicIsize::new(1),
+            string: string.into_boxed_str(),
+        }
+    }
+}
+
+impl StringCache {
+    fn new() -> StringCache {
+        StringCache {
+            buckets: unsafe { mem::zeroed() },
+        }
+    }
+
+    fn add(&mut self, string: Cow<str>, hash: u64) -> *mut StringCacheEntry {
+        let bucket_index = (hash & BUCKET_MASK) as usize;
+        {
+            let mut ptr: Option<&mut Box<StringCacheEntry>> =
+                self.buckets[bucket_index].as_mut();
+
+            while let Some(entry) = ptr.take() {
+                if entry.hash == hash && &*entry.string == &*string {
+                    if entry.ref_count.fetch_add(1, SeqCst) > 0 {
+                        return &mut **entry;
+                    }
+                    // Uh-oh. The pointer's reference count was zero, which means someone may try
+                    // to free it. (Naive attempts to defend against this, for example having the
+                    // destructor check to see whether the reference count is indeed zero, don't
+                    // work due to ABA.) Thus we need to temporarily add a duplicate string to the
+                    // list.
+                    entry.ref_count.fetch_sub(1, SeqCst);
+                    break;
+                }
+                ptr = entry.next_in_bucket.as_mut();
+            }
+        }
+        debug_assert!(mem::align_of::<StringCacheEntry>() >= ENTRY_ALIGNMENT);
+        let string = string.into_owned();
+        let _string_clone = if cfg!(feature = "log-events") {
+            string.clone()
+        } else {
+            "".to_owned()
+        };
+        let mut entry = Box::new(StringCacheEntry::new(
+            self.buckets[bucket_index].take(), hash, string));
+        let ptr: *mut StringCacheEntry = &mut *entry;
+        self.buckets[bucket_index] = Some(entry);
+        log!(Event::Insert(ptr as u64, _string_clone));
+
+        ptr
+    }
+
+    fn remove(&mut self, key: u64) {
+        let ptr = key as *mut StringCacheEntry;
+        let bucket_index = {
+            let value: &StringCacheEntry = unsafe { &*ptr };
+            debug_assert!(value.ref_count.load(SeqCst) == 0);
+            (value.hash & BUCKET_MASK) as usize
+        };
+
+
+        let mut current: &mut Option<Box<StringCacheEntry>> = &mut self.buckets[bucket_index];
+
+        loop {
+            let entry_ptr: *mut StringCacheEntry = match current.as_mut() {
+                Some(entry) => &mut **entry,
+                None => break,
+            };
+            if entry_ptr == ptr {
+                mem::drop(mem::replace(current, unsafe { (*entry_ptr).next_in_bucket.take() }));
+                break;
+            }
+            current = unsafe { &mut (*entry_ptr).next_in_bucket };
+        }
+
+        log!(Event::Remove(key));
+    }
+}
+
+/// A static `PhfStrSet`
+///
+/// This trait is implemented by static sets of interned strings generated using
+/// `string_cache_codegen`, and `EmptyStaticAtomSet` for when strings will be added dynamically.
+///
+/// It is used by the methods of [`Atom`] to check if a string is present in the static set.
+///
+/// [`Atom`]: struct.Atom.html
+pub trait StaticAtomSet {
+    /// Get the location of the static string set in the binary.
+    fn get() -> &'static PhfStrSet;
+    /// Get the index of the empty string, which is in every set and is used for `Atom::default`.
+    fn empty_string_index() -> u32;
+}
+
+/// A string set created using a [perfect hash function], specifically
+/// [Hash, Displace and Compress].
+///
+/// See the CHD document for the meaning of the struct fields.
+///
+/// [perfect hash function]: https://en.wikipedia.org/wiki/Perfect_hash_function
+/// [Hash, Displace and Compress]: http://cmph.sourceforge.net/papers/esa09.pdf
+pub struct PhfStrSet {
+    pub key: u64,
+    pub disps: &'static [(u32, u32)],
+    pub atoms: &'static [&'static str],
+    pub hashes: &'static [u32],
+}
+
+/// An empty static atom set for when only dynamic strings will be added
+pub struct EmptyStaticAtomSet;
+
+impl StaticAtomSet for EmptyStaticAtomSet {
+    fn get() -> &'static PhfStrSet {
+        // The name is a lie: this set is not empty (it contains the empty string)
+        // but that’s only to avoid divisions by zero in rust-phf.
+        static SET: PhfStrSet = PhfStrSet {
+            key: 0,
+            disps: &[(0, 0)],
+            atoms: &[""],
+            // "" SipHash'd, and xored with u64_hash_to_u32.
+            hashes: &[0x3ddddef3],
+        };
+        &SET
+    }
+
+    fn empty_string_index() -> u32 {
+        0
+    }
+}
+
+/// Use this if you don’t care about static atoms.
+pub type DefaultAtom = Atom<EmptyStaticAtomSet>;
+
+/// Represents a string that has been interned.
+///
+/// In reality this contains a complex packed datastructure and the methods to extract information
+/// from it, along with type information to tell the compiler which static set it corresponds to.
+pub struct Atom<Static: StaticAtomSet> {
+    /// This field is public so that the `atom!()` macros can use it.
+    /// You should not otherwise access this field.
+    #[doc(hidden)]
+    pub unsafe_data: u64,
+
+    #[doc(hidden)]
+    pub phantom: PhantomData<Static>,
+}
+
+impl<Static: StaticAtomSet> ::precomputed_hash::PrecomputedHash for Atom<Static> {
+    fn precomputed_hash(&self) -> u32 {
+        self.get_hash()
+    }
+}
+
+impl<'a, Static: StaticAtomSet> From<&'a Atom<Static>> for Atom<Static> {
+    fn from(atom: &'a Self) -> Self {
+        atom.clone()
+    }
+}
+
+fn u64_hash_as_u32(h: u64) -> u32 {
+    // This may or may not be great...
+    ((h >> 32) ^ h) as u32
+}
+
+impl<Static: StaticAtomSet> Atom<Static> {
+    #[inline(always)]
+    unsafe fn unpack(&self) -> UnpackedAtom {
+        UnpackedAtom::from_packed(self.unsafe_data)
+    }
+
+    /// Get the hash of the string as it is stored in the set.
+    pub fn get_hash(&self) -> u32 {
+        match unsafe { self.unpack() } {
+            Static(index) => {
+                let static_set = Static::get();
+                static_set.hashes[index as usize]
+            }
+            Dynamic(entry) => {
+                let entry = entry as *mut StringCacheEntry;
+                u64_hash_as_u32(unsafe { (*entry).hash })
+            }
+            Inline(..) => {
+                u64_hash_as_u32(self.unsafe_data)
+            }
+        }
+    }
+}
+
+impl<Static: StaticAtomSet> Default for Atom<Static> {
+    #[inline]
+    fn default() -> Self {
+        Atom {
+            unsafe_data: pack_static(Static::empty_string_index()),
+            phantom: PhantomData
+        }
+    }
+}
+
+impl<Static: StaticAtomSet> Hash for Atom<Static> {
+    #[inline]
+    fn hash<H>(&self, state: &mut H) where H: Hasher {
+        state.write_u32(self.get_hash())
+    }
+}
+
+impl<Static: StaticAtomSet> Eq for Atom<Static> {}
+
+// NOTE: This impl requires that a given string must always be interned the same way.
+impl<Static: StaticAtomSet> PartialEq for Atom<Static> {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.unsafe_data == other.unsafe_data
+    }
+}
+
+impl<Static: StaticAtomSet> PartialEq<str> for Atom<Static> {
+    fn eq(&self, other: &str) -> bool {
+        &self[..] == other
+    }
+}
+
+impl<Static: StaticAtomSet> PartialEq<Atom<Static>> for str {
+    fn eq(&self, other: &Atom<Static>) -> bool {
+        self == &other[..]
+    }
+}
+
+impl<Static: StaticAtomSet> PartialEq<String> for Atom<Static> {
+    fn eq(&self, other: &String) -> bool {
+        &self[..] == &other[..]
+    }
+}
+
+impl<'a, Static: StaticAtomSet> From<Cow<'a, str>> for Atom<Static> {
+    #[inline]
+    fn from(string_to_add: Cow<'a, str>) -> Self {
+        let static_set = Static::get();
+        let hash = phf_shared::hash(&*string_to_add, static_set.key);
+        let index = phf_shared::get_index(hash, static_set.disps, static_set.atoms.len());
+
+        let unpacked = if static_set.atoms[index as usize] == string_to_add {
+            Static(index)
+        } else {
+            let len = string_to_add.len();
+            if len <= MAX_INLINE_LEN {
+                let mut buf: [u8; 7] = [0; 7];
+                buf[..len].copy_from_slice(string_to_add.as_bytes());
+                Inline(len as u8, buf)
+            } else {
+                Dynamic(STRING_CACHE.lock().unwrap().add(string_to_add, hash) as *mut ())
+            }
+        };
+
+        let data = unsafe { unpacked.pack() };
+        log!(Event::Intern(data));
+        Atom { unsafe_data: data, phantom: PhantomData }
+    }
+}
+
+impl<'a, Static: StaticAtomSet> From<&'a str> for Atom<Static> {
+    #[inline]
+    fn from(string_to_add: &str) -> Self {
+        Atom::from(Cow::Borrowed(string_to_add))
+    }
+}
+
+impl<Static: StaticAtomSet> From<String> for Atom<Static> {
+    #[inline]
+    fn from(string_to_add: String) -> Self {
+        Atom::from(Cow::Owned(string_to_add))
+    }
+}
+
+impl<Static: StaticAtomSet> Clone for Atom<Static> {
+    #[inline(always)]
+    fn clone(&self) -> Self {
+        unsafe {
+            match from_packed_dynamic(self.unsafe_data) {
+                Some(entry) => {
+                    let entry = entry as *mut StringCacheEntry;
+                    (*entry).ref_count.fetch_add(1, SeqCst);
+                },
+                None => (),
+            }
+        }
+        Atom {
+            unsafe_data: self.unsafe_data,
+            phantom: PhantomData,
+        }
+    }
+}
+
+impl<Static: StaticAtomSet> Drop for Atom<Static> {
+    #[inline]
+    fn drop(&mut self) {
+        // Out of line to guide inlining.
+        fn drop_slow<Static: StaticAtomSet>(this: &mut Atom<Static>) {
+            STRING_CACHE.lock().unwrap().remove(this.unsafe_data);
+        }
+
+        unsafe {
+            match from_packed_dynamic(self.unsafe_data) {
+                Some(entry) => {
+                    let entry = entry as *mut StringCacheEntry;
+                    if (*entry).ref_count.fetch_sub(1, SeqCst) == 1 {
+                        drop_slow(self);
+                    }
+                }
+                _ => (),
+            }
+        }
+    }
+}
+
+impl<Static: StaticAtomSet> ops::Deref for Atom<Static> {
+    type Target = str;
+
+    #[inline]
+    fn deref(&self) -> &str {
+        unsafe {
+            match self.unpack() {
+                Inline(..) => {
+                    let buf = inline_orig_bytes(&self.unsafe_data);
+                    str::from_utf8_unchecked(buf)
+                },
+                Static(idx) => Static::get().atoms.get(idx as usize).expect("bad static atom"),
+                Dynamic(entry) => {
+                    let entry = entry as *mut StringCacheEntry;
+                    &(*entry).string
+                }
+            }
+        }
+    }
+}
+
+impl<Static: StaticAtomSet> fmt::Display for Atom<Static> {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        <str as fmt::Display>::fmt(self, f)
+    }
+}
+
+impl<Static: StaticAtomSet> fmt::Debug for Atom<Static> {
+    #[inline]
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let ty_str = unsafe {
+            match self.unpack() {
+                Dynamic(..) => "dynamic",
+                Inline(..) => "inline",
+                Static(..) => "static",
+            }
+        };
+
+        write!(f, "Atom('{}' type={})", &*self, ty_str)
+    }
+}
+
+impl<Static: StaticAtomSet> PartialOrd for Atom<Static> {
+    #[inline]
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        if self.unsafe_data == other.unsafe_data {
+            return Some(Equal);
+        }
+        self.as_ref().partial_cmp(other.as_ref())
+    }
+}
+
+impl<Static: StaticAtomSet> Ord for Atom<Static> {
+    #[inline]
+    fn cmp(&self, other: &Self) -> Ordering {
+        if self.unsafe_data == other.unsafe_data {
+            return Equal;
+        }
+        self.as_ref().cmp(other.as_ref())
+    }
+}
+
+impl<Static: StaticAtomSet> AsRef<str> for Atom<Static> {
+    fn as_ref(&self) -> &str {
+        &self
+    }
+}
+
+impl<Static: StaticAtomSet> Serialize for Atom<Static> {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
+        let string: &str = self.as_ref();
+        string.serialize(serializer)
+    }
+}
+
+impl<'a, Static: StaticAtomSet> Deserialize<'a> for Atom<Static> {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'a> {
+        let string: String = try!(Deserialize::deserialize(deserializer));
+        Ok(Atom::from(string))
+    }
+}
+
+// AsciiExt requires mutating methods, so we just implement the non-mutating ones.
+// We don't need to implement is_ascii because there's no performance improvement
+// over the one from &str.
+impl<Static: StaticAtomSet> Atom<Static> {
+    fn from_mutated_str<F: FnOnce(&mut str)>(s: &str, f: F) -> Self {
+        let mut buffer: [u8; 64] = unsafe { mem::uninitialized() };
+        if let Some(buffer_prefix) = buffer.get_mut(..s.len()) {
+            buffer_prefix.copy_from_slice(s.as_bytes());
+            let as_str = unsafe { ::std::str::from_utf8_unchecked_mut(buffer_prefix) };
+            f(as_str);
+            Atom::from(&*as_str)
+        } else {
+            let mut string = s.to_owned();
+            f(&mut string);
+            Atom::from(string)
+        }
+    }
+
+    /// Like [`to_ascii_uppercase`].
+    ///
+    /// [`to_ascii_uppercase`]: https://doc.rust-lang.org/std/ascii/trait.AsciiExt.html#tymethod.to_ascii_uppercase
+    pub fn to_ascii_uppercase(&self) -> Self {
+        for (i, b) in self.bytes().enumerate() {
+            if let b'a' ... b'z' = b {
+                return Atom::from_mutated_str(self, |s| s[i..].make_ascii_uppercase())
+            }
+        }
+        self.clone()
+    }
+
+    /// Like [`to_ascii_lowercase`].
+    ///
+    /// [`to_ascii_lowercase`]: https://doc.rust-lang.org/std/ascii/trait.AsciiExt.html#tymethod.to_ascii_lowercase
+    pub fn to_ascii_lowercase(&self) -> Self {
+        for (i, b) in self.bytes().enumerate() {
+            if let b'A' ... b'Z' = b {
+                return Atom::from_mutated_str(self, |s| s[i..].make_ascii_lowercase())
+            }
+        }
+        self.clone()
+    }
+
+    /// Like [`eq_ignore_ascii_case`].
+    ///
+    /// [`eq_ignore_ascii_case`]: https://doc.rust-lang.org/std/ascii/trait.AsciiExt.html#tymethod.eq_ignore_ascii_case
+    pub fn eq_ignore_ascii_case(&self, other: &Self) -> bool {
+        (self == other) || self.eq_str_ignore_ascii_case(&**other)
+    }
+
+    /// Like [`eq_ignore_ascii_case`], but takes an unhashed string as `other`.
+    ///
+    /// [`eq_ignore_ascii_case`]: https://doc.rust-lang.org/std/ascii/trait.AsciiExt.html#tymethod.eq_ignore_ascii_case
+    pub fn eq_str_ignore_ascii_case(&self, other: &str) -> bool {
+        (&**self).eq_ignore_ascii_case(other)
+    }
+}
+
+// Atoms use a compact representation which fits this enum in a single u64.
+// Inlining avoids actually constructing the unpacked representation in memory.
+#[allow(missing_copy_implementations)]
+enum UnpackedAtom {
+    /// Pointer to a dynamic table entry.  Must be 16-byte aligned!
+    Dynamic(*mut ()),
+
+    /// Length + bytes of string.
+    Inline(u8, [u8; 7]),
+
+    /// Index in static interning table.
+    Static(u32),
+}
+
+#[inline(always)]
+fn inline_atom_slice(x: &u64) -> &[u8] {
+    unsafe {
+        let x: *const u64 = x;
+        let mut data = x as *const u8;
+        // All except the lowest byte, which is first in little-endian, last in big-endian.
+        if cfg!(target_endian = "little") {
+            data = data.offset(1);
+        }
+        let len = 7;
+        slice::from_raw_parts(data, len)
+    }
+}
+
+#[inline(always)]
+fn inline_atom_slice_mut(x: &mut u64) -> &mut [u8] {
+    unsafe {
+        let x: *mut u64 = x;
+        let mut data = x as *mut u8;
+        // All except the lowest byte, which is first in little-endian, last in big-endian.
+        if cfg!(target_endian = "little") {
+            data = data.offset(1);
+        }
+        let len = 7;
+        slice::from_raw_parts_mut(data, len)
+    }
+}
+
+impl UnpackedAtom {
+    /// Pack a key, fitting it into a u64 with flags and data. See `string_cache_shared` for
+    /// hints for the layout.
+    #[inline(always)]
+    unsafe fn pack(self) -> u64 {
+        match self {
+            Static(n) => pack_static(n),
+            Dynamic(p) => {
+                let n = p as u64;
+                debug_assert!(0 == n & TAG_MASK);
+                n
+            }
+            Inline(len, buf) => {
+                debug_assert!((len as usize) <= MAX_INLINE_LEN);
+                let mut data: u64 = (INLINE_TAG as u64) | ((len as u64) << 4);
+                {
+                    let dest = inline_atom_slice_mut(&mut data);
+                    dest.copy_from_slice(&buf)
+                }
+                data
+            }
+        }
+    }
+
+    /// Unpack a key, extracting information from a single u64 into useable structs.
+    #[inline(always)]
+    unsafe fn from_packed(data: u64) -> UnpackedAtom {
+        debug_assert!(DYNAMIC_TAG == 0); // Dynamic is untagged
+
+        match (data & TAG_MASK) as u8 {
+            DYNAMIC_TAG => Dynamic(data as *mut ()),
+            STATIC_TAG => Static((data >> STATIC_SHIFT_BITS) as u32),
+            INLINE_TAG => {
+                let len = ((data & 0xf0) >> 4) as usize;
+                debug_assert!(len <= MAX_INLINE_LEN);
+                let mut buf: [u8; 7] = [0; 7];
+                let src = inline_atom_slice(&data);
+                buf.copy_from_slice(src);
+                Inline(len as u8, buf)
+            },
+            _ => debug_unreachable!(),
+        }
+    }
+}
+
+/// Used for a fast path in Clone and Drop.
+#[inline(always)]
+unsafe fn from_packed_dynamic(data: u64) -> Option<*mut ()> {
+    if (DYNAMIC_TAG as u64) == (data & TAG_MASK) {
+        Some(data as *mut ())
+    } else {
+        None
+    }
+}
+
+/// For as_slice on inline atoms, we need a pointer into the original
+/// string contents.
+///
+/// It's undefined behavior to call this on a non-inline atom!!
+#[inline(always)]
+unsafe fn inline_orig_bytes<'a>(data: &'a u64) -> &'a [u8] {
+    match UnpackedAtom::from_packed(*data) {
+        Inline(len, _) => {
+            let src = inline_atom_slice(&data);
+            &src[..(len as usize)]
+        }
+        _ => debug_unreachable!(),
+    }
+}
+
+#[cfg(test)]
+#[macro_use]
+mod tests {
+    use std::mem;
+    use std::thread;
+    use super::{StaticAtomSet, StringCacheEntry};
+    use super::UnpackedAtom::{Dynamic, Inline, Static};
+    use shared::ENTRY_ALIGNMENT;
+
+    include!(concat!(env!("OUT_DIR"), "/test_atom.rs"));
+    pub type Atom = TestAtom;
+
+    #[test]
+    fn test_as_slice() {
+        let s0 = Atom::from("");
+        assert!(s0.as_ref() == "");
+
+        let s1 = Atom::from("class");
+        assert!(s1.as_ref() == "class");
+
+        let i0 = Atom::from("blah");
+        assert!(i0.as_ref() == "blah");
+
+        let s0 = Atom::from("BLAH");
+        assert!(s0.as_ref() == "BLAH");
+
+        let d0 = Atom::from("zzzzzzzzzz");
+        assert!(d0.as_ref() == "zzzzzzzzzz");
+
+        let d1 = Atom::from("ZZZZZZZZZZ");
+        assert!(d1.as_ref() == "ZZZZZZZZZZ");
+    }
+
+    macro_rules! unpacks_to (($e:expr, $t:pat) => (
+        match unsafe { Atom::from($e).unpack() } {
+            $t => (),
+            _ => panic!("atom has wrong type"),
+        }
+    ));
+
+    #[test]
+    fn test_types() {
+        unpacks_to!("", Static(..));
+        unpacks_to!("id", Static(..));
+        unpacks_to!("body", Static(..));
+        unpacks_to!("c", Inline(..)); // "z" is a static atom
+        unpacks_to!("zz", Inline(..));
+        unpacks_to!("zzz", Inline(..));
+        unpacks_to!("zzzz", Inline(..));
+        unpacks_to!("zzzzz", Inline(..));
+        unpacks_to!("zzzzzz", Inline(..));
+        unpacks_to!("zzzzzzz", Inline(..));
+        unpacks_to!("zzzzzzzz", Dynamic(..));
+        unpacks_to!("zzzzzzzzzzzzz", Dynamic(..));
+    }
+
+    #[test]
+    fn test_equality() {
+        let s0 = Atom::from("fn");
+        let s1 = Atom::from("fn");
+        let s2 = Atom::from("loop");
+
+        let i0 = Atom::from("blah");
+        let i1 = Atom::from("blah");
+        let i2 = Atom::from("blah2");
+
+        let d0 = Atom::from("zzzzzzzz");
+        let d1 = Atom::from("zzzzzzzz");
+        let d2 = Atom::from("zzzzzzzzz");
+
+        assert!(s0 == s1);
+        assert!(s0 != s2);
+
+        assert!(i0 == i1);
+        assert!(i0 != i2);
+
+        assert!(d0 == d1);
+        assert!(d0 != d2);
+
+        assert!(s0 != i0);
+        assert!(s0 != d0);
+        assert!(i0 != d0);
+    }
+
+    #[test]
+    fn default() {
+        assert_eq!(TestAtom::default(), test_atom!(""));
+        assert_eq!(&*TestAtom::default(), "");
+    }
+
+    #[test]
+    fn ord() {
+        fn check(x: &str, y: &str) {
+            assert_eq!(x < y, Atom::from(x) < Atom::from(y));
+            assert_eq!(x.cmp(y), Atom::from(x).cmp(&Atom::from(y)));
+            assert_eq!(x.partial_cmp(y), Atom::from(x).partial_cmp(&Atom::from(y)));
+        }
+
+        check("a", "body");
+        check("asdf", "body");
+        check("zasdf", "body");
+        check("z", "body");
+
+        check("a", "bbbbb");
+        check("asdf", "bbbbb");
+        check("zasdf", "bbbbb");
+        check("z", "bbbbb");
+    }
+
+    #[test]
+    fn clone() {
+        let s0 = Atom::from("fn");
+        let s1 = s0.clone();
+        let s2 = Atom::from("loop");
+
+        let i0 = Atom::from("blah");
+        let i1 = i0.clone();
+        let i2 = Atom::from("blah2");
+
+        let d0 = Atom::from("zzzzzzzz");
+        let d1 = d0.clone();
+        let d2 = Atom::from("zzzzzzzzz");
+
+        assert!(s0 == s1);
+        assert!(s0 != s2);
+
+        assert!(i0 == i1);
+        assert!(i0 != i2);
+
+        assert!(d0 == d1);
+        assert!(d0 != d2);
+
+        assert!(s0 != i0);
+        assert!(s0 != d0);
+        assert!(i0 != d0);
+    }
+
+    macro_rules! assert_eq_fmt (($fmt:expr, $x:expr, $y:expr) => ({
+        let x = $x;
+        let y = $y;
+        if x != y {
+            panic!("assertion failed: {} != {}",
+                format_args!($fmt, x),
+                format_args!($fmt, y));
+        }
+    }));
+
+    #[test]
+    fn repr() {
+        fn check(s: &str, data: u64) {
+            assert_eq_fmt!("0x{:016X}", Atom::from(s).unsafe_data, data);
+        }
+
+        fn check_static(s: &str, x: Atom) {
+            assert_eq_fmt!("0x{:016X}", x.unsafe_data, Atom::from(s).unsafe_data);
+            assert_eq!(0x2, x.unsafe_data & 0xFFFF_FFFF);
+            // The index is unspecified by phf.
+            assert!((x.unsafe_data >> 32) <= TestAtomStaticSet::get().atoms.len() as u64);
+        }
+
+        // This test is here to make sure we don't change atom representation
+        // by accident.  It may need adjusting if there are changes to the
+        // static atom table, the tag values, etc.
+
+        // Static atoms
+        check_static("a",       test_atom!("a"));
+        check_static("address", test_atom!("address"));
+        check_static("area",    test_atom!("area"));
+
+        // Inline atoms
+        check("e",       0x0000_0000_0000_6511);
+        check("xyzzy",   0x0000_797A_7A79_7851);
+        check("xyzzy01", 0x3130_797A_7A79_7871);
+
+        // Dynamic atoms. This is a pointer so we can't verify every bit.
+        assert_eq!(0x00, Atom::from("a dynamic string").unsafe_data & 0xf);
+    }
+
+    #[test]
+    fn assert_sizes() {
+        use std::mem;
+        struct EmptyWithDrop;
+        impl Drop for EmptyWithDrop {
+            fn drop(&mut self) {}
+        }
+        let compiler_uses_inline_drop_flags = mem::size_of::<EmptyWithDrop>() > 0;
+
+        // Guard against accidental changes to the sizes of things.
+        assert_eq!(mem::size_of::<Atom>(),
+                   if compiler_uses_inline_drop_flags { 16 } else { 8 });
+        assert_eq!(mem::size_of::<super::StringCacheEntry>(),
+                   8 + 4 * mem::size_of::<usize>());
+    }
+
+    #[test]
+    fn test_threads() {
+        for _ in 0_u32..100 {
+            thread::spawn(move || {
+                let _ = Atom::from("a dynamic string");
+                let _ = Atom::from("another string");
+            });
+        }
+    }
+
+    #[test]
+    fn atom_macro() {
+        assert_eq!(test_atom!("body"), Atom::from("body"));
+        assert_eq!(test_atom!("font-weight"), Atom::from("font-weight"));
+    }
+
+    #[test]
+    fn match_atom() {
+        assert_eq!(2, match Atom::from("head") {
+            test_atom!("br") => 1,
+            test_atom!("html") | test_atom!("head") => 2,
+            _ => 3,
+        });
+
+        assert_eq!(3, match Atom::from("body") {
+            test_atom!("br") => 1,
+            test_atom!("html") | test_atom!("head") => 2,
+            _ => 3,
+        });
+
+        assert_eq!(3, match Atom::from("zzzzzz") {
+            test_atom!("br") => 1,
+            test_atom!("html") | test_atom!("head") => 2,
+            _ => 3,
+        });
+    }
+
+    #[test]
+    fn ensure_deref() {
+        // Ensure we can Deref to a &str
+        let atom = Atom::from("foobar");
+        let _: &str = &atom;
+    }
+
+    #[test]
+    fn ensure_as_ref() {
+        // Ensure we can as_ref to a &str
+        let atom = Atom::from("foobar");
+        let _: &str = atom.as_ref();
+    }
+
+    #[test]
+    fn string_cache_entry_alignment_is_sufficient() {
+        assert!(mem::align_of::<StringCacheEntry>() >= ENTRY_ALIGNMENT);
+    }
+
+    #[test]
+    fn test_ascii_lowercase() {
+        assert_eq!(Atom::from("").to_ascii_lowercase(), Atom::from(""));
+        assert_eq!(Atom::from("aZ9").to_ascii_lowercase(), Atom::from("az9"));
+        assert_eq!(Atom::from("The Quick Brown Fox!").to_ascii_lowercase(), Atom::from("the quick brown fox!"));
+        assert_eq!(Atom::from("JE VAIS À PARIS").to_ascii_lowercase(), Atom::from("je vais À paris"));
+    }
+
+    #[test]
+    fn test_ascii_uppercase() {
+        assert_eq!(Atom::from("").to_ascii_uppercase(), Atom::from(""));
+        assert_eq!(Atom::from("aZ9").to_ascii_uppercase(), Atom::from("AZ9"));
+        assert_eq!(Atom::from("The Quick Brown Fox!").to_ascii_uppercase(), Atom::from("THE QUICK BROWN FOX!"));
+        assert_eq!(Atom::from("Je vais à Paris").to_ascii_uppercase(), Atom::from("JE VAIS à PARIS"));
+    }
+
+    #[test]
+    fn test_eq_ignore_ascii_case() {
+        assert!(Atom::from("").eq_ignore_ascii_case(&Atom::from("")));
+        assert!(Atom::from("aZ9").eq_ignore_ascii_case(&Atom::from("aZ9")));
+        assert!(Atom::from("aZ9").eq_ignore_ascii_case(&Atom::from("Az9")));
+        assert!(Atom::from("The Quick Brown Fox!").eq_ignore_ascii_case(&Atom::from("THE quick BROWN fox!")));
+        assert!(Atom::from("Je vais à Paris").eq_ignore_ascii_case(&Atom::from("je VAIS à PARIS")));
+        assert!(!Atom::from("").eq_ignore_ascii_case(&Atom::from("az9")));
+        assert!(!Atom::from("aZ9").eq_ignore_ascii_case(&Atom::from("")));
+        assert!(!Atom::from("aZ9").eq_ignore_ascii_case(&Atom::from("9Za")));
+        assert!(!Atom::from("The Quick Brown Fox!").eq_ignore_ascii_case(&Atom::from("THE quick BROWN fox!!")));
+        assert!(!Atom::from("Je vais à Paris").eq_ignore_ascii_case(&Atom::from("JE vais À paris")));
+    }
+
+    #[test]
+    fn test_from_string() {
+        assert!(Atom::from("camembert".to_owned()) == Atom::from("camembert"));
+    }
+}
+
+#[cfg(all(test, feature = "unstable"))]
+#[path = "bench.rs"]
+mod bench;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/src/bench.rs
@@ -0,0 +1,216 @@
+// Copyright 2014 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+/*
+
+A cautionary note about these benchmarks:
+
+Many of the operations we're attempting to measure take less than one
+nanosecond. That's why we run them thousands of times in a loop just to get a
+single iteration that Rust's statistical benchmarking can work with. At that
+scale, any change anywhere in the library can produce durable performance
+regressions on the order of half a nanosecond, i.e. "500 ns" in the output for
+a test like eq_x_1000.
+
+We can't get anything done if we rachet on these numbers! They are more useful
+for selecting between alternatives, and for noticing large regressions or
+inconsistencies.
+
+Furthermore, a large part of the point of interning is to make strings small
+and cheap to move around, which isn't reflected in these tests.
+
+*/
+
+use atom::tests::TestAtom;
+use test::{Bencher, black_box};
+
+// Just shorthand
+fn mk(x: &str) -> TestAtom {
+    TestAtom::from(x)
+}
+
+macro_rules! check_type (($name:ident, $x:expr, $p:pat) => (
+    // NB: "cargo bench" does not run these!
+    #[test]
+    fn $name() {
+        match unsafe { $x.unpack() } {
+            $p => (),
+            _ => panic!("atom has wrong type"),
+        }
+    }
+));
+
+macro_rules! bench_tiny_op (($name:ident, $op:ident, $ctor_x:expr, $ctor_y:expr) => (
+    #[bench]
+    fn $name(b: &mut Bencher) {
+        const n: usize = 1000;
+        let xs: Vec<_> = repeat($ctor_x).take(n).collect();
+        let ys: Vec<_> = repeat($ctor_y).take(n).collect();
+
+        b.iter(|| {
+            for (x, y) in xs.iter().zip(ys.iter()) {
+                black_box(x.$op(y));
+            }
+        });
+    }
+));
+
+macro_rules! bench_one (
+    (x_static   $x:expr, $y:expr) => (check_type!(check_type_x, $x, Static(..)););
+    (x_inline   $x:expr, $y:expr) => (check_type!(check_type_x, $x, Inline(..)););
+    (x_dynamic  $x:expr, $y:expr) => (check_type!(check_type_x, $x, Dynamic(..)););
+    (y_static   $x:expr, $y:expr) => (check_type!(check_type_y, $y, Static(..)););
+    (y_inline   $x:expr, $y:expr) => (check_type!(check_type_y, $y, Inline(..)););
+    (y_dynamic  $x:expr, $y:expr) => (check_type!(check_type_y, $y, Dynamic(..)););
+    (is_static  $x:expr, $y:expr) => (bench_one!(x_static  $x, $y); bench_one!(y_static  $x, $y););
+    (is_inline  $x:expr, $y:expr) => (bench_one!(x_inline  $x, $y); bench_one!(y_inline  $x, $y););
+    (is_dynamic $x:expr, $y:expr) => (bench_one!(x_dynamic $x, $y); bench_one!(y_dynamic $x, $y););
+
+    (eq $x:expr, $_y:expr) => (bench_tiny_op!(eq_x_1000, eq, $x, $x););
+    (ne $x:expr, $y:expr)  => (bench_tiny_op!(ne_x_1000, ne, $x, $y););
+    (lt $x:expr, $y:expr)  => (bench_tiny_op!(lt_x_1000, lt, $x, $y););
+
+    (intern $x:expr, $_y:expr) => (
+        #[bench]
+        fn intern(b: &mut Bencher) {
+            let x = $x.to_string();
+            b.iter(|| {
+                black_box(TestAtom::from(&*x));
+            });
+        }
+    );
+
+    (as_ref $x:expr, $_y:expr) => (
+        #[bench]
+        fn as_ref_x_1000(b: &mut Bencher) {
+            let x = $x;
+            b.iter(|| {
+                for _ in 0..1000 {
+                    black_box(x.as_ref());
+                }
+            });
+        }
+    );
+
+    (clone $x:expr, $_y:expr) => (
+        #[bench]
+        fn clone_x_1000(b: &mut Bencher) {
+            let x = $x;
+            b.iter(|| {
+                for _ in 0..1000 {
+                    black_box(x.clone());
+                }
+            });
+        }
+    );
+
+    (clone_string $x:expr, $_y:expr) => (
+        #[bench]
+        fn clone_x_1000(b: &mut Bencher) {
+            let x = $x.to_string();
+            b.iter(|| {
+                for _ in 0..1000 {
+                    black_box(x.clone());
+                }
+            });
+        }
+    );
+);
+
+macro_rules! bench_all (
+    ([ $($which:ident)+ ] for $name:ident = $x:expr, $y:expr) => (
+        // FIXME: This module works around rust-lang/rust#12249 so we don't
+        // have to repeat the names for eq and neq.
+        mod $name {
+            #![allow(unused_imports)]
+
+            use test::{Bencher, black_box};
+            use std::string::ToString;
+            use std::iter::repeat;
+
+            use atom::tests::TestAtom;
+            use atom::UnpackedAtom::{Static, Inline, Dynamic};
+
+            use super::mk;
+
+            $(
+                bench_one!($which $x, $y);
+            )+
+        }
+    );
+);
+
+pub const longer_dynamic_a: &'static str
+    = "Thee Silver Mt. Zion Memorial Orchestra & Tra-La-La Band";
+pub const longer_dynamic_b: &'static str
+    = "Thee Silver Mt. Zion Memorial Orchestra & Tra-La-La Ban!";
+
+bench_all!([eq ne lt clone_string] for short_string = "e", "f");
+bench_all!([eq ne lt clone_string] for medium_string = "xyzzy01", "xyzzy02");
+bench_all!([eq ne lt clone_string]
+    for longer_string = super::longer_dynamic_a, super::longer_dynamic_b);
+
+bench_all!([eq ne intern as_ref clone is_static lt]
+    for static_atom = test_atom!("a"), test_atom!("b"));
+
+bench_all!([intern as_ref clone is_inline]
+    for short_inline_atom = mk("e"), mk("f"));
+
+bench_all!([eq ne intern as_ref clone is_inline lt]
+    for medium_inline_atom = mk("xyzzy01"), mk("xyzzy02"));
+
+bench_all!([intern as_ref clone is_dynamic]
+    for min_dynamic_atom = mk("xyzzy001"), mk("xyzzy002"));
+
+bench_all!([eq ne intern as_ref clone is_dynamic lt]
+    for longer_dynamic_atom = mk(super::longer_dynamic_a), mk(super::longer_dynamic_b));
+
+bench_all!([intern as_ref clone is_static]
+    for static_at_runtime = mk("a"), mk("b"));
+
+bench_all!([ne lt x_static y_inline]
+    for static_vs_inline  = test_atom!("a"), mk("f"));
+
+bench_all!([ne lt x_static y_dynamic]
+    for static_vs_dynamic = test_atom!("a"), mk(super::longer_dynamic_b));
+
+bench_all!([ne lt x_inline y_dynamic]
+    for inline_vs_dynamic = mk("e"), mk(super::longer_dynamic_b));
+
+macro_rules! bench_rand ( ($name:ident, $len:expr) => (
+    #[bench]
+    fn $name(b: &mut Bencher) {
+        use std::str;
+        use rand;
+        use rand::Rng;
+
+        let mut gen = rand::weak_rng();
+        b.iter(|| {
+            // We have to generate new atoms on every iter, because
+            // the dynamic atom table isn't reset.
+            //
+            // I measured the overhead of random string generation
+            // as about 3-12% at one point.
+
+            let mut buf: [u8; $len] = [0; $len];
+            gen.fill_bytes(&mut buf);
+            for n in buf.iter_mut() {
+                // shift into printable ASCII
+                *n = (*n % 0x40) + 0x20;
+            }
+            let s = str::from_utf8(&buf[..]).unwrap();
+            black_box(TestAtom::from(s));
+        });
+    }
+));
+
+bench_rand!(intern_rand_008,   8);
+bench_rand!(intern_rand_032,  32);
+bench_rand!(intern_rand_128, 128);
+bench_rand!(intern_rand_512, 512);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/src/event.rs
@@ -0,0 +1,28 @@
+// Copyright 2014 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::sync::Mutex;
+
+#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug)]
+pub enum Event {
+    Intern(u64),
+    Insert(u64, String),
+    Remove(u64),
+}
+
+lazy_static! {
+    pub static ref LOG: Mutex<Vec<Event>>
+        = Mutex::new(Vec::with_capacity(50_000));
+}
+
+pub fn log(e: Event) {
+    LOG.lock().unwrap().push(e);
+}
+
+macro_rules! log (($e:expr) => (::event::log($e)));
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache/src/lib.rs
@@ -0,0 +1,37 @@
+// Copyright 2014 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![crate_name = "string_cache"]
+#![crate_type = "rlib"]
+
+#![cfg_attr(test, deny(warnings))]
+#![cfg_attr(all(test, feature = "unstable"), feature(test))]
+
+#[cfg(all(test, feature = "unstable"))] extern crate test;
+#[cfg(all(test, feature = "unstable"))] extern crate rand;
+#[macro_use] extern crate lazy_static;
+#[macro_use] extern crate debug_unreachable;
+extern crate phf_shared;
+extern crate precomputed_hash;
+extern crate serde;
+extern crate string_cache_shared as shared;
+
+pub use atom::{Atom, StaticAtomSet, PhfStrSet, EmptyStaticAtomSet, DefaultAtom};
+
+#[cfg(feature = "log-events")]
+#[macro_use]
+pub mod event;
+
+pub mod atom;
+
+// Make test_atom! macro work in this crate.
+// `$crate` would not be appropriate for other crates creating such macros
+mod string_cache {
+    pub use {Atom, StaticAtomSet, PhfStrSet};
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_codegen/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"3a227982587f7b714d78032d3fee9490c289a8907aae153ef897e7f0867ff351","lib.rs":"2379ed4126b680fc8ccd20b6087f304b3797459a2b5e300cda09e982872522ff"},"package":"479cde50c3539481f33906a387f2bd17c8e87cb848c35b6021d41fb81ff9b4d7"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_codegen/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+
+name = "string_cache_codegen"
+version = "0.4.0"  # Also update ../README.md when making a semver-breaking change
+authors = [ "The Servo Project Developers" ]
+description = "A codegen library for string-cache, developed as part of the Servo project."
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/string-cache"
+documentation = "https://docs.rs/string_cache_codegen/"
+
+[lib]
+name = "string_cache_codegen"
+path = "lib.rs"
+
+[dependencies]
+string_cache_shared = {path = "../shared", version = "0.3"}
+phf_generator = "0.7.15"
+phf_shared = "0.7.4"
+quote = "0.3.9"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_codegen/lib.rs
@@ -0,0 +1,153 @@
+// Copyright 2016 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![recursion_limit = "128"]
+
+extern crate phf_generator;
+extern crate phf_shared;
+extern crate string_cache_shared as shared;
+#[macro_use] extern crate quote;
+
+use std::collections::HashSet;
+use std::fs::File;
+use std::io::{self, Write, BufWriter};
+use std::iter;
+use std::path::Path;
+
+/// A builder for a static atom set and relevant macros
+pub struct AtomType {
+    path: String,
+    macro_name: String,
+    atoms: HashSet<String>,
+}
+
+impl AtomType {
+    /// Constructs a new static atom set builder
+    ///
+    /// `path` is a path within a crate of the atom type that will be created.
+    /// e.g. `"FooAtom"` at the crate root or `"foo::Atom"` if the generated code
+    /// is included in a `foo` module.
+    ///
+    /// `macro_name` must end with `!`.
+    ///
+    /// For example, `AtomType::new("foo::FooAtom", "foo_atom!")` will generate:
+    ///
+    /// ```rust
+    /// pub type FooAtom = ::string_cache::Atom<FooAtomStaticSet>;
+    /// pub struct FooAtomStaticSet;
+    /// impl ::string_cache::StaticAtomSet for FooAtomStaticSet {
+    ///     // ...
+    /// }
+    /// #[macro_export]
+    /// macro_rules foo_atom {
+    ///    // Expands to: $crate::foo::FooAtom { … }
+    /// }
+    pub fn new(path: &str, macro_name: &str) -> Self {
+        assert!(macro_name.ends_with("!"));
+        AtomType {
+            path: path.to_owned(),
+            macro_name: macro_name[..macro_name.len() - "!".len()].to_owned(),
+            atoms: HashSet::new(),
+        }
+    }
+
+    /// Adds an atom to the builder
+    pub fn atom(&mut self, s: &str) -> &mut Self {
+        self.atoms.insert(s.to_owned());
+        self
+    }
+
+    /// Adds multiple atoms to the builder
+    pub fn atoms<I>(&mut self, iter: I) -> &mut Self
+    where I: IntoIterator, I::Item: AsRef<str> {
+        self.atoms.extend(iter.into_iter().map(|s| s.as_ref().to_owned()));
+        self
+    }
+
+    /// Write generated code to `destination`.
+    pub fn write_to<W>(&mut self, mut destination: W) -> io::Result<()> where W: Write {
+        destination.write_all(
+            self.to_tokens()
+            .as_str()
+            // Insert some newlines to make the generated code slightly easier to read.
+            .replace(" [ \"", "[\n\"")
+            .replace("\" , ", "\",\n")
+            .replace(" ( \"", "\n( \"")
+            .replace("; ", ";\n")
+            .as_bytes())
+    }
+
+    fn to_tokens(&mut self) -> quote::Tokens {
+        // `impl Default for Atom` requires the empty string to be in the static set.
+        // This also makes sure the set in non-empty,
+        // which would cause divisions by zero in rust-phf.
+        self.atoms.insert(String::new());
+
+        let atoms: Vec<&str> = self.atoms.iter().map(|s| &**s).collect();
+        let hash_state = phf_generator::generate_hash(&atoms);
+        let phf_generator::HashState { key, disps, map } = hash_state;
+        let atoms: Vec<&str> = map.iter().map(|&idx| atoms[idx]).collect();
+        let empty_string_index = atoms.iter().position(|s| s.is_empty()).unwrap() as u32;
+        let data = (0..atoms.len()).map(|i| quote::Hex(shared::pack_static(i as u32)));
+
+        let hashes: Vec<u32> =
+            atoms.iter().map(|string| {
+                let hash = phf_shared::hash(string, key);
+                ((hash >> 32) ^ hash) as u32
+            }).collect();
+
+        let type_name = if let Some(position) = self.path.rfind("::") {
+            &self.path[position + "::".len() ..]
+        } else {
+            &self.path
+        };
+        let static_set_name = quote::Ident::from(format!("{}StaticSet", type_name));
+        let type_name = quote::Ident::from(type_name);
+        let macro_name = quote::Ident::from(&*self.macro_name);
+        let path = iter::repeat(quote::Ident::from(&*self.path));
+
+        quote! {
+            pub type #type_name = ::string_cache::Atom<#static_set_name>;
+            pub struct #static_set_name;
+            impl ::string_cache::StaticAtomSet for #static_set_name {
+                fn get() -> &'static ::string_cache::PhfStrSet {
+                    static SET: ::string_cache::PhfStrSet = ::string_cache::PhfStrSet {
+                        key: #key,
+                        disps: &#disps,
+                        atoms: &#atoms,
+                        hashes: &#hashes
+                    };
+                    &SET
+                }
+                fn empty_string_index() -> u32 {
+                    #empty_string_index
+                }
+            }
+            #[macro_export]
+            macro_rules! #macro_name {
+                #(
+                    (#atoms) => {
+                        $crate::#path {
+                            unsafe_data: #data,
+                            phantom: ::std::marker::PhantomData,
+                        }
+                    };
+                )*
+            }
+        }
+    }
+
+    /// Create a new file at `path` and write generated code there.
+    ///
+    /// Typical usage:
+    /// `.write_to_file(&Path::new(&env::var("OUT_DIR").unwrap()).join("foo_atom.rs"))`
+    pub fn write_to_file(&mut self, path: &Path) -> io::Result<()> {
+        self.write_to(BufWriter::new(try!(File::create(path))))
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_shared/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"17188affe9a9428144b1197ccafaddea0e8cdca9e1c8e25ea69700c56510e694","lib.rs":"1f1010465a72516c041e6f13352f3c7a6f9e0ed358b48e49d7a8f77555669138"},"package":"b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_shared/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+
+name = "string_cache_shared"
+version = "0.3.0"
+authors = [ "The Servo Project Developers" ]
+description = "Code share between string_cache and string_cache_codegen."
+license = "MIT / Apache-2.0"
+repository = "https://github.com/servo/string-cache"
+
+[lib]
+path = "lib.rs"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/string_cache_shared/lib.rs
@@ -0,0 +1,23 @@
+// Copyright 2015 The Servo Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// FIXME(rust-lang/rust#18153): generate these from an enum
+pub const DYNAMIC_TAG: u8 = 0b_00;
+pub const INLINE_TAG: u8 = 0b_01;  // len in upper nybble
+pub const STATIC_TAG: u8 = 0b_10;
+pub const TAG_MASK: u64 = 0b_11;
+pub const ENTRY_ALIGNMENT: usize = 4;  // Multiples have TAG_MASK bits unset, available for tagging.
+
+pub const MAX_INLINE_LEN: usize = 7;
+
+pub const STATIC_SHIFT_BITS: usize = 32;
+
+pub fn pack_static(n: u32) -> u64 {
+    (STATIC_TAG as u64) | ((n as u64) << STATIC_SHIFT_BITS)
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"8a98e02ce273cefe3e6bdc92966575a9a71957ec49dba52301f5bdea8c194f9f","Cargo.toml":"f88e383191ad44e3f49cb5ed1389fd1f0cca6be0e9cc5f37f11c323186cd8bf6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"f5d6df44431e0814368b2890d954ae2253efb7765925582de8be11eb16a505a6","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","rustfmt.toml":"be851a0fa92766755e54e163ccceedee0b28ea6d527888c48f1cbc766f23733c","scripts/id_rsa.enc":"210d1476adba1c08d77329d9f71dba828c0516d8ae659c6317c9bee4683e5d50","scripts/travis-doc-upload.cfg":"2609cb89644596a2ede3cd63b7a5fb6e84ee56c2b880ff67584e9655f4a2e777","src/lib.rs":"53c4f63f2bc07326024b8663961790ecd0a136b14c38eacb4c751764da5d5f2c","src/terminfo/mod.rs":"a47021ff3bca69131cbd23b3df0143a9baebf2c1949687ec1b726b29b157ba6f","src/terminfo/parm.rs":"efde5f3ab1cb5a646f51f07bd90cd05154e7d080c96dc03ae33dc2a125c5aedd","src/terminfo/parser/compiled.rs":"8f5a87d19c0bdfbc95f9fed8deb447e07d1368abca6d147f79c14b2f164b4a11","src/terminfo/parser/names.rs":"dd32022a5f198abc40fa68566c0798725451345173a7d80c80e05a121c8cf0f8","src/terminfo/searcher.rs":"5602a32e555762e5171c1865c2c1b3b6bb092b8c233f413bc0933658bed40b67","src/win.rs":"9efbdc4bb18b317e3d98fa58e441cc8903710ac0e6f315899329660cf6d10277","tests/data/dumb":"123c85a2812a517d967db5f31660db0e6aded4a0b95ed943c5ab435368e7a25c","tests/data/linux":"9dcec472e8ec612e84b46c2b8ae17a4f47b2ccfe93bc7b16970bbaaa20fab1e9","tests/data/linux-16color":"eb0b5684a42db662ebaa0043cc4bb5e082b09a7312796ec669e0159fce6af499","tests/data/linux-basic":"1373c033c6a891911a0a478e5f9654600e84dbfe2d16f649ba2fc08802335a0c","tests/data/linux-c":"50807ab8371b45bd80ca9d563de882b733b5db88cff7646e40c344e98ef755ed","tests/data/linux-c-nc":"d88eb59f749d91be3148ce39dec7c050d95feb516702ed7f9f6cec7a58b424a7","tests/data/linux-koi8":"4b7d942f03ce95d45802029db0c87879eb93be50b43026c63c18a3552dd37c93","tests/data/linux-koi8r":"7267d93deec24396a9955e95da621c054d8d677634b465d798f792141b24e1de","tests/data/linux-lat":"b72b2ec68fa445e2e0ae96cc7bb2149a1527e11ae475d1957c8a22d9ec2c0905","tests/data/linux-m":"4a92f6fef1eeb679ec4511579d3004cfe6fc1d4dd73fed5299cde568f6cf3fbf","tests/data/linux-nic":"eac886df04c80e6ba02687087ddc93635c0f433f4f28195447499a8963989f21","tests/data/linux-vt":"2ebd4c761a492190609f6d8bcdd8f9c8c81e281b0d5e8a51b87f4ba126370bb4","tests/data/linux2.2":"c3d6e1466e9fb4111f4bf243b87a3de290d85224f1a4241947a3f51bdff08b82","tests/data/linux2.6":"52c2930ab1cad8271c280fefb1f581b12b7b3be445348d047a39f5e3448b3614","tests/data/linux2.6.26":"88f5a62b78956a21015ac887c5189a9f72900a842c2f844a1a5e197151a078d2","tests/data/linux3.0":"29b2aad27b5c291adab85e4150883fa6dc0034671c67e889d722168735ba2504","tests/data/rxvt":"9411be0058e147fc7a1962cd35145446d3d439ac3be9b6ca9d3aa2aa0c28ef5e","tests/data/rxvt-16color":"d41e75a0bad0e7c6d957c727f68dc507898685f3bbd71f0721a0a4beb14daf08","tests/data/rxvt-256color":"e6415e230d7962133d1da913cfcf23a0e2d3ed75379164a921feb9462c475a8e","tests/data/rxvt-88color":"958a81509d2b1e2cfe5a7bcf7a15e81d12575e4ccaa1dd308eda8edf7905a36a","tests/data/rxvt-basic":"3989e1c659121cb8fd8f67b8bff7f304e52c1f401cd1d09e906e11a58e0bc587","tests/data/rxvt-color":"3d2b49d48aca7fad7a3bf26d06592207b3c3cbf7afc3a5223fd0613f50a2739b","tests/data/rxvt-cygwin":"d50e434af6b3ab85b26e4f6af21c9c612d271efacaff3e64ef3da8c350a91809","tests/data/rxvt-cygwin-native":"34ee4ef070d9c366f5aba8f72a29a0e45ab552ba43b3e32265dfbe9eef157994","tests/data/rxvt-xpm":"4e8e40313ef00f0572456724249a625c36f2c5338b5014b87f236e29f612212e","tests/data/screen":"57c2888ffb9d7632381dc6191657abda998ca5f0958ad5787f848ff2206198f9","tests/data/screen-256color":"13fd658c693283ffb495d7f473bf525422e312e199bff6e64abdb70db5b22f46","tests/data/xterm":"67a59e4f0807759546dbf45c0bc2dddb30944ef553990345b1d08d7d19ddc13a","tests/data/xterm-256color":"e2525d133091a1ac38b2ad4eecd8df48eee31789c8fafac0ed99bcd6b746d8ce","tests/terminfo.rs":"e07390f101f2c109a15c2274eb31a96c602845c75f33f2775ed2a6b98ffbdf5a"},"package":"fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/.travis.yml
@@ -0,0 +1,11 @@
+language: rust
+rust:
+  - stable
+  - beta
+  - nightly
+sudo: false
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - cargo doc
+after_success: curl https://raw.githubusercontent.com/Stebalien/doc/master/push_docs.sh | sh
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/Cargo.toml
@@ -0,0 +1,31 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "term"
+version = "0.4.6"
+authors = ["The Rust Project Developers", "Steven Allen"]
+description = "A terminal formatting library\n"
+homepage = "https://github.com/Stebalien/term"
+documentation = "https://stebalien.github.io/doc/term/term/"
+readme = "README.md"
+categories = ["command-line-interface"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/Stebalien/term"
+
+[features]
+default = []
+[target."cfg(windows)".dependencies.kernel32-sys]
+version = "0.2"
+
+[target."cfg(windows)".dependencies.winapi]
+version = "0.2"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/README.md
@@ -0,0 +1,36 @@
+term
+====
+
+A Rust library for terminfo parsing and terminal colors.
+
+[![Build Status](https://travis-ci.org/Stebalien/term.svg?branch=master)](https://travis-ci.org/Stebalien/term)
+[![Build status](https://ci.appveyor.com/api/projects/status/2duvop23k4n3owyt?svg=true)](https://ci.appveyor.com/project/Stebalien/term)
+
+[Documentation](https://stebalien.github.io/doc/term/term/)
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+
+term = "*"
+```
+
+and this to your crate root:
+
+```rust
+extern crate term;
+```
+
+## Packaging and Distributing
+
+For all terminals but windows consoles, this library depends on a non-hashed
+(for now) terminfo database being present. For example, on Debian derivitives,
+you should depend on ncurses-term; on Arch Linux, you depend on ncurses; and on
+MinGW, you should depend on mingw32-terminfo.
+
+Unfortunately, if you're using a non-windows console on Windows (e.g. MinGW,
+Cygwin, Git Bash), you'll need to set the TERMINFO environment variable to
+point to the directory containing the terminfo database.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/appveyor.yml
@@ -0,0 +1,17 @@
+environment:
+  matrix:
+  - TARGET: x86_64-pc-windows-msvc
+  - TARGET: i686-pc-windows-msvc
+  - TARGET: i686-pc-windows-gnu
+install:
+  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
+  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
+  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
+  - SET PATH=%PATH%;C:\MinGW\bin
+  - rustc -V
+  - cargo -V
+
+build: false
+
+test_script:
+  - cargo test --verbose
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/rustfmt.toml
@@ -0,0 +1,3 @@
+wrap_match_arms = true
+struct_lit_multiline_style = "ForceMulti"
+wrap_comments = false
new file mode 100644
index 0000000000000000000000000000000000000000..8fb90fa04d3600d9b6d4b6ee538f570693af471a
GIT binary patch
literal 1680
zc$@){25<Q%1mY;M+5YU{b5s=&o=DR6k3^@HLK)3D{J(fu+C5rBspa+->E^ogt80r(
zzme&mJUFnLimQ`9-~q!oz>PC_hwmzWVTnmMmVY3jen0*RFe3xZYY1Q}dX#qK=qMh!
zyROZHe*9tN*uNwn^i&+SN~}=;ri-2}QdP!s!x-L!+t>QMj%)%k$3fYyxuPS-b$0#h
zG$v8hi6tou#CDp!I_7fi#(|YQH>$%2oofOYo(l<L5fnNXADxa$JZ@lm3%np=bde71
zrh8>%`828RQ!6zP@_C<{<|~VPr$Gse{+=I^+8*}-@AGnaj61T!4980SXzu8@cy%37
zm9*#M)o6fSQrdIBC2+Xs-bXRga6pL&rOT9a;!kb+vvtm*q$cf!fHT}A?HP%XX^2SE
zfADZjEKXKHY-`$a0wHh^+X!X?`6~+<*ySigp!4pW?m`GQofK)~um1dIT{<pAWVUD!
z>=j>k{Me60?cKbYjD4uo=2gZ(o0frzk*&_K26t!MauBFaJn23KRmDg>vLPs%eaT!9
z`cFH8cPQ0HLihtOlp<au8q4WZEl!jp)}h*G(}=ljH4U=n7CAw4$fQ98<A+fsk=|ct
zf#W`$vVQIX0X9g?Q+*%RXdS$=eQ_WhY@S4skow{3^nkfCu7*k5H@N3i36kR4`|O1C
z{AS~NBlNoyrXBGG3)G0vn5&N5Y<{gKE#@WlS7d2^(e=Er2IS+4U2Gl}cuyHJmSt9D
zN9Xcg03gC~k;avR?g4$6gvrkoIn0!_g^8akYHW=#wpj{{Hk|Sx=USfGU-tpW`F>nE
z`y1Z{{K!qGQx~zR&S?CyX}MxXi^m(K#0%*(2&(7pQa~oax(9U!W{#$DHd1x~8!+!_
zCLo7a=-Iy!sulhZ?aMA;JaA+36W9_HI7sR}rz=4rS1TIRK}{cErSLIU1<H>(Q=C){
z7<Pg54^jL5I%qg+PYa3bHYAt(Wsg?vcuWi5iFore@v|bsw6s{+zH$2~s>5Wr9^%zU
zqO9804ip}nL<Njgws_f(V0TV6v8?B&wTO)3D6MqI&Afc6GL$#+3kWI`T;{B0>fYm-
zt0j3YS=rLYZs<9lKFw2r%g8FgVU>xIrdEJ)1VR0CC$ocDb>#-?sKH?$H;&R=xd-}?
zX2_=MAZ+h=207wJoU730Gm%Hnrlf5bcUiSCWrXbCYm4lWJt81`G0+W<@%34v4d!@n
zufn;(2N<>)SmzSm2+KZ~Ux6COao?D!oL0%y!O3vxxhVG^q-FwOAY((WZE(i0Ny7jY
z?0j){v!RH6J!FT@hWmIBzFU=K{m-b~p95IJCersHlywxihTtJtsL(=_ilbkTUaQtw
z@rb=;4(0tHv?9HcT5Ww?Nt<eG<$G(akoT@I#Q&1tbA{TN26e--9|n0(xRrN{3`#$%
zhWLyZPfLGfG1_&l7K1JQ{};-%Wt8bq0;_CUlMXWEUgALRHLRbO2<Dj3b%dNg=nE+`
z{4vE7jm2%_f+p4dS&{yjxXIdrDm;-)9UE3csmj>NgT4VGEj`3`c-zY<NUIC#UZU$Z
zVCPj(dhwrgjA1_AmkQGu#EiJEQ6&n@iNY3MH3opjp`Y|LHN4RKpv%Qd1SD3%!r}Gg
z%T=#}@APZUgBUuxDv>A3&|xZ%$}|uKCmuRYn342x=)=$jr@Y0<Gl-*y0bh!<zEJ$N
zvr)VxADl0VX_h+UCzN*|-sa$th=-CEK0`m5`7@qF8fOtbi-TQfsf7HKQ7}>;JRakS
z<647upq#(T;^2B-dY`Q7zrNUUX$?L=NPB1%Pvljm+sG%XgkX-cX#C;W#C#b=If{~N
z2`DjfX9-0f$MA(pLy9My80Q!=N$;-ufPinG-B7*6%H4|Y3?pmT+dsI5z)Tw?lbt$y
zQR$n|F`EK7Yc@-5`t%lLk(4;1L9njrA+adbf&J6&_o_>xH8d@VxCx_Tdr<L?<?&2q
znv=8Wb2a!cx;HhM-9>sf-~(ea6u==zRT<O4>k%K5;g+y)-FUc-Gj)0N0Va235-&$C
z$bw2tCem-`6t3_0DQ&DR95nN3=yNT1rzMEgp5=EL)vTn3i!VY)^$urT&_QyTM&ftj
z-pTcGL9!`%Zwk2ncex(H4I#U*B(T?#bY{Jo8#SU=D5JBvDKT;w)qjKyigthTPnN6_
aPb;Ec5;j_Ue-paC$w4z$<DSUme2`p1iAbmb
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/scripts/travis-doc-upload.cfg
@@ -0,0 +1,3 @@
+PROJECT_NAME=term
+DOCS_REPO=Stebalien/doc.git
+SSH_KEY_TRAVIS_ID=b92a405b42db
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/lib.rs
@@ -0,0 +1,401 @@
+// Copyright 2013-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Terminal formatting library.
+//!
+//! This crate provides the `Terminal` trait, which abstracts over an [ANSI
+//! Terminal][ansi] to provide color printing, among other things. There are two
+//! implementations, the `TerminfoTerminal`, which uses control characters from
+//! a [terminfo][ti] database, and `WinConsole`, which uses the [Win32 Console
+//! API][win].
+//!
+//! # Usage
+//!
+//! This crate is [on crates.io](https://crates.io/crates/term) and can be
+//! used by adding `term` to the dependencies in your project's `Cargo.toml`.
+//!
+//! ```toml
+//! [dependencies]
+//!
+//! term = "0.4.6"
+//! ```
+//!
+//! and this to your crate root:
+//!
+//! ```rust
+//! extern crate term;
+//! ```
+//!
+//! # Examples
+//!
+//! ```no_run
+//! extern crate term;
+//! use std::io::prelude::*;
+//!
+//! fn main() {
+//!     let mut t = term::stdout().unwrap();
+//!
+//!     t.fg(term::color::GREEN).unwrap();
+//!     write!(t, "hello, ").unwrap();
+//!
+//!     t.fg(term::color::RED).unwrap();
+//!     writeln!(t, "world!").unwrap();
+//!
+//!     t.reset().unwrap();
+//! }
+//! ```
+//!
+//! [ansi]: https://en.wikipedia.org/wiki/ANSI_escape_code
+//! [win]: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682010%28v=vs.85%29.aspx
+//! [ti]: https://en.wikipedia.org/wiki/Terminfo
+
+#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
+       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
+       html_root_url = "https://stebalien.github.io/doc/term/term/",
+       test(attr(deny(warnings))))]
+#![deny(missing_docs)]
+#![cfg_attr(test, deny(warnings))]
+
+use std::io::prelude::*;
+
+pub use terminfo::TerminfoTerminal;
+#[cfg(windows)]
+pub use win::WinConsole;
+
+use std::io::{self, Stdout, Stderr};
+
+pub mod terminfo;
+
+#[cfg(windows)]
+mod win;
+
+/// Alias for stdout terminals.
+pub type StdoutTerminal = Terminal<Output = Stdout> + Send;
+/// Alias for stderr terminals.
+pub type StderrTerminal = Terminal<Output = Stderr> + Send;
+
+#[cfg(not(windows))]
+/// Return a Terminal wrapping stdout, or None if a terminal couldn't be
+/// opened.
+pub fn stdout() -> Option<Box<StdoutTerminal>> {
+    TerminfoTerminal::new(io::stdout()).map(|t| Box::new(t) as Box<StdoutTerminal>)
+}
+
+#[cfg(windows)]
+/// Return a Terminal wrapping stdout, or None if a terminal couldn't be
+/// opened.
+pub fn stdout() -> Option<Box<StdoutTerminal>> {
+    TerminfoTerminal::new(io::stdout())
+        .map(|t| Box::new(t) as Box<StdoutTerminal>)
+        .or_else(|| WinConsole::new(io::stdout()).ok().map(|t| Box::new(t) as Box<StdoutTerminal>))
+}
+
+#[cfg(not(windows))]
+/// Return a Terminal wrapping stderr, or None if a terminal couldn't be
+/// opened.
+pub fn stderr() -> Option<Box<StderrTerminal>> {
+    TerminfoTerminal::new(io::stderr()).map(|t| Box::new(t) as Box<StderrTerminal>)
+}
+
+#[cfg(windows)]
+/// Return a Terminal wrapping stderr, or None if a terminal couldn't be
+/// opened.
+pub fn stderr() -> Option<Box<StderrTerminal>> {
+    TerminfoTerminal::new(io::stderr())
+        .map(|t| Box::new(t) as Box<StderrTerminal>)
+        .or_else(|| WinConsole::new(io::stderr()).ok().map(|t| Box::new(t) as Box<StderrTerminal>))
+}
+
+
+/// Terminal color definitions
+#[allow(missing_docs)]
+pub mod color {
+    /// Number for a terminal color
+    pub type Color = u16;
+
+    pub const BLACK: Color = 0;
+    pub const RED: Color = 1;
+    pub const GREEN: Color = 2;
+    pub const YELLOW: Color = 3;
+    pub const BLUE: Color = 4;
+    pub const MAGENTA: Color = 5;
+    pub const CYAN: Color = 6;
+    pub const WHITE: Color = 7;
+
+    pub const BRIGHT_BLACK: Color = 8;
+    pub const BRIGHT_RED: Color = 9;
+    pub const BRIGHT_GREEN: Color = 10;
+    pub const BRIGHT_YELLOW: Color = 11;
+    pub const BRIGHT_BLUE: Color = 12;
+    pub const BRIGHT_MAGENTA: Color = 13;
+    pub const BRIGHT_CYAN: Color = 14;
+    pub const BRIGHT_WHITE: Color = 15;
+}
+
+/// Terminal attributes for use with term.attr().
+///
+/// Most attributes can only be turned on and must be turned off with term.reset().
+/// The ones that can be turned off explicitly take a boolean value.
+/// Color is also represented as an attribute for convenience.
+#[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)]
+pub enum Attr {
+    /// Bold (or possibly bright) mode
+    Bold,
+    /// Dim mode, also called faint or half-bright. Often not supported
+    Dim,
+    /// Italics mode. Often not supported
+    Italic(bool),
+    /// Underline mode
+    Underline(bool),
+    /// Blink mode
+    Blink,
+    /// Standout mode. Often implemented as Reverse, sometimes coupled with Bold
+    Standout(bool),
+    /// Reverse mode, inverts the foreground and background colors
+    Reverse,
+    /// Secure mode, also called invis mode. Hides the printed text
+    Secure,
+    /// Convenience attribute to set the foreground color
+    ForegroundColor(color::Color),
+    /// Convenience attribute to set the background color
+    BackgroundColor(color::Color),
+}
+
+/// An error arising from interacting with the terminal.
+#[derive(Debug)]
+pub enum Error {
+    /// Indicates an error from any underlying IO
+    Io(io::Error),
+    /// Indicates an error during terminfo parsing
+    TerminfoParsing(terminfo::Error),
+    /// Indicates an error expanding a parameterized string from the terminfo database
+    ParameterizedExpansion(terminfo::parm::Error),
+    /// Indicates that the terminal does not support the requested operation.
+    NotSupported,
+    /// Indicates that the `TERM` environment variable was unset, and thus we were unable to detect
+    /// which terminal we should be using.
+    TermUnset,
+    /// Indicates that we were unable to find a terminfo entry for the requested terminal.
+    TerminfoEntryNotFound,
+    /// Indicates that the cursor could not be moved to the requested position.
+    CursorDestinationInvalid,
+    /// Indicates that the terminal does not support displaying the requested color.
+    ///
+    /// This is like `NotSupported`, but more specific.
+    ColorOutOfRange,
+    #[doc(hidden)]
+    /// Please don't match against this - if you do, we can't promise we won't break your crate
+    /// with a semver-compliant version bump.
+    __Nonexhaustive,
+}
+
+// manually implemented because std::io::Error does not implement Eq/PartialEq
+impl std::cmp::PartialEq for Error {
+    fn eq(&self, other: &Error) -> bool {
+        use Error::*;
+        match *self {
+            Io(_) => false,
+            TerminfoParsing(ref inner1) => {
+                match *other {
+                    TerminfoParsing(ref inner2) => inner1 == inner2,
+                    _ => false,
+                }
+            }
+            ParameterizedExpansion(ref inner1) => {
+                match *other {
+                    ParameterizedExpansion(ref inner2) => inner1 == inner2,
+                    _ => false,
+                }
+            }
+            NotSupported => {
+                match *other {
+                    NotSupported => true,
+                    _ => false,
+                }
+            }
+            TermUnset => {
+                match *other {
+                    TermUnset => true,
+                    _ => false,
+                }
+            }
+            TerminfoEntryNotFound => {
+                match *other {
+                    TerminfoEntryNotFound => true,
+                    _ => false,
+                }
+            }
+            CursorDestinationInvalid => {
+                match *other {
+                    CursorDestinationInvalid => true,
+                    _ => false,
+                }
+            }
+            ColorOutOfRange => {
+                match *other {
+                    ColorOutOfRange => true,
+                    _ => false,
+                }
+            }
+            __Nonexhaustive => {
+                match *other {
+                    __Nonexhaustive => true,
+                    _ => false,
+                }
+            }
+        }
+    }
+}
+
+/// The canonical `Result` type using this crate's Error type.
+pub type Result<T> = std::result::Result<T, Error>;
+
+impl std::fmt::Display for Error {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        use std::error::Error;
+        if let ::Error::Io(ref e) = *self {
+            write!(f, "{}", e)
+        } else {
+            f.write_str(self.description())
+        }
+    }
+}
+
+impl std::error::Error for Error {
+    fn description(&self) -> &str {
+        use Error::*;
+        match *self {
+            Io(ref io) => io.description(),
+            TerminfoParsing(ref e) => e.description(),
+            ParameterizedExpansion(ref e) => e.description(),
+            NotSupported => "operation not supported by the terminal",
+            TermUnset => "TERM environment variable unset, unable to detect a terminal",
+            TerminfoEntryNotFound => "could not find a terminfo entry for this terminal",
+            CursorDestinationInvalid => "could not move cursor to requested position",
+            ColorOutOfRange => "color not supported by the terminal",
+            __Nonexhaustive => "placeholder variant that shouldn't be used",
+        }
+    }
+
+    fn cause(&self) -> Option<&std::error::Error> {
+        match *self {
+            Error::Io(ref io) => Some(io),
+            Error::TerminfoParsing(ref e) => Some(e),
+            Error::ParameterizedExpansion(ref e) => Some(e),
+            _ => None,
+        }
+    }
+}
+
+impl From<Error> for io::Error {
+    fn from(err: Error) -> io::Error {
+        let kind = match err {
+            Error::Io(ref e) => e.kind(),
+            _ => io::ErrorKind::Other,
+        };
+        io::Error::new(kind, err)
+    }
+}
+
+impl std::convert::From<io::Error> for Error {
+    fn from(val: io::Error) -> Self {
+        Error::Io(val)
+    }
+}
+
+impl std::convert::From<terminfo::Error> for Error {
+    fn from(val: terminfo::Error) -> Self {
+        Error::TerminfoParsing(val)
+    }
+}
+
+impl std::convert::From<terminfo::parm::Error> for Error {
+    fn from(val: terminfo::parm::Error) -> Self {
+        Error::ParameterizedExpansion(val)
+    }
+}
+
+/// A terminal with similar capabilities to an ANSI Terminal
+/// (foreground/background colors etc).
+pub trait Terminal: Write {
+    /// The terminal's output writer type.
+    type Output: Write;
+
+    /// Sets the foreground color to the given color.
+    ///
+    /// If the color is a bright color, but the terminal only supports 8 colors,
+    /// the corresponding normal color will be used instead.
+    ///
+    /// Returns `Ok(())` if the color change code was sent to the terminal, or `Err(e)` if there
+    /// was an error.
+    fn fg(&mut self, color: color::Color) -> Result<()>;
+
+    /// Sets the background color to the given color.
+    ///
+    /// If the color is a bright color, but the terminal only supports 8 colors,
+    /// the corresponding normal color will be used instead.
+    ///
+    /// Returns `Ok(())` if the color change code was sent to the terminal, or `Err(e)` if there
+    /// was an error.
+    fn bg(&mut self, color: color::Color) -> Result<()>;
+
+    /// Sets the given terminal attribute, if supported.  Returns `Ok(())` if the attribute is
+    /// supported and was sent to the terminal, or `Err(e)` if there was an error or the attribute
+    /// wasn't supported.
+    fn attr(&mut self, attr: Attr) -> Result<()>;
+
+    /// Returns whether the given terminal attribute is supported.
+    fn supports_attr(&self, attr: Attr) -> bool;
+
+    /// Resets all terminal attributes and colors to their defaults.
+    ///
+    /// Returns `Ok(())` if the reset code was printed, or `Err(e)` if there was an error.
+    ///
+    /// *Note: This does not flush.*
+    ///
+    /// That means the reset command may get buffered so, if you aren't planning on doing anything
+    /// else that might flush stdout's buffer (e.g. writing a line of text), you should flush after
+    /// calling reset.
+    fn reset(&mut self) -> Result<()>;
+
+    /// Returns true if reset is supported.
+    fn supports_reset(&self) -> bool;
+
+    /// Returns true if color is fully supported.
+    ///
+    /// If this function returns `true`, `bg`, `fg`, and `reset` will never
+    /// return `Err(Error::NotSupported)`.
+    fn supports_color(&self) -> bool;
+
+    /// Moves the cursor up one line.
+    ///
+    /// Returns `Ok(())` if the cursor movement code was printed, or `Err(e)` if there was an
+    /// error.
+    fn cursor_up(&mut self) -> Result<()>;
+
+    /// Deletes the text from the cursor location to the end of the line.
+    ///
+    /// Returns `Ok(())` if the deletion code was printed, or `Err(e)` if there was an error.
+    fn delete_line(&mut self) -> Result<()>;
+
+    /// Moves the cursor to the left edge of the current line.
+    ///
+    /// Returns `Ok(true)` if the deletion code was printed, or `Err(e)` if there was an error.
+    fn carriage_return(&mut self) -> Result<()>;
+
+    /// Gets an immutable reference to the stream inside
+    fn get_ref(&self) -> &Self::Output;
+
+    /// Gets a mutable reference to the stream inside
+    fn get_mut(&mut self) -> &mut Self::Output;
+
+    /// Returns the contained stream, destroying the `Terminal`
+    fn into_inner(self) -> Self::Output where Self: Sized;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/terminfo/mod.rs
@@ -0,0 +1,403 @@
+// Copyright 2012-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Terminfo database interface.
+
+use std::collections::HashMap;
+use std::env;
+use std::fs::File;
+use std::io::prelude::*;
+use std::io;
+use std::io::BufReader;
+use std::path::Path;
+
+use Attr;
+use color;
+use Terminal;
+use Result;
+use self::searcher::get_dbpath_for_term;
+use self::parser::compiled::parse;
+use self::parm::{expand, Variables, Param};
+use self::Error::*;
+
+
+/// Returns true if the named terminal supports basic ANSI escape codes.
+fn is_ansi(name: &str) -> bool {
+    // SORTED! We binary search this.
+    static ANSI_TERM_PREFIX: &'static [&'static str] = &[
+        "Eterm",
+        "ansi",
+        "eterm",
+        "iterm",
+        "konsole",
+        "linux",
+        "mrxvt",
+        "msyscon",
+        "rxvt",
+        "screen",
+        "tmux",
+        "xterm",
+    ];
+    match ANSI_TERM_PREFIX.binary_search(&name) {
+        Ok(_) => true,
+        Err(0) => false,
+        Err(idx) => name.starts_with(ANSI_TERM_PREFIX[idx - 1]),
+    }
+}
+
+
+/// A parsed terminfo database entry.
+#[derive(Debug, Clone)]
+pub struct TermInfo {
+    /// Names for the terminal
+    pub names: Vec<String>,
+    /// Map of capability name to boolean value
+    pub bools: HashMap<&'static str, bool>,
+    /// Map of capability name to numeric value
+    pub numbers: HashMap<&'static str, u16>,
+    /// Map of capability name to raw (unexpanded) string
+    pub strings: HashMap<&'static str, Vec<u8>>,
+}
+
+impl TermInfo {
+    /// Create a `TermInfo` based on current environment.
+    pub fn from_env() -> Result<TermInfo> {
+        let term_var = env::var("TERM").ok();
+        let term_name = term_var
+            .as_ref()
+            .map(|s| &**s)
+            .or_else(|| env::var("MSYSCON")
+                     .ok()
+                     .and_then(|s| if s == "mintty.exe" {
+                         Some("msyscon")
+                     } else {
+                         None
+                     }));
+        if let Some(term_name) = term_name {
+            return TermInfo::from_name(term_name);
+        } else {
+            return Err(::Error::TermUnset);
+        }
+    }
+
+    /// Create a `TermInfo` for the named terminal.
+    pub fn from_name(name: &str) -> Result<TermInfo> {
+        if let Some(path) = get_dbpath_for_term(name) {
+            match TermInfo::from_path(&path) {
+                Ok(term) => return Ok(term),
+                // Skip IO Errors (e.g., permission denied).
+                Err(::Error::Io(_)) => {},
+                // Don't ignore malformed terminfo databases.
+                Err(e) => return Err(e),
+            }
+        }
+        // Basic ANSI fallback terminal.
+        if is_ansi(name) {
+            let mut strings = HashMap::new();
+            strings.insert("sgr0", b"\x1B[0m".to_vec());
+            strings.insert("bold", b"\x1B[1m".to_vec());
+            strings.insert("setaf", b"\x1B[3%p1%dm".to_vec());
+            strings.insert("setab", b"\x1B[4%p1%dm".to_vec());
+
+            let mut numbers = HashMap::new();
+            numbers.insert("colors", 8u16);
+
+            Ok(TermInfo {
+                names: vec![name.to_owned()],
+                bools: HashMap::new(),
+                numbers: numbers,
+                strings: strings,
+            })
+        } else {
+            Err(::Error::TerminfoEntryNotFound)
+        }
+    }
+
+    /// Parse the given `TermInfo`.
+    pub fn from_path<P: AsRef<Path>>(path: P) -> Result<TermInfo> {
+        Self::_from_path(path.as_ref())
+    }
+    // Keep the metadata small
+    // (That is, this uses a &Path so that this function need not be instantiated
+    // for every type
+    // which implements AsRef<Path>. One day, if/when rustc is a bit smarter, it
+    // might do this for
+    // us. Alas. )
+    fn _from_path(path: &Path) -> Result<TermInfo> {
+        let file = try!(File::open(path).map_err(::Error::Io));
+        let mut reader = BufReader::new(file);
+        parse(&mut reader, false)
+    }
+
+    /// Retrieve a capability `cmd` and expand it with `params`, writing result to `out`.
+    pub fn apply_cap(&self, cmd: &str, params: &[Param], out: &mut io::Write) -> Result<()> {
+        match self.strings.get(cmd) {
+            Some(cmd) => {
+                match expand(cmd, params, &mut Variables::new()) {
+                    Ok(s) => {
+                        try!(out.write_all(&s));
+                        Ok(())
+                    }
+                    Err(e) => Err(e.into()),
+                }
+            }
+            None => Err(::Error::NotSupported),
+        }
+    }
+
+    /// Write the reset string to `out`.
+    pub fn reset(&self, out: &mut io::Write) -> Result<()> {
+        // are there any terminals that have color/attrs and not sgr0?
+        // Try falling back to sgr, then op
+        let cmd = match [("sgr0", &[] as &[Param]), ("sgr", &[Param::Number(0)]), ("op", &[])]
+                            .iter()
+                            .filter_map(|&(cap, params)| {
+                                self.strings.get(cap).map(|c| (c, params))
+                            })
+                            .next() {
+            Some((op, params)) => {
+                match expand(op, params, &mut Variables::new()) {
+                    Ok(cmd) => cmd,
+                    Err(e) => return Err(e.into()),
+                }
+            }
+            None => return Err(::Error::NotSupported),
+        };
+        try!(out.write_all(&cmd));
+        Ok(())
+    }
+
+}
+
+#[derive(Debug, Eq, PartialEq)]
+/// An error from parsing a terminfo entry
+pub enum Error {
+    /// The "magic" number at the start of the file was wrong.
+    ///
+    /// It should be `0x11A`
+    BadMagic(u16),
+    /// The names in the file were not valid UTF-8.
+    ///
+    /// In theory these should only be ASCII, but to work with the Rust `str` type, we treat them
+    /// as UTF-8. This is valid, except when a terminfo file decides to be invalid. This hasn't
+    /// been encountered in the wild.
+    NotUtf8(::std::str::Utf8Error),
+    /// The names section of the file was empty
+    ShortNames,
+    /// More boolean parameters are present in the file than this crate knows how to interpret.
+    TooManyBools,
+    /// More number parameters are present in the file than this crate knows how to interpret.
+    TooManyNumbers,
+    /// More string parameters are present in the file than this crate knows how to interpret.
+    TooManyStrings,
+    /// The length of some field was not >= -1.
+    InvalidLength,
+    /// The names table was missing a trailing null terminator.
+    NamesMissingNull,
+    /// The strings table was missing a trailing null terminator.
+    StringsMissingNull,
+}
+
+impl ::std::fmt::Display for Error {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        use std::error::Error;
+        match *self {
+            NotUtf8(e) => write!(f, "{}", e),
+            BadMagic(v) => write!(f, "bad magic number {:x} in terminfo header", v),
+            _ => f.write_str(self.description()),
+        }
+    }
+}
+
+impl ::std::convert::From<::std::string::FromUtf8Error> for Error {
+    fn from(v: ::std::string::FromUtf8Error) -> Self {
+        NotUtf8(v.utf8_error())
+    }
+}
+
+impl ::std::error::Error for Error {
+    fn description(&self) -> &str {
+        match *self {
+            BadMagic(..) => "incorrect magic number at start of file",
+            ShortNames => "no names exposed, need at least one",
+            TooManyBools => "more boolean properties than libterm knows about",
+            TooManyNumbers => "more number properties than libterm knows about",
+            TooManyStrings => "more string properties than libterm knows about",
+            InvalidLength => "invalid length field value, must be >= -1",
+            NotUtf8(ref e) => e.description(),
+            NamesMissingNull => "names table missing NUL terminator",
+            StringsMissingNull => "string table missing NUL terminator",
+        }
+    }
+
+    fn cause(&self) -> Option<&::std::error::Error> {
+        match *self {
+            NotUtf8(ref e) => Some(e),
+            _ => None,
+        }
+    }
+}
+
+pub mod searcher;
+
+/// `TermInfo` format parsing.
+pub mod parser {
+    //! ncurses-compatible compiled terminfo format parsing (term(5))
+    pub mod compiled;
+    mod names;
+}
+pub mod parm;
+
+
+fn cap_for_attr(attr: Attr) -> &'static str {
+    match attr {
+        Attr::Bold => "bold",
+        Attr::Dim => "dim",
+        Attr::Italic(true) => "sitm",
+        Attr::Italic(false) => "ritm",
+        Attr::Underline(true) => "smul",
+        Attr::Underline(false) => "rmul",
+        Attr::Blink => "blink",
+        Attr::Standout(true) => "smso",
+        Attr::Standout(false) => "rmso",
+        Attr::Reverse => "rev",
+        Attr::Secure => "invis",
+        Attr::ForegroundColor(_) => "setaf",
+        Attr::BackgroundColor(_) => "setab",
+    }
+}
+
+/// A Terminal that knows how many colors it supports, with a reference to its
+/// parsed Terminfo database record.
+#[derive(Clone, Debug)]
+pub struct TerminfoTerminal<T> {
+    num_colors: u16,
+    out: T,
+    ti: TermInfo,
+}
+
+impl<T: Write> Terminal for TerminfoTerminal<T> {
+    type Output = T;
+    fn fg(&mut self, color: color::Color) -> Result<()> {
+        let color = self.dim_if_necessary(color);
+        if self.num_colors > color {
+            return self.ti.apply_cap("setaf", &[Param::Number(color as i32)], &mut self.out);
+        }
+        Err(::Error::ColorOutOfRange)
+    }
+
+    fn bg(&mut self, color: color::Color) -> Result<()> {
+        let color = self.dim_if_necessary(color);
+        if self.num_colors > color {
+            return self.ti.apply_cap("setab", &[Param::Number(color as i32)], &mut self.out);
+        }
+        Err(::Error::ColorOutOfRange)
+    }
+
+    fn attr(&mut self, attr: Attr) -> Result<()> {
+        match attr {
+            Attr::ForegroundColor(c) => self.fg(c),
+            Attr::BackgroundColor(c) => self.bg(c),
+            _ => self.ti.apply_cap(cap_for_attr(attr), &[], &mut self.out),
+        }
+    }
+
+    fn supports_attr(&self, attr: Attr) -> bool {
+        match attr {
+            Attr::ForegroundColor(_) | Attr::BackgroundColor(_) => self.num_colors > 0,
+            _ => {
+                let cap = cap_for_attr(attr);
+                self.ti.strings.get(cap).is_some()
+            }
+        }
+    }
+
+    fn reset(&mut self) -> Result<()> {
+        self.ti.reset(&mut self.out)
+    }
+
+    fn supports_reset(&self) -> bool {
+        ["sgr0", "sgr", "op"].iter().any(|&cap| self.ti.strings.get(cap).is_some())
+    }
+
+    fn supports_color(&self) -> bool {
+        self.num_colors > 0 && self.supports_reset()
+    }
+
+    fn cursor_up(&mut self) -> Result<()> {
+        self.ti.apply_cap("cuu1", &[], &mut self.out)
+    }
+
+    fn delete_line(&mut self) -> Result<()> {
+        self.ti.apply_cap("el", &[], &mut self.out)
+    }
+
+    fn carriage_return(&mut self) -> Result<()> {
+        self.ti.apply_cap("cr", &[], &mut self.out)
+    }
+
+    fn get_ref(&self) -> &T {
+        &self.out
+    }
+
+    fn get_mut(&mut self) -> &mut T {
+        &mut self.out
+    }
+
+    fn into_inner(self) -> T
+        where Self: Sized
+    {
+        self.out
+    }
+}
+
+impl<T: Write> TerminfoTerminal<T> {
+    /// Create a new TerminfoTerminal with the given TermInfo and Write.
+    pub fn new_with_terminfo(out: T, terminfo: TermInfo) -> TerminfoTerminal<T> {
+        let nc = if terminfo.strings.contains_key("setaf") &&
+                    terminfo.strings.contains_key("setab") {
+            terminfo.numbers.get("colors").map_or(0, |&n| n)
+        } else {
+            0
+        };
+
+        TerminfoTerminal {
+            out: out,
+            ti: terminfo,
+            num_colors: nc,
+        }
+    }
+
+    /// Create a new TerminfoTerminal for the current environment with the given Write.
+    ///
+    /// Returns `None` when the terminfo cannot be found or parsed.
+    pub fn new(out: T) -> Option<TerminfoTerminal<T>> {
+        TermInfo::from_env().map(move |ti| TerminfoTerminal::new_with_terminfo(out, ti)).ok()
+    }
+
+    fn dim_if_necessary(&self, color: color::Color) -> color::Color {
+        if color >= self.num_colors && color >= 8 && color < 16 {
+            color - 8
+        } else {
+            color
+        }
+    }
+}
+
+
+impl<T: Write> Write for TerminfoTerminal<T> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.out.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.out.flush()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/terminfo/parm.rs
@@ -0,0 +1,698 @@
+// Copyright 2012 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Parameterized string expansion
+
+use self::Param::*;
+use self::States::*;
+
+use std::iter::repeat;
+
+#[derive(Clone, Copy, PartialEq)]
+enum States {
+    Nothing,
+    Percent,
+    SetVar,
+    GetVar,
+    PushParam,
+    CharConstant,
+    CharClose,
+    IntConstant(i32),
+    FormatPattern(Flags, FormatState),
+    SeekIfElse(usize),
+    SeekIfElsePercent(usize),
+    SeekIfEnd(usize),
+    SeekIfEndPercent(usize),
+}
+
+#[derive(Copy, PartialEq, Clone)]
+enum FormatState {
+    Flags,
+    Width,
+    Precision,
+}
+
+/// Types of parameters a capability can use
+#[allow(missing_docs)]
+#[derive(Clone)]
+pub enum Param {
+    Number(i32),
+    Words(String),
+}
+
+impl Default for Param {
+    fn default() -> Self {
+        Param::Number(0)
+    }
+}
+
+/// An error from interpreting a parameterized string.
+#[derive(Debug, Eq, PartialEq)]
+pub enum Error {
+    /// Data was requested from the stack, but the stack didn't have enough elements.
+    StackUnderflow,
+    /// The type of the element(s) on top of the stack did not match the type that the operator
+    /// wanted.
+    TypeMismatch,
+    /// An unrecognized format option was used.
+    UnrecognizedFormatOption(char),
+    /// An invalid variable name was used.
+    InvalidVariableName(char),
+    /// An invalid parameter index was used.
+    InvalidParameterIndex(char),
+    /// A malformed character constant was used.
+    MalformedCharacterConstant,
+    /// An integer constant was too large (overflowed an i32)
+    IntegerConstantOverflow,
+    /// A malformed integer constant was used.
+    MalformedIntegerConstant,
+    /// A format width constant was too large (overflowed a usize)
+    FormatWidthOverflow,
+    /// A format precision constant was too large (overflowed a usize)
+    FormatPrecisionOverflow,
+}
+
+impl ::std::fmt::Display for Error {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+        use std::error::Error;
+        f.write_str(self.description())
+    }
+}
+
+impl ::std::error::Error for Error {
+    fn description(&self) -> &str {
+        use self::Error::*;
+        match *self {
+            StackUnderflow => "not enough elements on the stack",
+            TypeMismatch => "type mismatch",
+            UnrecognizedFormatOption(_) => "unrecognized format option",
+            InvalidVariableName(_) => "invalid variable name",
+            InvalidParameterIndex(_) => "invalid parameter index",
+            MalformedCharacterConstant => "malformed character constant",
+            IntegerConstantOverflow => "integer constant computation overflowed",
+            MalformedIntegerConstant => "malformed integer constant",
+            FormatWidthOverflow => "format width constant computation overflowed",
+            FormatPrecisionOverflow => "format precision constant computation overflowed",
+        }
+    }
+
+    fn cause(&self) -> Option<&::std::error::Error> {
+        None
+    }
+}
+
+/// Container for static and dynamic variable arrays
+#[derive(Default)]
+pub struct Variables {
+    /// Static variables A-Z
+    sta: [Param; 26],
+    /// Dynamic variables a-z
+    dyn: [Param; 26],
+}
+
+impl Variables {
+    /// Return a new zero-initialized Variables
+    pub fn new() -> Variables {
+        Default::default()
+    }
+}
+
+/// Expand a parameterized capability
+///
+/// # Arguments
+/// * `cap`    - string to expand
+/// * `params` - vector of params for %p1 etc
+/// * `vars`   - Variables struct for %Pa etc
+///
+/// To be compatible with ncurses, `vars` should be the same between calls to `expand` for
+/// multiple capabilities for the same terminal.
+pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables) -> Result<Vec<u8>, Error> {
+    let mut state = Nothing;
+
+    // expanded cap will only rarely be larger than the cap itself
+    let mut output = Vec::with_capacity(cap.len());
+
+    let mut stack: Vec<Param> = Vec::new();
+
+    // Copy parameters into a local vector for mutability
+    let mut mparams = [Number(0), Number(0), Number(0), Number(0), Number(0), Number(0),
+                       Number(0), Number(0), Number(0)];
+    for (dst, src) in mparams.iter_mut().zip(params.iter()) {
+        *dst = (*src).clone();
+    }
+
+    for &c in cap.iter() {
+        let cur = c as char;
+        let mut old_state = state;
+        match state {
+            Nothing => {
+                if cur == '%' {
+                    state = Percent;
+                } else {
+                    output.push(c);
+                }
+            }
+            Percent => {
+                match cur {
+                    '%' => {
+                        output.push(c);
+                        state = Nothing
+                    }
+                    'c' => {
+                        match stack.pop() {
+                            // if c is 0, use 0200 (128) for ncurses compatibility
+                            Some(Number(0)) => output.push(128u8),
+                            // Don't check bounds. ncurses just casts and truncates.
+                            Some(Number(c)) => output.push(c as u8),
+                            Some(_) => return Err(Error::TypeMismatch),
+                            None => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    'p' => state = PushParam,
+                    'P' => state = SetVar,
+                    'g' => state = GetVar,
+                    '\'' => state = CharConstant,
+                    '{' => state = IntConstant(0),
+                    'l' => {
+                        match stack.pop() {
+                            Some(Words(s)) => stack.push(Number(s.len() as i32)),
+                            Some(_) => return Err(Error::TypeMismatch),
+                            None => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    '+' | '-' | '/' | '*' | '^' | '&' | '|' | 'm' => {
+                        match (stack.pop(), stack.pop()) {
+                            (Some(Number(y)), Some(Number(x))) => {
+                                stack.push(Number(match cur {
+                                    '+' => x + y,
+                                    '-' => x - y,
+                                    '*' => x * y,
+                                    '/' => x / y,
+                                    '|' => x | y,
+                                    '&' => x & y,
+                                    '^' => x ^ y,
+                                    'm' => x % y,
+                                    _ => unreachable!("logic error"),
+                                }))
+                            }
+                            (Some(_), Some(_)) => return Err(Error::TypeMismatch),
+                            _ => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    '=' | '>' | '<' | 'A' | 'O' => {
+                        match (stack.pop(), stack.pop()) {
+                            (Some(Number(y)), Some(Number(x))) => {
+                                stack.push(Number(if match cur {
+                                    '=' => x == y,
+                                    '<' => x < y,
+                                    '>' => x > y,
+                                    'A' => x > 0 && y > 0,
+                                    'O' => x > 0 || y > 0,
+                                    _ => unreachable!("logic error"),
+                                } {
+                                    1
+                                } else {
+                                    0
+                                }))
+                            }
+                            (Some(_), Some(_)) => return Err(Error::TypeMismatch),
+                            _ => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    '!' | '~' => {
+                        match stack.pop() {
+                            Some(Number(x)) => {
+                                stack.push(Number(match cur {
+                                    '!' if x > 0 => 0,
+                                    '!' => 1,
+                                    '~' => !x,
+                                    _ => unreachable!("logic error"),
+                                }))
+                            }
+                            Some(_) => return Err(Error::TypeMismatch),
+                            None => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    'i' => {
+                        match (&mparams[0], &mparams[1]) {
+                            (&Number(x), &Number(y)) => {
+                                mparams[0] = Number(x + 1);
+                                mparams[1] = Number(y + 1);
+                            }
+                            (_, _) => return Err(Error::TypeMismatch),
+                        }
+                    }
+
+                    // printf-style support for %doxXs
+                    'd' | 'o' | 'x' | 'X' | 's' => {
+                        if let Some(arg) = stack.pop() {
+                            let flags = Flags::default();
+                            let res = try!(format(arg, FormatOp::from_char(cur), flags));
+                            output.extend(res);
+                        } else {
+                            return Err(Error::StackUnderflow);
+                        }
+                    }
+                    ':' | '#' | ' ' | '.' | '0'...'9' => {
+                        let mut flags = Flags::default();
+                        let mut fstate = FormatState::Flags;
+                        match cur {
+                            ':' => (),
+                            '#' => flags.alternate = true,
+                            ' ' => flags.space = true,
+                            '.' => fstate = FormatState::Precision,
+                            '0'...'9' => {
+                                flags.width = cur as usize - '0' as usize;
+                                fstate = FormatState::Width;
+                            }
+                            _ => unreachable!("logic error"),
+                        }
+                        state = FormatPattern(flags, fstate);
+                    }
+
+                    // conditionals
+                    '?'|';' => (),
+                    't' => {
+                        match stack.pop() {
+                            Some(Number(0)) => state = SeekIfElse(0),
+                            Some(Number(_)) => (),
+                            Some(_) => return Err(Error::TypeMismatch),
+                            None => return Err(Error::StackUnderflow),
+                        }
+                    }
+                    'e' => state = SeekIfEnd(0),
+                    c => return Err(Error::UnrecognizedFormatOption(c)),
+                }
+            }
+            PushParam => {
+                // params are 1-indexed
+                stack.push(mparams[match cur.to_digit(10) {
+                               Some(d) => d as usize - 1,
+                               None => return Err(Error::InvalidParameterIndex(cur)),
+                           }]
+                           .clone());
+            }
+            SetVar => {
+                if cur >= 'A' && cur <= 'Z' {
+                    if let Some(arg) = stack.pop() {
+                        let idx = (cur as u8) - b'A';
+                        vars.sta[idx as usize] = arg;
+                    } else {
+                        return Err(Error::StackUnderflow);
+                    }
+                } else if cur >= 'a' && cur <= 'z' {
+                    if let Some(arg) = stack.pop() {
+                        let idx = (cur as u8) - b'a';
+                        vars.dyn[idx as usize] = arg;
+                    } else {
+                        return Err(Error::StackUnderflow);
+                    }
+                } else {
+                    return Err(Error::InvalidVariableName(cur));
+                }
+            }
+            GetVar => {
+                if cur >= 'A' && cur <= 'Z' {
+                    let idx = (cur as u8) - b'A';
+                    stack.push(vars.sta[idx as usize].clone());
+                } else if cur >= 'a' && cur <= 'z' {
+                    let idx = (cur as u8) - b'a';
+                    stack.push(vars.dyn[idx as usize].clone());
+                } else {
+                    return Err(Error::InvalidVariableName(cur));
+                }
+            }
+            CharConstant => {
+                stack.push(Number(c as i32));
+                state = CharClose;
+            }
+            CharClose => {
+                if cur != '\'' {
+                    return Err(Error::MalformedCharacterConstant);
+                }
+            }
+            IntConstant(i) => {
+                if cur == '}' {
+                    stack.push(Number(i));
+                    state = Nothing;
+                } else if let Some(digit) = cur.to_digit(10) {
+                    match i.checked_mul(10).and_then(|i_ten| i_ten.checked_add(digit as i32)) {
+                        Some(i) => {
+                            state = IntConstant(i);
+                            old_state = Nothing;
+                        }
+                        None => return Err(Error::IntegerConstantOverflow),
+                    }
+                } else {
+                    return Err(Error::MalformedIntegerConstant);
+                }
+            }
+            FormatPattern(ref mut flags, ref mut fstate) => {
+                old_state = Nothing;
+                match (*fstate, cur) {
+                    (_, 'd') | (_, 'o') | (_, 'x') | (_, 'X') | (_, 's') => {
+                        if let Some(arg) = stack.pop() {
+                            let res = try!(format(arg, FormatOp::from_char(cur), *flags));
+                            output.extend(res);
+                            // will cause state to go to Nothing
+                            old_state = FormatPattern(*flags, *fstate);
+                        } else {
+                            return Err(Error::StackUnderflow);
+                        }
+                    }
+                    (FormatState::Flags, '#') => {
+                        flags.alternate = true;
+                    }
+                    (FormatState::Flags, '-') => {
+                        flags.left = true;
+                    }
+                    (FormatState::Flags, '+') => {
+                        flags.sign = true;
+                    }
+                    (FormatState::Flags, ' ') => {
+                        flags.space = true;
+                    }
+                    (FormatState::Flags, '0'...'9') => {
+                        flags.width = cur as usize - '0' as usize;
+                        *fstate = FormatState::Width;
+                    }
+                    (FormatState::Width, '0'...'9') => {
+                        flags.width = match flags.width.checked_mul(10).and_then(|w| {
+                            w.checked_add(cur as usize - '0' as usize)
+                        }) {
+                            Some(width) => width,
+                            None => return Err(Error::FormatWidthOverflow),
+                        }
+                    }
+                    (FormatState::Width, '.')|(FormatState::Flags, '.') => {
+                        *fstate = FormatState::Precision;
+                    }
+                    (FormatState::Precision, '0'...'9') => {
+                        flags.precision = match flags.precision.checked_mul(10).and_then(|w| {
+                            w.checked_add(cur as usize - '0' as usize)
+                        }) {
+                            Some(precision) => precision,
+                            None => return Err(Error::FormatPrecisionOverflow),
+                        }
+                    }
+                    _ => return Err(Error::UnrecognizedFormatOption(cur)),
+                }
+            }
+            SeekIfElse(level) => {
+                if cur == '%' {
+                    state = SeekIfElsePercent(level);
+                }
+                old_state = Nothing;
+            }
+            SeekIfElsePercent(level) => {
+                if cur == ';' {
+                    if level == 0 {
+                        state = Nothing;
+                    } else {
+                        state = SeekIfElse(level - 1);
+                    }
+                } else if cur == 'e' && level == 0 {
+                    state = Nothing;
+                } else if cur == '?' {
+                    state = SeekIfElse(level + 1);
+                } else {
+                    state = SeekIfElse(level);
+                }
+            }
+            SeekIfEnd(level) => {
+                if cur == '%' {
+                    state = SeekIfEndPercent(level);
+                }
+                old_state = Nothing;
+            }
+            SeekIfEndPercent(level) => {
+                if cur == ';' {
+                    if level == 0 {
+                        state = Nothing;
+                    } else {
+                        state = SeekIfEnd(level - 1);
+                    }
+                } else if cur == '?' {
+                    state = SeekIfEnd(level + 1);
+                } else {
+                    state = SeekIfEnd(level);
+                }
+            }
+        }
+        if state == old_state {
+            state = Nothing;
+        }
+    }
+    Ok(output)
+}
+
+#[derive(Copy, PartialEq, Clone, Default)]
+struct Flags {
+    width: usize,
+    precision: usize,
+    alternate: bool,
+    left: bool,
+    sign: bool,
+    space: bool,
+}
+
+#[derive(Copy, Clone)]
+enum FormatOp {
+    Digit,
+    Octal,
+    Hex,
+    HEX,
+    String,
+}
+
+impl FormatOp {
+    fn from_char(c: char) -> FormatOp {
+        use self::FormatOp::*;
+        match c {
+            'd' => Digit,
+            'o' => Octal,
+            'x' => Hex,
+            'X' => HEX,
+            's' => String,
+            _ => panic!("bad FormatOp char"),
+        }
+    }
+}
+
+fn format(val: Param, op: FormatOp, flags: Flags) -> Result<Vec<u8>, Error> {
+    use self::FormatOp::*;
+    let mut s = match val {
+        Number(d) => {
+            match op {
+                Digit => {
+                    if flags.sign {
+                        format!("{:+01$}", d, flags.precision)
+                    } else if d < 0 {
+                        // C doesn't take sign into account in precision calculation.
+                        format!("{:01$}", d, flags.precision + 1)
+                    } else if flags.space {
+                        format!(" {:01$}", d, flags.precision)
+                    } else {
+                        format!("{:01$}", d, flags.precision)
+                    }
+                }
+                Octal => {
+                    if flags.alternate {
+                        // Leading octal zero counts against precision.
+                        format!("0{:01$o}", d, flags.precision.saturating_sub(1))
+                    } else {
+                        format!("{:01$o}", d, flags.precision)
+                    }
+                }
+                Hex => {
+                    if flags.alternate && d != 0 {
+                        format!("0x{:01$x}", d, flags.precision)
+                    } else {
+                        format!("{:01$x}", d, flags.precision)
+                    }
+                }
+                HEX => {
+                    if flags.alternate && d != 0 {
+                        format!("0X{:01$X}", d, flags.precision)
+                    } else {
+                        format!("{:01$X}", d, flags.precision)
+                    }
+                }
+                String => return Err(Error::TypeMismatch),
+            }
+            .into_bytes()
+        }
+        Words(s) => {
+            match op {
+                String => {
+                    let mut s = s.into_bytes();
+                    if flags.precision > 0 && flags.precision < s.len() {
+                        s.truncate(flags.precision);
+                    }
+                    s
+                }
+                _ => return Err(Error::TypeMismatch),
+            }
+        }
+    };
+    if flags.width > s.len() {
+        let n = flags.width - s.len();
+        if flags.left {
+            s.extend(repeat(b' ').take(n));
+        } else {
+            let mut s_ = Vec::with_capacity(flags.width);
+            s_.extend(repeat(b' ').take(n));
+            s_.extend(s.into_iter());
+            s = s_;
+        }
+    }
+    Ok(s)
+}
+
+#[cfg(test)]
+mod test {
+    use super::{expand, Variables};
+    use super::Param::{self, Words, Number};
+    use std::result::Result::Ok;
+
+    #[test]
+    fn test_basic_setabf() {
+        let s = b"\\E[48;5;%p1%dm";
+        assert_eq!(expand(s, &[Number(1)], &mut Variables::new()).unwrap(),
+                   "\\E[48;5;1m".bytes().collect::<Vec<_>>());
+    }
+
+    #[test]
+    fn test_multiple_int_constants() {
+        assert_eq!(expand(b"%{1}%{2}%d%d", &[], &mut Variables::new()).unwrap(),
+                   "21".bytes().collect::<Vec<_>>());
+    }
+
+    #[test]
+    fn test_op_i() {
+        let mut vars = Variables::new();
+        assert_eq!(expand(b"%p1%d%p2%d%p3%d%i%p1%d%p2%d%p3%d",
+                          &[Number(1), Number(2), Number(3)],
+                          &mut vars),
+                   Ok("123233".bytes().collect::<Vec<_>>()));
+        assert_eq!(expand(b"%p1%d%p2%d%i%p1%d%p2%d", &[], &mut vars),
+                   Ok("0011".bytes().collect::<Vec<_>>()));
+    }
+
+    #[test]
+    fn test_param_stack_failure_conditions() {
+        let mut varstruct = Variables::new();
+        let vars = &mut varstruct;
+        fn get_res(fmt: &str,
+                   cap: &str,
+                   params: &[Param],
+                   vars: &mut Variables)
+                   -> Result<Vec<u8>, super::Error> {
+            let mut u8v: Vec<_> = fmt.bytes().collect();
+            u8v.extend(cap.as_bytes().iter().cloned());
+            expand(&u8v, params, vars)
+        }
+
+        let caps = ["%d", "%c", "%s", "%Pa", "%l", "%!", "%~"];
+        for &cap in &caps {
+            let res = get_res("", cap, &[], vars);
+            assert!(res.is_err(),
+                    "Op {} succeeded incorrectly with 0 stack entries",
+                    cap);
+            let p = if cap == "%s" || cap == "%l" {
+                Words("foo".to_owned())
+            } else {
+                Number(97)
+            };
+            let res = get_res("%p1", cap, &[p], vars);
+            assert!(res.is_ok(),
+                    "Op {} failed with 1 stack entry: {}",
+                    cap,
+                    res.err().unwrap());
+        }
+        let caps = ["%+", "%-", "%*", "%/", "%m", "%&", "%|", "%A", "%O"];
+        for &cap in &caps {
+            let res = expand(cap.as_bytes(), &[], vars);
+            assert!(res.is_err(),
+                    "Binop {} succeeded incorrectly with 0 stack entries",
+                    cap);
+            let res = get_res("%{1}", cap, &[], vars);
+            assert!(res.is_err(),
+                    "Binop {} succeeded incorrectly with 1 stack entry",
+                    cap);
+            let res = get_res("%{1}%{2}", cap, &[], vars);
+            assert!(res.is_ok(),
+                    "Binop {} failed with 2 stack entries: {}",
+                    cap,
+                    res.err().unwrap());
+        }
+    }
+
+    #[test]
+    fn test_push_bad_param() {
+        assert!(expand(b"%pa", &[], &mut Variables::new()).is_err());
+    }
+
+    #[test]
+    fn test_comparison_ops() {
+        let v = [('<', [1u8, 0u8, 0u8]), ('=', [0u8, 1u8, 0u8]), ('>', [0u8, 0u8, 1u8])];
+        for &(op, bs) in &v {
+            let s = format!("%{{1}}%{{2}}%{}%d", op);
+            let res = expand(s.as_bytes(), &[], &mut Variables::new());
+            assert!(res.is_ok(), res.err().unwrap());
+            assert_eq!(res.unwrap(), vec![b'0' + bs[0]]);
+            let s = format!("%{{1}}%{{1}}%{}%d", op);
+            let res = expand(s.as_bytes(), &[], &mut Variables::new());
+            assert!(res.is_ok(), res.err().unwrap());
+            assert_eq!(res.unwrap(), vec![b'0' + bs[1]]);
+            let s = format!("%{{2}}%{{1}}%{}%d", op);
+            let res = expand(s.as_bytes(), &[], &mut Variables::new());
+            assert!(res.is_ok(), res.err().unwrap());
+            assert_eq!(res.unwrap(), vec![b'0' + bs[2]]);
+        }
+    }
+
+    #[test]
+    fn test_conditionals() {
+        let mut vars = Variables::new();
+        let s = b"\\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m";
+        let res = expand(s, &[Number(1)], &mut vars);
+        assert!(res.is_ok(), res.err().unwrap());
+        assert_eq!(res.unwrap(), "\\E[31m".bytes().collect::<Vec<_>>());
+        let res = expand(s, &[Number(8)], &mut vars);
+        assert!(res.is_ok(), res.err().unwrap());
+        assert_eq!(res.unwrap(), "\\E[90m".bytes().collect::<Vec<_>>());
+        let res = expand(s, &[Number(42)], &mut vars);
+        assert!(res.is_ok(), res.err().unwrap());
+        assert_eq!(res.unwrap(), "\\E[38;5;42m".bytes().collect::<Vec<_>>());
+    }
+
+    #[test]
+    fn test_format() {
+        let mut varstruct = Variables::new();
+        let vars = &mut varstruct;
+        assert_eq!(expand(b"%p1%s%p2%2s%p3%2s%p4%.2s",
+                          &[Words("foo".to_owned()),
+                            Words("foo".to_owned()),
+                            Words("f".to_owned()),
+                            Words("foo".to_owned())],
+                          vars),
+                   Ok("foofoo ffo".bytes().collect::<Vec<_>>()));
+        assert_eq!(expand(b"%p1%:-4.2s", &[Words("foo".to_owned())], vars),
+                   Ok("fo  ".bytes().collect::<Vec<_>>()));
+
+        assert_eq!(expand(b"%p1%d%p1%.3d%p1%5d%p1%:+d", &[Number(1)], vars),
+                   Ok("1001    1+1".bytes().collect::<Vec<_>>()));
+        assert_eq!(expand(b"%p1%o%p1%#o%p2%6.4x%p2%#6.4X",
+                          &[Number(15), Number(27)],
+                          vars),
+                   Ok("17017  001b0X001B".bytes().collect::<Vec<_>>()));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/terminfo/parser/compiled.rs
@@ -0,0 +1,199 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! ncurses-compatible compiled terminfo format parsing (term(5))
+
+use std::collections::HashMap;
+use std::io::prelude::*;
+use std::io;
+
+use terminfo::Error::*;
+use terminfo::TermInfo;
+use Result;
+
+pub use terminfo::parser::names::*;
+
+// These are the orders ncurses uses in its compiled format (as of 5.9). Not
+// sure if portable.
+
+fn read_le_u16(r: &mut io::Read) -> io::Result<u16> {
+    let mut b = [0; 2];
+    let mut amt = 0;
+    while amt < b.len() {
+        match try!(r.read(&mut b[amt..])) {
+            0 => return Err(io::Error::new(io::ErrorKind::Other, "end of file")),
+            n => amt += n,
+        }
+    }
+    Ok((b[0] as u16) | ((b[1] as u16) << 8))
+}
+
+fn read_byte(r: &mut io::Read) -> io::Result<u8> {
+    match r.bytes().next() {
+        Some(s) => s,
+        None => Err(io::Error::new(io::ErrorKind::Other, "end of file")),
+    }
+}
+
+/// Parse a compiled terminfo entry, using long capability names if `longnames`
+/// is true
+pub fn parse(file: &mut io::Read, longnames: bool) -> Result<TermInfo> {
+    let (bnames, snames, nnames) = if longnames {
+        (boolfnames, stringfnames, numfnames)
+    } else {
+        (boolnames, stringnames, numnames)
+    };
+
+    // Check magic number
+    let magic = try!(read_le_u16(file));
+    if magic != 0x011A {
+        return Err(BadMagic(magic).into());
+    }
+
+    // According to the spec, these fields must be >= -1 where -1 means that the
+    // feature is not
+    // supported. Using 0 instead of -1 works because we skip sections with length
+    // 0.
+    macro_rules! read_nonneg {
+        () => {{
+            match try!(read_le_u16(file)) as i16 {
+                n if n >= 0 => n as usize,
+                -1 => 0,
+                _ => return Err(InvalidLength.into()),
+            }
+        }}
+    }
+
+    let names_bytes = read_nonneg!();
+    let bools_bytes = read_nonneg!();
+    let numbers_count = read_nonneg!();
+    let string_offsets_count = read_nonneg!();
+    let string_table_bytes = read_nonneg!();
+
+    if names_bytes == 0 {
+        return Err(ShortNames.into());
+    }
+
+    if bools_bytes > boolnames.len() {
+        return Err(TooManyBools.into());
+    }
+
+    if numbers_count > numnames.len() {
+        return Err(TooManyNumbers.into());
+    }
+
+    if string_offsets_count > stringnames.len() {
+        return Err(TooManyStrings.into());
+    }
+
+    // don't read NUL
+    let mut bytes = Vec::new();
+    try!(file.take((names_bytes - 1) as u64).read_to_end(&mut bytes));
+    let names_str = match String::from_utf8(bytes) {
+        Ok(s) => s,
+        Err(e) => return Err(NotUtf8(e.utf8_error()).into()),
+    };
+
+    let term_names: Vec<String> = names_str.split('|')
+                                           .map(|s| s.to_owned())
+                                           .collect();
+    // consume NUL
+    if try!(read_byte(file)) != b'\0' {
+        return Err(NamesMissingNull.into());
+    }
+
+    let bools_map: HashMap<&str, bool> = try! {
+        (0..bools_bytes).filter_map(|i| match read_byte(file) {
+            Err(e) => Some(Err(e)),
+            Ok(1) => Some(Ok((bnames[i], true))),
+            Ok(_) => None
+        }).collect()
+    };
+
+    if (bools_bytes + names_bytes) % 2 == 1 {
+        try!(read_byte(file)); // compensate for padding
+    }
+
+    let numbers_map: HashMap<&str, u16> = try! {
+        (0..numbers_count).filter_map(|i| match read_le_u16(file) {
+            Ok(0xFFFF) => None,
+            Ok(n) => Some(Ok((nnames[i], n))),
+            Err(e) => Some(Err(e))
+        }).collect()
+    };
+
+    let string_map: HashMap<&str, Vec<u8>> = if string_offsets_count > 0 {
+        let string_offsets: Vec<u16> = try!((0..string_offsets_count)
+                                                .map(|_| read_le_u16(file))
+                                                .collect());
+
+        let mut string_table = Vec::new();
+        try!(file.take(string_table_bytes as u64).read_to_end(&mut string_table));
+
+        try!(string_offsets.into_iter()
+                           .enumerate()
+                           .filter(|&(_, offset)| {
+                               // non-entry
+                               offset != 0xFFFF
+                           })
+                           .map(|(i, offset)| {
+                               let offset = offset as usize;
+
+                               let name = if snames[i] == "_" {
+                                   stringfnames[i]
+                               } else {
+                                   snames[i]
+                               };
+
+                               if offset == 0xFFFE {
+                                   // undocumented: FFFE indicates cap@, which means the capability
+                                   // is not present
+                                   // unsure if the handling for this is correct
+                                   return Ok((name, Vec::new()));
+                               }
+
+                               // Find the offset of the NUL we want to go to
+                               let nulpos = string_table[offset..string_table_bytes]
+                                                .iter()
+                                                .position(|&b| b == 0);
+                               match nulpos {
+                                   Some(len) => {
+                                       Ok((name,
+                                           string_table[offset..offset + len].to_vec()))
+                                   }
+                                   None => return Err(::Error::TerminfoParsing(StringsMissingNull)),
+                               }
+                           })
+                           .collect())
+    } else {
+        HashMap::new()
+    };
+
+    // And that's all there is to it
+    Ok(TermInfo {
+        names: term_names,
+        bools: bools_map,
+        numbers: numbers_map,
+        strings: string_map,
+    })
+}
+
+#[cfg(test)]
+mod test {
+
+    use super::{boolnames, boolfnames, numnames, numfnames, stringnames, stringfnames};
+
+    #[test]
+    fn test_veclens() {
+        assert_eq!(boolfnames.len(), boolnames.len());
+        assert_eq!(numfnames.len(), numnames.len());
+        assert_eq!(stringfnames.len(), stringnames.len());
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/terminfo/parser/names.rs
@@ -0,0 +1,553 @@
+#![allow(non_upper_case_globals, missing_docs)]
+#![cfg_attr(rustfmt, rustfmt_skip)]
+
+pub static boolfnames: &'static [&'static str] = &["auto_left_margin",
+                                                   "auto_right_margin",
+                                                   "no_esc_ctlc",
+                                                   "ceol_standout_glitch",
+                                                   "eat_newline_glitch",
+                                                   "erase_overstrike",
+                                                   "generic_type",
+                                                   "hard_copy",
+                                                   "has_meta_key",
+                                                   "has_status_line",
+                                                   "insert_null_glitch",
+                                                   "memory_above",
+                                                   "memory_below",
+                                                   "move_insert_mode",
+                                                   "move_standout_mode",
+                                                   "over_strike",
+                                                   "status_line_esc_ok",
+                                                   "dest_tabs_magic_smso",
+                                                   "tilde_glitch",
+                                                   "transparent_underline",
+                                                   "xon_xoff",
+                                                   "needs_xon_xoff",
+                                                   "prtr_silent",
+                                                   "hard_cursor",
+                                                   "non_rev_rmcup",
+                                                   "no_pad_char",
+                                                   "non_dest_scroll_region",
+                                                   "can_change",
+                                                   "back_color_erase",
+                                                   "hue_lightness_saturation",
+                                                   "col_addr_glitch",
+                                                   "cr_cancels_micro_mode",
+                                                   "has_print_wheel",
+                                                   "row_addr_glitch",
+                                                   "semi_auto_right_margin",
+                                                   "cpi_changes_res",
+                                                   "lpi_changes_res",
+                                                   "backspaces_with_bs",
+                                                   "crt_no_scrolling",
+                                                   "no_correctly_working_cr",
+                                                   "gnu_has_meta_key",
+                                                   "linefeed_is_newline",
+                                                   "has_hardware_tabs",
+                                                   "return_does_clr_eol"];
+
+pub static boolnames: &'static [&'static str] =
+    &["bw", "am", "xsb", "xhp", "xenl", "eo", "gn", "hc", "km", "hs", "in", "db", "da", "mir",
+      "msgr", "os", "eslok", "xt", "hz", "ul", "xon", "nxon", "mc5i", "chts", "nrrmc", "npc",
+      "ndscr", "ccc", "bce", "hls", "xhpa", "crxm", "daisy", "xvpa", "sam", "cpix", "lpix",
+      "OTbs", "OTns", "OTnc", "OTMT", "OTNL", "OTpt", "OTxr"];
+
+pub static numfnames: &'static [&'static str] = &["columns",
+                                                  "init_tabs",
+                                                  "lines",
+                                                  "lines_of_memory",
+                                                  "magic_cookie_glitch",
+                                                  "padding_baud_rate",
+                                                  "virtual_terminal",
+                                                  "width_status_line",
+                                                  "num_labels",
+                                                  "label_height",
+                                                  "label_width",
+                                                  "max_attributes",
+                                                  "maximum_windows",
+                                                  "max_colors",
+                                                  "max_pairs",
+                                                  "no_color_video",
+                                                  "buffer_capacity",
+                                                  "dot_vert_spacing",
+                                                  "dot_horz_spacing",
+                                                  "max_micro_address",
+                                                  "max_micro_jump",
+                                                  "micro_col_size",
+                                                  "micro_line_size",
+                                                  "number_of_pins",
+                                                  "output_res_char",
+                                                  "output_res_line",
+                                                  "output_res_horz_inch",
+                                                  "output_res_vert_inch",
+                                                  "print_rate",
+                                                  "wide_char_size",
+                                                  "buttons",
+                                                  "bit_image_entwining",
+                                                  "bit_image_type",
+                                                  "magic_cookie_glitch_ul",
+                                                  "carriage_return_delay",
+                                                  "new_line_delay",
+                                                  "backspace_delay",
+                                                  "horizontal_tab_delay",
+                                                  "number_of_function_keys"];
+
+pub static numnames: &'static [&'static str] =
+    &["cols", "it", "lines", "lm", "xmc", "pb", "vt", "wsl", "nlab", "lh", "lw", "ma", "wnum",
+      "colors", "pairs", "ncv", "bufsz", "spinv", "spinh", "maddr", "mjump", "mcs", "mls",
+      "npins", "orc", "orl", "orhi", "orvi", "cps", "widcs", "btns", "bitwin", "bitype", "UTug",
+      "OTdC", "OTdN", "OTdB", "OTdT", "OTkn"];
+
+pub static stringfnames: &'static [&'static str] = &["back_tab",
+                                                     "bell",
+                                                     "carriage_return",
+                                                     "change_scroll_region",
+                                                     "clear_all_tabs",
+                                                     "clear_screen",
+                                                     "clr_eol",
+                                                     "clr_eos",
+                                                     "column_address",
+                                                     "command_character",
+                                                     "cursor_address",
+                                                     "cursor_down",
+                                                     "cursor_home",
+                                                     "cursor_invisible",
+                                                     "cursor_left",
+                                                     "cursor_mem_address",
+                                                     "cursor_normal",
+                                                     "cursor_right",
+                                                     "cursor_to_ll",
+                                                     "cursor_up",
+                                                     "cursor_visible",
+                                                     "delete_character",
+                                                     "delete_line",
+                                                     "dis_status_line",
+                                                     "down_half_line",
+                                                     "enter_alt_charset_mode",
+                                                     "enter_blink_mode",
+                                                     "enter_bold_mode",
+                                                     "enter_ca_mode",
+                                                     "enter_delete_mode",
+                                                     "enter_dim_mode",
+                                                     "enter_insert_mode",
+                                                     "enter_secure_mode",
+                                                     "enter_protected_mode",
+                                                     "enter_reverse_mode",
+                                                     "enter_standout_mode",
+                                                     "enter_underline_mode",
+                                                     "erase_chars",
+                                                     "exit_alt_charset_mode",
+                                                     "exit_attribute_mode",
+                                                     "exit_ca_mode",
+                                                     "exit_delete_mode",
+                                                     "exit_insert_mode",
+                                                     "exit_standout_mode",
+                                                     "exit_underline_mode",
+                                                     "flash_screen",
+                                                     "form_feed",
+                                                     "from_status_line",
+                                                     "init_1string",
+                                                     "init_2string",
+                                                     "init_3string",
+                                                     "init_file",
+                                                     "insert_character",
+                                                     "insert_line",
+                                                     "insert_padding",
+                                                     "key_backspace",
+                                                     "key_catab",
+                                                     "key_clear",
+                                                     "key_ctab",
+                                                     "key_dc",
+                                                     "key_dl",
+                                                     "key_down",
+                                                     "key_eic",
+                                                     "key_eol",
+                                                     "key_eos",
+                                                     "key_f0",
+                                                     "key_f1",
+                                                     "key_f10",
+                                                     "key_f2",
+                                                     "key_f3",
+                                                     "key_f4",
+                                                     "key_f5",
+                                                     "key_f6",
+                                                     "key_f7",
+                                                     "key_f8",
+                                                     "key_f9",
+                                                     "key_home",
+                                                     "key_ic",
+                                                     "key_il",
+                                                     "key_left",
+                                                     "key_ll",
+                                                     "key_npage",
+                                                     "key_ppage",
+                                                     "key_right",
+                                                     "key_sf",
+                                                     "key_sr",
+                                                     "key_stab",
+                                                     "key_up",
+                                                     "keypad_local",
+                                                     "keypad_xmit",
+                                                     "lab_f0",
+                                                     "lab_f1",
+                                                     "lab_f10",
+                                                     "lab_f2",
+                                                     "lab_f3",
+                                                     "lab_f4",
+                                                     "lab_f5",
+                                                     "lab_f6",
+                                                     "lab_f7",
+                                                     "lab_f8",
+                                                     "lab_f9",
+                                                     "meta_off",
+                                                     "meta_on",
+                                                     "newline",
+                                                     "pad_char",
+                                                     "parm_dch",
+                                                     "parm_delete_line",
+                                                     "parm_down_cursor",
+                                                     "parm_ich",
+                                                     "parm_index",
+                                                     "parm_insert_line",
+                                                     "parm_left_cursor",
+                                                     "parm_right_cursor",
+                                                     "parm_rindex",
+                                                     "parm_up_cursor",
+                                                     "pkey_key",
+                                                     "pkey_local",
+                                                     "pkey_xmit",
+                                                     "print_screen",
+                                                     "prtr_off",
+                                                     "prtr_on",
+                                                     "repeat_char",
+                                                     "reset_1string",
+                                                     "reset_2string",
+                                                     "reset_3string",
+                                                     "reset_file",
+                                                     "restore_cursor",
+                                                     "row_address",
+                                                     "save_cursor",
+                                                     "scroll_forward",
+                                                     "scroll_reverse",
+                                                     "set_attributes",
+                                                     "set_tab",
+                                                     "set_window",
+                                                     "tab",
+                                                     "to_status_line",
+                                                     "underline_char",
+                                                     "up_half_line",
+                                                     "init_prog",
+                                                     "key_a1",
+                                                     "key_a3",
+                                                     "key_b2",
+                                                     "key_c1",
+                                                     "key_c3",
+                                                     "prtr_non",
+                                                     "char_padding",
+                                                     "acs_chars",
+                                                     "plab_norm",
+                                                     "key_btab",
+                                                     "enter_xon_mode",
+                                                     "exit_xon_mode",
+                                                     "enter_am_mode",
+                                                     "exit_am_mode",
+                                                     "xon_character",
+                                                     "xoff_character",
+                                                     "ena_acs",
+                                                     "label_on",
+                                                     "label_off",
+                                                     "key_beg",
+                                                     "key_cancel",
+                                                     "key_close",
+                                                     "key_command",
+                                                     "key_copy",
+                                                     "key_create",
+                                                     "key_end",
+                                                     "key_enter",
+                                                     "key_exit",
+                                                     "key_find",
+                                                     "key_help",
+                                                     "key_mark",
+                                                     "key_message",
+                                                     "key_move",
+                                                     "key_next",
+                                                     "key_open",
+                                                     "key_options",
+                                                     "key_previous",
+                                                     "key_print",
+                                                     "key_redo",
+                                                     "key_reference",
+                                                     "key_refresh",
+                                                     "key_replace",
+                                                     "key_restart",
+                                                     "key_resume",
+                                                     "key_save",
+                                                     "key_suspend",
+                                                     "key_undo",
+                                                     "key_sbeg",
+                                                     "key_scancel",
+                                                     "key_scommand",
+                                                     "key_scopy",
+                                                     "key_screate",
+                                                     "key_sdc",
+                                                     "key_sdl",
+                                                     "key_select",
+                                                     "key_send",
+                                                     "key_seol",
+                                                     "key_sexit",
+                                                     "key_sfind",
+                                                     "key_shelp",
+                                                     "key_shome",
+                                                     "key_sic",
+                                                     "key_sleft",
+                                                     "key_smessage",
+                                                     "key_smove",
+                                                     "key_snext",
+                                                     "key_soptions",
+                                                     "key_sprevious",
+                                                     "key_sprint",
+                                                     "key_sredo",
+                                                     "key_sreplace",
+                                                     "key_sright",
+                                                     "key_srsume",
+                                                     "key_ssave",
+                                                     "key_ssuspend",
+                                                     "key_sundo",
+                                                     "req_for_input",
+                                                     "key_f11",
+                                                     "key_f12",
+                                                     "key_f13",
+                                                     "key_f14",
+                                                     "key_f15",
+                                                     "key_f16",
+                                                     "key_f17",
+                                                     "key_f18",
+                                                     "key_f19",
+                                                     "key_f20",
+                                                     "key_f21",
+                                                     "key_f22",
+                                                     "key_f23",
+                                                     "key_f24",
+                                                     "key_f25",
+                                                     "key_f26",
+                                                     "key_f27",
+                                                     "key_f28",
+                                                     "key_f29",
+                                                     "key_f30",
+                                                     "key_f31",
+                                                     "key_f32",
+                                                     "key_f33",
+                                                     "key_f34",
+                                                     "key_f35",
+                                                     "key_f36",
+                                                     "key_f37",
+                                                     "key_f38",
+                                                     "key_f39",
+                                                     "key_f40",
+                                                     "key_f41",
+                                                     "key_f42",
+                                                     "key_f43",
+                                                     "key_f44",
+                                                     "key_f45",
+                                                     "key_f46",
+                                                     "key_f47",
+                                                     "key_f48",
+                                                     "key_f49",
+                                                     "key_f50",
+                                                     "key_f51",
+                                                     "key_f52",
+                                                     "key_f53",
+                                                     "key_f54",
+                                                     "key_f55",
+                                                     "key_f56",
+                                                     "key_f57",
+                                                     "key_f58",
+                                                     "key_f59",
+                                                     "key_f60",
+                                                     "key_f61",
+                                                     "key_f62",
+                                                     "key_f63",
+                                                     "clr_bol",
+                                                     "clear_margins",
+                                                     "set_left_margin",
+                                                     "set_right_margin",
+                                                     "label_format",
+                                                     "set_clock",
+                                                     "display_clock",
+                                                     "remove_clock",
+                                                     "create_window",
+                                                     "goto_window",
+                                                     "hangup",
+                                                     "dial_phone",
+                                                     "quick_dial",
+                                                     "tone",
+                                                     "pulse",
+                                                     "flash_hook",
+                                                     "fixed_pause",
+                                                     "wait_tone",
+                                                     "user0",
+                                                     "user1",
+                                                     "user2",
+                                                     "user3",
+                                                     "user4",
+                                                     "user5",
+                                                     "user6",
+                                                     "user7",
+                                                     "user8",
+                                                     "user9",
+                                                     "orig_pair",
+                                                     "orig_colors",
+                                                     "initialize_color",
+                                                     "initialize_pair",
+                                                     "set_color_pair",
+                                                     "set_foreground",
+                                                     "set_background",
+                                                     "change_char_pitch",
+                                                     "change_line_pitch",
+                                                     "change_res_horz",
+                                                     "change_res_vert",
+                                                     "define_char",
+                                                     "enter_doublewide_mode",
+                                                     "enter_draft_quality",
+                                                     "enter_italics_mode",
+                                                     "enter_leftward_mode",
+                                                     "enter_micro_mode",
+                                                     "enter_near_letter_quality",
+                                                     "enter_normal_quality",
+                                                     "enter_shadow_mode",
+                                                     "enter_subscript_mode",
+                                                     "enter_superscript_mode",
+                                                     "enter_upward_mode",
+                                                     "exit_doublewide_mode",
+                                                     "exit_italics_mode",
+                                                     "exit_leftward_mode",
+                                                     "exit_micro_mode",
+                                                     "exit_shadow_mode",
+                                                     "exit_subscript_mode",
+                                                     "exit_superscript_mode",
+                                                     "exit_upward_mode",
+                                                     "micro_column_address",
+                                                     "micro_down",
+                                                     "micro_left",
+                                                     "micro_right",
+                                                     "micro_row_address",
+                                                     "micro_up",
+                                                     "order_of_pins",
+                                                     "parm_down_micro",
+                                                     "parm_left_micro",
+                                                     "parm_right_micro",
+                                                     "parm_up_micro",
+                                                     "select_char_set",
+                                                     "set_bottom_margin",
+                                                     "set_bottom_margin_parm",
+                                                     "set_left_margin_parm",
+                                                     "set_right_margin_parm",
+                                                     "set_top_margin",
+                                                     "set_top_margin_parm",
+                                                     "start_bit_image",
+                                                     "start_char_set_def",
+                                                     "stop_bit_image",
+                                                     "stop_char_set_def",
+                                                     "subscript_characters",
+                                                     "superscript_characters",
+                                                     "these_cause_cr",
+                                                     "zero_motion",
+                                                     "char_set_names",
+                                                     "key_mouse",
+                                                     "mouse_info",
+                                                     "req_mouse_pos",
+                                                     "get_mouse",
+                                                     "set_a_foreground",
+                                                     "set_a_background",
+                                                     "pkey_plab",
+                                                     "device_type",
+                                                     "code_set_init",
+                                                     "set0_des_seq",
+                                                     "set1_des_seq",
+                                                     "set2_des_seq",
+                                                     "set3_des_seq",
+                                                     "set_lr_margin",
+                                                     "set_tb_margin",
+                                                     "bit_image_repeat",
+                                                     "bit_image_newline",
+                                                     "bit_image_carriage_return",
+                                                     "color_names",
+                                                     "define_bit_image_region",
+                                                     "end_bit_image_region",
+                                                     "set_color_band",
+                                                     "set_page_length",
+                                                     "display_pc_char",
+                                                     "enter_pc_charset_mode",
+                                                     "exit_pc_charset_mode",
+                                                     "enter_scancode_mode",
+                                                     "exit_scancode_mode",
+                                                     "pc_term_options",
+                                                     "scancode_escape",
+                                                     "alt_scancode_esc",
+                                                     "enter_horizontal_hl_mode",
+                                                     "enter_left_hl_mode",
+                                                     "enter_low_hl_mode",
+                                                     "enter_right_hl_mode",
+                                                     "enter_top_hl_mode",
+                                                     "enter_vertical_hl_mode",
+                                                     "set_a_attributes",
+                                                     "set_pglen_inch",
+                                                     "termcap_init2",
+                                                     "termcap_reset",
+                                                     "linefeed_if_not_lf",
+                                                     "backspace_if_not_bs",
+                                                     "other_non_function_keys",
+                                                     "arrow_key_map",
+                                                     "acs_ulcorner",
+                                                     "acs_llcorner",
+                                                     "acs_urcorner",
+                                                     "acs_lrcorner",
+                                                     "acs_ltee",
+                                                     "acs_rtee",
+                                                     "acs_btee",
+                                                     "acs_ttee",
+                                                     "acs_hline",
+                                                     "acs_vline",
+                                                     "acs_plus",
+                                                     "memory_lock",
+                                                     "memory_unlock",
+                                                     "box_chars_1"];
+
+pub static stringnames: &'static [&'static str] =
+    &["cbt", "bel", "cr", "csr", "tbc", "clear", "el", "ed", "hpa", "cmdch", "cup", "cud1",
+      "home", "civis", "cub1", "mrcup", "cnorm", "cuf1", "ll", "cuu1", "cvvis", "dch1", "dl1",
+      "dsl", "hd", "smacs", "blink", "bold", "smcup", "smdc", "dim", "smir", "invis", "prot",
+      "rev", "smso", "smul", "ech", "rmacs", "sgr0", "rmcup", "rmdc", "rmir", "rmso", "rmul",
+      "flash", "ff", "fsl", "is1", "is2", "is3", "if", "ich1", "il1", "ip", "kbs", "ktbc", "kclr",
+      "kctab", "kdch1", "kdl1", "kcud1", "krmir", "kel", "ked", "kf0", "kf1", "kf10", "kf2",
+      "kf3", "kf4", "kf5", "kf6", "kf7", "kf8", "kf9", "khome", "kich1", "kil1", "kcub1", "kll",
+      "knp", "kpp", "kcuf1", "kind", "kri", "khts", "kcuu1", "rmkx", "smkx", "lf0", "lf1", "lf10",
+      "lf2", "lf3", "lf4", "lf5", "lf6", "lf7", "lf8", "lf9", "rmm", "smm", "nel", "pad", "dch",
+      "dl", "cud", "ich", "indn", "il", "cub", "cuf", "rin", "cuu", "pfkey", "pfloc", "pfx",
+      "mc0", "mc4", "mc5", "rep", "rs1", "rs2", "rs3", "rf", "rc", "vpa", "sc", "ind", "ri",
+      "sgr", "hts", "wind", "ht", "tsl", "uc", "hu", "iprog", "ka1", "ka3", "kb2", "kc1", "kc3",
+      "mc5p", "rmp", "acsc", "pln", "kcbt", "smxon", "rmxon", "smam", "rmam", "xonc", "xoffc",
+      "enacs", "smln", "rmln", "kbeg", "kcan", "kclo", "kcmd", "kcpy", "kcrt", "kend", "kent",
+      "kext", "kfnd", "khlp", "kmrk", "kmsg", "kmov", "knxt", "kopn", "kopt", "kprv", "kprt",
+      "krdo", "kref", "krfr", "krpl", "krst", "kres", "ksav", "kspd", "kund", "kBEG", "kCAN",
+      "kCMD", "kCPY", "kCRT", "kDC", "kDL", "kslt", "kEND", "kEOL", "kEXT", "kFND", "kHLP",
+      "kHOM", "kIC", "kLFT", "kMSG", "kMOV", "kNXT", "kOPT", "kPRV", "kPRT", "kRDO", "kRPL",
+      "kRIT", "kRES", "kSAV", "kSPD", "kUND", "rfi", "kf11", "kf12", "kf13", "kf14", "kf15",
+      "kf16", "kf17", "kf18", "kf19", "kf20", "kf21", "kf22", "kf23", "kf24", "kf25", "kf26",
+      "kf27", "kf28", "kf29", "kf30", "kf31", "kf32", "kf33", "kf34", "kf35", "kf36", "kf37",
+      "kf38", "kf39", "kf40", "kf41", "kf42", "kf43", "kf44", "kf45", "kf46", "kf47", "kf48",
+      "kf49", "kf50", "kf51", "kf52", "kf53", "kf54", "kf55", "kf56", "kf57", "kf58", "kf59",
+      "kf60", "kf61", "kf62", "kf63", "el1", "mgc", "smgl", "smgr", "fln", "sclk", "dclk",
+      "rmclk", "cwin", "wingo", "hup", "dial", "qdial", "tone", "pulse", "hook", "pause", "wait",
+      "u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7", "u8", "u9", "op", "oc", "initc", "initp",
+      "scp", "setf", "setb", "cpi", "lpi", "chr", "cvr", "defc", "swidm", "sdrfq", "sitm", "slm",
+      "smicm", "snlq", "snrmq", "sshm", "ssubm", "ssupm", "sum", "rwidm", "ritm", "rlm", "rmicm",
+      "rshm", "rsubm", "rsupm", "rum", "mhpa", "mcud1", "mcub1", "mcuf1", "mvpa", "mcuu1",
+      "porder", "mcud", "mcub", "mcuf", "mcuu", "scs", "smgb", "smgbp", "smglp", "smgrp", "smgt",
+      "smgtp", "sbim", "scsd", "rbim", "rcsd", "subcs", "supcs", "docr", "zerom", "csnm", "kmous",
+      "minfo", "reqmp", "getm", "setaf", "setab", "pfxl", "devt", "csin", "s0ds", "s1ds", "s2ds",
+      "s3ds", "smglr", "smgtb", "birep", "binel", "bicr", "colornm", "defbi", "endbi", "setcolor",
+      "slines", "dispc", "smpch", "rmpch", "smsc", "rmsc", "pctrm", "scesc", "scesa", "ehhlm",
+      "elhlm", "elohlm", "erhlm", "ethlm", "evhlm", "sgr1", "slength", "OTi2", "OTrs", "OTnl",
+      "OTbs", "OTko", "OTma", "OTG2", "OTG3", "OTG1", "OTG4", "OTGR", "OTGL", "OTGU", "OTGD",
+      "OTGH", "OTGV", "OTGC", "meml", "memu", "box1"];
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/terminfo/searcher.rs
@@ -0,0 +1,91 @@
+// Copyright 2012 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! ncurses-compatible database discovery
+//!
+//! Does not support hashed database, only filesystem!
+
+use std::env;
+use std::fs;
+use std::path::PathBuf;
+
+/// Return path to database entry for `term`
+pub fn get_dbpath_for_term(term: &str) -> Option<PathBuf> {
+    let mut dirs_to_search = Vec::new();
+    let first_char = match term.chars().next() {
+        Some(c) => c,
+        None => return None,
+    };
+
+    // Find search directory
+    // The terminfo manual says:
+    // 
+    // > If  the  environment  variable  TERMINFO is set, it is interpreted
+    // > as the pathname of a directory containing the compiled description
+    // > you are working on.  Only that directory is searched.
+    //
+    // However, the ncurses manual says:
+    //
+    // > If the environment variable TERMINFO is defined, any program using
+    // > curses checks for a local terminal definition  before  checking in
+    // > the standard place.
+    //
+    // Given that ncurses is the defacto standard, we follow the ncurses manual.
+    if let Some(dir) = env::var_os("TERMINFO") {
+        dirs_to_search.push(PathBuf::from(dir));
+    }
+
+    if let Ok(dirs) = env::var("TERMINFO_DIRS") {
+        for i in dirs.split(':') {
+            if i == "" {
+                dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
+            } else {
+                dirs_to_search.push(PathBuf::from(i));
+            }
+        }
+    } else {
+        // Found nothing in TERMINFO_DIRS, use the default paths:
+        // According to  /etc/terminfo/README, after looking at
+        // ~/.terminfo, ncurses will search /etc/terminfo, then
+        // /lib/terminfo, and eventually /usr/share/terminfo.
+        // On Haiku the database can be found at /boot/system/data/terminfo
+        if let Some(mut homedir) = env::home_dir() {
+            homedir.push(".terminfo");
+            dirs_to_search.push(homedir)
+        }
+
+        dirs_to_search.push(PathBuf::from("/etc/terminfo"));
+        dirs_to_search.push(PathBuf::from("/lib/terminfo"));
+        dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
+        dirs_to_search.push(PathBuf::from("/boot/system/data/terminfo"));
+    }
+
+    // Look for the terminal in all of the search directories
+    for mut p in dirs_to_search {
+        if fs::metadata(&p).is_ok() {
+            p.push(&first_char.to_string());
+            p.push(&term);
+            if fs::metadata(&p).is_ok() {
+                return Some(p);
+            }
+            p.pop();
+            p.pop();
+
+            // on some installations the dir is named after the hex of the char
+            // (e.g. OS X)
+            p.push(&format!("{:x}", first_char as usize));
+            p.push(term);
+            if fs::metadata(&p).is_ok() {
+                return Some(p);
+            }
+        }
+    }
+    None
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/src/win.rs
@@ -0,0 +1,301 @@
+// Copyright 2013-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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Windows console handling
+
+// FIXME (#13400): this is only a tiny fraction of the Windows console api
+
+extern crate kernel32;
+extern crate winapi;
+
+use std::io::prelude::*;
+use std::io;
+use std::ptr;
+
+use Attr;
+use Error;
+use Result;
+use Terminal;
+use color;
+
+/// A Terminal implementation which uses the Win32 Console API.
+pub struct WinConsole<T> {
+    buf: T,
+    def_foreground: color::Color,
+    def_background: color::Color,
+    foreground: color::Color,
+    background: color::Color,
+}
+
+fn color_to_bits(color: color::Color) -> u16 {
+    // magic numbers from mingw-w64's wincon.h
+
+    let bits = match color % 8 {
+        color::BLACK => 0,
+        color::BLUE => 0x1,
+        color::GREEN => 0x2,
+        color::RED => 0x4,
+        color::YELLOW => 0x2 | 0x4,
+        color::MAGENTA => 0x1 | 0x4,
+        color::CYAN => 0x1 | 0x2,
+        color::WHITE => 0x1 | 0x2 | 0x4,
+        _ => unreachable!(),
+    };
+
+    if color >= 8 {
+        bits | 0x8
+    } else {
+        bits
+    }
+}
+
+fn bits_to_color(bits: u16) -> color::Color {
+    let color = match bits & 0x7 {
+        0 => color::BLACK,
+        0x1 => color::BLUE,
+        0x2 => color::GREEN,
+        0x4 => color::RED,
+        0x6 => color::YELLOW,
+        0x5 => color::MAGENTA,
+        0x3 => color::CYAN,
+        0x7 => color::WHITE,
+        _ => unreachable!(),
+    };
+
+    color | (bits & 0x8) // copy the hi-intensity bit
+}
+
+// Just get a handle to the current console buffer whatever it is
+fn conout() -> io::Result<winapi::HANDLE> {
+    let name = b"CONOUT$\0";
+    let handle = unsafe {
+        kernel32::CreateFileA(name.as_ptr() as *const i8,
+                              winapi::GENERIC_READ | winapi::GENERIC_WRITE,
+                              winapi::FILE_SHARE_WRITE,
+                              ptr::null_mut(),
+                              winapi::OPEN_EXISTING,
+                              0,
+                              ptr::null_mut())
+    };
+    if handle == winapi::INVALID_HANDLE_VALUE {
+        Err(io::Error::last_os_error())
+    } else {
+        Ok(handle)
+    }
+}
+
+// This test will only pass if it is running in an actual console, probably
+#[test]
+fn test_conout() {
+    assert!(conout().is_ok())
+}
+
+impl<T: Write + Send> WinConsole<T> {
+    fn apply(&mut self) -> io::Result<()> {
+        let out = try!(conout());
+        let _unused = self.buf.flush();
+        let mut accum: winapi::WORD = 0;
+        accum |= color_to_bits(self.foreground);
+        accum |= color_to_bits(self.background) << 4;
+        unsafe {
+            kernel32::SetConsoleTextAttribute(out, accum);
+        }
+        Ok(())
+    }
+
+    /// Returns `Err` whenever the terminal cannot be created for some
+    /// reason.
+    pub fn new(out: T) -> io::Result<WinConsole<T>> {
+        let fg;
+        let bg;
+        let handle = try!(conout());
+        unsafe {
+            let mut buffer_info = ::std::mem::uninitialized();
+            if kernel32::GetConsoleScreenBufferInfo(handle, &mut buffer_info) != 0 {
+                fg = bits_to_color(buffer_info.wAttributes);
+                bg = bits_to_color(buffer_info.wAttributes >> 4);
+            } else {
+                return Err(io::Error::last_os_error());
+            }
+        }
+        Ok(WinConsole {
+            buf: out,
+            def_foreground: fg,
+            def_background: bg,
+            foreground: fg,
+            background: bg,
+        })
+    }
+}
+
+impl<T: Write> Write for WinConsole<T> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.buf.write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.buf.flush()
+    }
+}
+
+impl<T: Write + Send> Terminal for WinConsole<T> {
+    type Output = T;
+
+    fn fg(&mut self, color: color::Color) -> Result<()> {
+        self.foreground = color;
+        try!(self.apply());
+
+        Ok(())
+    }
+
+    fn bg(&mut self, color: color::Color) -> Result<()> {
+        self.background = color;
+        try!(self.apply());
+
+        Ok(())
+    }
+
+    fn attr(&mut self, attr: Attr) -> Result<()> {
+        match attr {
+            Attr::ForegroundColor(f) => {
+                self.foreground = f;
+                try!(self.apply());
+                Ok(())
+            }
+            Attr::BackgroundColor(b) => {
+                self.background = b;
+                try!(self.apply());
+                Ok(())
+            }
+            _ => Err(Error::NotSupported),
+        }
+    }
+
+    fn supports_attr(&self, attr: Attr) -> bool {
+        // it claims support for underscore and reverse video, but I can't get
+        // it to do anything -cmr
+        match attr {
+            Attr::ForegroundColor(_) | Attr::BackgroundColor(_) => true,
+            _ => false,
+        }
+    }
+
+    fn reset(&mut self) -> Result<()> {
+        self.foreground = self.def_foreground;
+        self.background = self.def_background;
+        try!(self.apply());
+
+        Ok(())
+    }
+
+    fn supports_reset(&self) -> bool {
+        true
+    }
+
+    fn supports_color(&self) -> bool {
+        true
+    }
+
+    fn cursor_up(&mut self) -> Result<()> {
+        let _unused = self.buf.flush();
+        let handle = try!(conout());
+        unsafe {
+            let mut buffer_info = ::std::mem::uninitialized();
+            if kernel32::GetConsoleScreenBufferInfo(handle, &mut buffer_info) != 0 {
+                let (x, y) = (buffer_info.dwCursorPosition.X,
+                              buffer_info.dwCursorPosition.Y);
+                if y == 0 {
+                    // Even though this might want to be a CursorPositionInvalid, on Unix there
+                    // is no checking to see if the cursor is already on the first line.
+                    // I'm not sure what the ideal behavior is, but I think it'd be silly to have
+                    // cursor_up fail in this case.
+                    Ok(())
+                } else {
+                    let pos = winapi::COORD {
+                        X: x,
+                        Y: y - 1,
+                    };
+                    if kernel32::SetConsoleCursorPosition(handle, pos) != 0 {
+                        Ok(())
+                    } else {
+                        Err(io::Error::last_os_error().into())
+                    }
+                }
+            } else {
+                Err(io::Error::last_os_error().into())
+            }
+        }
+    }
+
+    fn delete_line(&mut self) -> Result<()> {
+        let _unused = self.buf.flush();
+        let handle = try!(conout());
+        unsafe {
+            let mut buffer_info = ::std::mem::uninitialized();
+            if kernel32::GetConsoleScreenBufferInfo(handle, &mut buffer_info) == 0 {
+                return Err(io::Error::last_os_error().into());
+            }
+            let pos = buffer_info.dwCursorPosition;
+            let size = buffer_info.dwSize;
+            let num = (size.X - pos.X) as winapi::DWORD;
+            let mut written = 0;
+            if kernel32::FillConsoleOutputCharacterW(handle, 0, num, pos, &mut written) == 0 {
+                return Err(io::Error::last_os_error().into());
+            }
+            if kernel32::FillConsoleOutputAttribute(handle, 0, num, pos, &mut written) == 0 {
+                return Err(io::Error::last_os_error().into());
+            }
+            // Similar reasoning for not failing as in cursor_up -- it doesn't even make
+            // sense to
+            // me that these APIs could have written 0, unless the terminal is width zero.
+            Ok(())
+        }
+    }
+
+    fn carriage_return(&mut self) -> Result<()> {
+        let _unused = self.buf.flush();
+        let handle = try!(conout());
+        unsafe {
+            let mut buffer_info = ::std::mem::uninitialized();
+            if kernel32::GetConsoleScreenBufferInfo(handle, &mut buffer_info) != 0 {
+                let winapi::COORD { X: x, Y: y } = buffer_info.dwCursorPosition;
+                if x == 0 {
+                    Err(Error::CursorDestinationInvalid)
+                } else {
+                    let pos = winapi::COORD {
+                        X: 0,
+                        Y: y,
+                    };
+                    if kernel32::SetConsoleCursorPosition(handle, pos) != 0 {
+                        Ok(())
+                    } else {
+                        Err(io::Error::last_os_error().into())
+                    }
+                }
+            } else {
+                Err(io::Error::last_os_error().into())
+            }
+        }
+    }
+
+    fn get_ref<'a>(&'a self) -> &'a T {
+        &self.buf
+    }
+
+    fn get_mut<'a>(&'a mut self) -> &'a mut T {
+        &mut self.buf
+    }
+
+    fn into_inner(self) -> T
+        where Self: Sized
+    {
+        self.buf
+    }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..fd4091a9946019db595d9b4ac2a6b935fe42dd20
GIT binary patch
literal 308
zc$|}Blwe?DU}R`w;9y88%}uJYFwjlT&neB#Qvh)lN=hmj7#IT>{{LqHs{4-ySTIC}
OFJNO}XW(Vv0zv@OAq43F
new file mode 100644
index 0000000000000000000000000000000000000000..b458ffaf9ee20fee8841b0a3aca29bbc46c77fa1
GIT binary patch
literal 1780
zc$~FWT}TvB6h8NEnAx93NwpOf4P<}L+?jEASxZe#%MAM?OT=t7ciq|5OlwPbBM5@%
z!CrzWD1sn@pkJtm=+EjUBBF<W9_yip2+D_gh_-X??5rufU_^&G-~G<HXYS88m$`G<
zOqdV(5NGRMRw&vR8<4m#&=uX^Wwiq^e9)z(2unxFWG;Fp%Y|~7fqeiRCcrG13yVO3
zBFq?24K+{)JCN^$cEk`w;1I;+NJrr~oRsVooR;lbxB!>n3fzRdGJXh8;W@k-HSb6G
zgz@K8?hCfV>HhEV6F8g5rmzB5$mX%dY$;pCbe2qd(MwqcTgU9m4J`9s9NUEbo7pZF
zU>34ImSD%R9USx4nN)n9U1V3;HFksDW|Mg`IgS5Wm7k7gBHJ#boxEjK&4{&U$&a<p
zan@xsi}&ytPw->>1Rvz5`8j^^A4kk)m;Z9ytNaeX#~<@&{3U<=pVpMk6qnr=xpdcf
z>Q}oeT@zs{xSN!a(yb|Nex+L|Z9SOKI}mE!O&hSO1G`NX)r_sLg*+-oFB7JPs0AR`
zj)I740C^>P#YoOexd!xlbWMvOngo&w0wajvi8x>o$T=ISOr=ou+pS^IOR`MJx-vP3
zX)P%gs#?4TGv(+T;RtOkfv^@`E=On-+A%G$sfwVQrtnaY=9TCp6sqKs5>ROg5i^nA
z;M6>4nGFu9cgR|YlsjajL#iB7=@498z}>tB+};tj+raH1sq0gFSIQ{e>-Q*rq5`R5
zQ+*_BAT@1jA{90*L8{r*M-({<R|}JH=o(m_zoKB}>{WBr_q!*wUf=tp<7@C*=tbw-
z@O|rD<U#aFSE74p-%!uc{+8ayeYXxgJoqSf^U(0&Z~Y$z-o(!(e&Hay=reeN66y08
z3H-C7a8iC@NR+w>DWQ-$3#qd%CDx_Jx~$h_y;f&Sfv2u*3uzyv(M#wgk?TIc;loXk
zXw40zOpG+?7p56kmMQ(3s;Y6NSW!ic1j?K@GUij~RF_{tp13r#&n}%qaN&KEgE!P-
xdGD}M|9$GsL3O9Vbi8c}QHupo(FipvG;V|KUZ_@Ks|w*(0pUFwx(?xhfZyL)ScU)q
new file mode 100644
index 0000000000000000000000000000000000000000..8c2e4768b6983a96f617fbe1f63c17cb816bf124
GIT binary patch
literal 1858
zc$~FWO=uHA6n--it+i?u6>U_ixL~cVyR*AVO2k^VwzO7jwb&n|Y7(2Yo2K?hqcIUd
z5X6IC1W`~5f(U}Ypa=1%RWBkU9{f4#!Gj3egC4~A-fXs|rGbh#<bCtKH{Z_Ad^=<c
zSTQVtd`Pn6E-TX2A1~27ftVHRIV!WlK&-1bW`zn5Mf$>pnx{~X^#U;bVaS#t%*oQ}
z97s>t@^QEv#{f7?f%#AX%Rqr5tQb%URZt7NkT*jJF#=II3`sfDaX1O5B|8h}WPbrJ
z!xgv&x8c6bAHy?v0k6lr_Y-`^{7a_x75m|l@gMLDIGe`u*c`TiEoRHvN><8rT)Pir
zEvsOgnXRm06Ys@oTXB3lYheLqA?s%;b`twD<DNR7$uF@1cAec|x7b}agQwH8_!xgi
zvU$iFW!B8w#%M-cC`)~O>zJf2TeEl%kMk5i!B6os{2af?2mW!!Z0+h_&U>BT;}7^C
zf6ia=H~(o(*_z_A`y$si*JSklu7qnE%mjC<5>dJ}CFobWg%a$+g5Hi$?QX5Xt`_V*
zBdQv&uZCO_W0VWiLev6~V`pJRHGq60M#X5&N40v4It)#VBANt}2?8UG;Eg(95Xg5n
zkxZpj_1nE+(L+)uq^?}P!?aec6{@;s9ah$3Y=L96u@u4v47nVkQEKP3#MVs&mGlZP
zjc7iJWrRYNTv7s(dWe{*kqyqwb(UH0kUEEKaL9UxY;njYhir5RE-v8S-2iUisM|qs
zd&%m$%-)r9D);%lil3-JYS>gCtr|#8o0>?4O+838o0btpj>c8Pbey^hit|^`DOp&$
zNd2&9%HEs%f3|-M--x{Ic-Q&RdLMn%^)#019y&18Gt}GGH`ssY;NwG2;<pbEANij6
zc=T=ZV(K?e(n6oX8<t3)$4KEnD;g*57luUXn~)X?>9deN>(XLfdaO&mF7;ZiZ3UjX
zU;}yIMYDV8BvI&PexnRGL8k4lCuid1NkW)rQdy-WG*wlT${Ix#aWZJ)x-nrrb53=d
zG~r7sQ6*@5pYSG?b<)a^U)UbD8d+5)sZ3jCpLsgJ;KFNaD&BX?<#olz+!r)D6~9Uz
m%!awJ06km^6-`j3LeoxY^g*QxJ5=c0E1+|qhM_}eK)@e`fN#+N
new file mode 100644
index 0000000000000000000000000000000000000000..4f23cb9ad8ba4c8a21778f399e05066932569d82
GIT binary patch
literal 1664
zc$~FWO-NKx6#ni_%p|d*!W@i}Cg{g{f8#hz<bN}y6KV>kNa{>FHb2^^X{i%I1VR)+
zErKGbO^XPlR&BDHAY4??#tPcFD59Wj<4QaCzIh{xh7ld+eCIpoo_Ftk-@Dw&Wx2@1
zI*hQlJlqxSA1r8Z>+SLnOTNwD9qsK7p8y#B$fYGoD#hGf2KiE!ff8(>F@Pftn~;m`
zuwxfh3{=8Hu}VJaBdjHFz%iM(z>lD05yWI1z%b6^BCg=N%x~ci?%~0Lb;psQ{8h3x
zLGev${2eCo2~+rj@0i96W|77+SvH%S+en_n@>o7IJ9o0B-^H@sG+w|8Suyhxt7T2h
zPcgjcss3a>#Nup}U1FEnRrZ-`Ul;U!OJzTZsa!Azck`uJE?uU+*bc3*Z#nbwBfOqB
z@mAi!!#u_ZdHf$|T+S~1<-DW(8o$AB^Sl3PKYz0O$u-CLlNGI=;1hf`vS4erciDSX
zd%$h)(d>a374%L5udVqog({da+2mQ=??t9)Mh0Oyc`11fxsO~`BZLkCl4$~rAb~St
zfgwQ7*C^T)kt%L88e#E}Y|~_4u_GuTyyJkTDEkjmrG&g1=ftMt1ZCuM3z{lYGZ))x
zt`JZumT-y@wMe2%pr%MJsQ}ShD2OATda0~TYnwF|@mZwIA|)27wn&9V$}K{h^V?eL
zU@MweG60)X$mmPHyS-SH``k{uTTqRtVN!j*Y7ljp)In4;X(3V7q%J{;lW<<Fp{YIC
zvu^MDf}DL@l#i`xZ4WzUI)4Vox?Z1rA9@=85E+lY?2h*&P9<WA-s62Q`X8TuHt>A#
z(V1Uor-!D7Cr56^XK9iq@fn;!iQ@AZak@20I4QqoNR+y1QbJAYtVx}9DX}g!)@8pg
z`_(E_3OZ4NI-z}3%wFgx6t276hAWahQo0mO9*z_<kC`|!tLU~*r+<rldHb^kw=ZZk
oope}>Y`XI|)2_Fov=JT!jrC|KLZyPE3PNofLhUNKj*wr&Z^O_>D*ylh
new file mode 100644
index 0000000000000000000000000000000000000000..aa66f83d836c5c348162b91dce1fd6d942f60435
GIT binary patch
literal 2120
zc$~#mU1(HS5T0|q*fc1n(iZEYY{jE!OmhErH_M7i)HI7Rl0=0xAtdSDB%5Y`(wn5&
zHrXwr2!beu_CZhted$9HMc@64AbrpWU!sM+<UtV&HGRpG>CD`{D+vi0ig?)h=9@Wl
z=FXjS_MXk62DU&2<i$xXHIy08RXJ0vgHARxnoacwjcThpTp1k5y1{HJ(eDN`&bT|;
zKMEl5hr**sgl{b@l)=KXqYUa{BhCRx(BL!J3}1qRUFfl)5t>jp^U4;)Hk9M=HQU|b
zK$2M+T-FmX1t;J%oQGf8z64j`H@LRwxp!b1?T1C*AE+Of=AXa}`~|b{0{(_Mn1?r@
ziE^<4YyT8wlh`7*2`_SoSpHr7u^Z>BL|D{`II=d;DIC<PC9B4Z_M|9?Gvcf`Cw>;s
z(f4vu+^drH4>Cg%3(1&V{>cq1_?M2a-Z5^a5tm2gG1)15<$z2{SLS5le`Z{1oLXhx
zGx8UCL0*<u<?r(Pd#Y)r(W80V(bC$x#7}5>?ITzZfi5+qMhumRsS#5pTy$822=PGI
zAym!a>0(gR()c)(Q!tbv9zbb8X+>#4F^n`~h=7?%U?&kGX&-C?&euU<I+=RR({_p$
zahS<*b)h6dYWrSO*K78nryk`n{6s|;5cZ>R38q1&XH!{S2MHSK5fPd(Y8j)1rp}xx
z0fmN%gbJmXT3_y$+3J%PpX~QZy-yDN<e*Ou_ymh{0^RKpsD0bX1Oy_~#+Kr{t2%Oz
z#Ud(3)I@4~)Ozc+k%l}PLTY+6jMVUGlqhm+TpT{e)J;%XvFDSjP1RrMfA(s9HwNYh
zUnj2*J^J?P@a@#I^qtIuY++>jyJ>fNv}f%8_^t2nPTb4g{Ndjp=O$;TX7U#cZ!k$G
zZ9^o<NZVr<@T-Z9<Mx|2BlpeZ7Mk2=llyFOi!JW4#qk!$8_ixT@I)orsrMPm9(E8(
ztZ2-R;!9A|x?8>8Oh)r+pBiIo=y_G8cJ}R5mC8~5+)>4cbJ7fj@@hAQ=onO^T3t2h
zq8Vl*hq(rGrCdap=0YFk;zgKh$7&YgW_{oS><?Q&@hf2Qj`07v#Jn#9{mWquUes&x
z*5Ae#wpesy((GD1yX#;B-qWAsN!tny9nhph$1ylw3ynG))nT~LgyC-t6bptO6aE8s
C{=Fjr
new file mode 100644
index 0000000000000000000000000000000000000000..da344e0deaad46bf6dc7d202e42f5579c3871263
GIT binary patch
literal 1766
zc$~FWO-NKx6h8Nkl}VySg*sR!y&!G!{mqOrk^ecQhMIyYlJ@)=b7r(rb84K4AOazZ
zpcX+9)TTv*QTwbWh!(YIV+Czo6j4yNaiyJe-@FlJ1S2}k`ObIFJ@3AIzjv9N$BH2z
zvLVVOn}0Ak9(EXxpfM?EfiWB$9rpJXObm|sF!2wE9EPtaIM4^c@P{reL70^-Ev3U!
zN=t_d*oI>O9MWJ1<iQ@0U_VxLsD(O=_2S7!#Aft1I3e;bFu*5R074>8z$9FR%Ww^D
ziu?}Tg9q?v#d~KUj`{0E?G46v$?^9v3!h;QzQPZfhXq)KG?u}#aP8aCb67qrWM=0+
zmU=Ii72&vpxmY>#B5P(H%)sbh_0)JGkFXe<VprHzcAb5}+P4*b-;>!-WC|zd<Q|^-
z&6R7^SKE<w_N`@JevG&B4&KfCxu1u4n8*Hc#<lFyU(P$lZ}40EF2Bzo^6CGyrnQXO
z%(%gpWm`{wu5Gt%6J&zDQyP>;6sgxEji^#@2n*T(g4f=86hl3jG0{}Fy59>K)C}o}
z)##PzP3Vp2iV{F{5(uUe=spB@zyh5>%-2qBGNrP|jJls55^bvJD|h+`{Cf|nvRrZ)
zD;4MsaDf&bL#RR*OHdU`&779iSwm1uuW-|dQYx^FP?ZH2lz>`YM4YkYrZO|EWj0x)
z(IQnAsjx_cMQSWkZ4q3YVee`Id+D;0y<m5fjE#xCOXXA^^SC7sQ5C6fQf;}aBXye8
ziBvVI3#nq#GNQ;)I4^9*sq3IP`@mL5&cR&yQ+Ha=<Nk$#U%u(Vx2Hc0J@bDI%miNz
z$4263;-UEH$+4H?PtQJ|coBYb?)Ulm$lT;?^mc3!C+VQi;Pwfm&!fliUlWBB@~gT)
zp_?isRE5r}&{-1_YeHj9^lPGDsW+v-6V=;7+6QTNmw`yGm3j0s+ysf%)kMmKNt1}`
zbVj8jDWb@-9F<BWSq+mwsq1>mdg7dF;wy*~mt^MIrE>^2yh=9Wom42U6t?0&oklmJ
px?3O%Z<3v;#V)99hdLSBTcNEKYGpVs!%&Y3L#GsU4TcOA{s2h!TdDv6
new file mode 100644
index 0000000000000000000000000000000000000000..1333f2d9f7d1d5965e898e2cd2d6c0c8d3ace0ac
GIT binary patch
literal 1808
zc$~FWTT4_?6kdBzlv$QWNi`MI<<M0<XP<MNk&(QVjd%&Wp(Rq&XwEd_H0gLtoy;y)
zR47Pf1xip4MG!?r6oC)*6g~7Cdgvi~>7kckT5F#<nxardi?hD{t+m(Lm+x%OUd?n^
z3z^Wze2z#c+TN8DJ{9uxO6uwi#e*)2UH(YCsWs}4H@N~qf2%)$k*lpK4#4n1mzE;T
zj*`hVNX}|$Pz=kk4}ilwSOKeHJt(jhGX|7_4=SM+`C({63_%NYL!TV!91OxW$%f&k
zZ12E0+=qwo3|`520^Y+1_%v<a&+rA~uc_QOY`;(T|A3#s*#fqhWwC6whHYS5ST56X
z?H=?(R>Jl$tFnU4z8Bl}V*fsNgaudxSvyOxL2QR+yfvDN$Jjmgm_1=n*>kptCzDI~
z?^T(T(Q;%5WK_!=rqxVYV2=Du3;to<Ty~Pjcn9z01N<_-!AJOQKK_p*&Sek&a@<G!
z1%J&a_&ffQfBH{rn#(pitah_QbNorY*HPkF02$z{S3*imQyRTWOel@5n9!RM%ANHU
z*i?emriy$s>&qdXiqVUN89~$nkY+_eL^XhX7kbH5&O^Bx^lEfXYe6&#BohQi5W(GI
zgFztYtfMlOLe*=vMuc9HWkS{!$vMo(rb3~rc{?#vj9vw2X=4e5Qgpc-p;2hXw8Z+|
z1Z6aZn|d^l!~#O0N-ik@mF5#M6O$XvNVk_+W0Pu|l-i`&CRH}sZIfL#!Nmof4g10A
znNqtEoNki3I<<GDh|+PdTk#SVNDYhXQ&|J4X;BlYuxLI~&7uWFk)v?sun>p#!S>7@
zSvf0nSE<*J&GQeRxZ6Ay916WXc`<xGGSG4%di7Ky)_=OcwZH9X{8Ia1$Cb{@UFW)Q
zof++U+509jf<qjkkKhhUq>p1H@V|<(N%4gtQK}}SfI_M)q{_M!SeFXxvR;?<TBRif
zp1H>Tq<oY{&!=-lt`~TX0^9;g)=)#bbde%G!ZiDoZAy=(s%oE-r>LTf<e5Eh%$iS~
zQeA!ndEO?Ob#mzxf&(v``FMM6ke3dd_SdK0`Kaw;Sc-Q|HfpgBO6tI;Lft_)<bg63
S4yX|J3kV<A&~*q01pETH*<6eO
new file mode 100644
index 0000000000000000000000000000000000000000..e3cb2a18dac7dc657aa0206bc531291732ae12cc
GIT binary patch
literal 1814
zc$~FWT}TvB6h8N^l-Zv~Nx2nUG?0}#b7$6F*-Fh!OAY&x{6TD6H+S9jr){k*+l?Ry
zqKA43qM#6h2n73sdWf>DULqoT=;yH>dWfKWsE24f=g!WWqF_XaIp6)xxo7UrH<!72
ztQeL-HpJOhTR7O=7b^($1l^Hik~<CuqX7pc3L*|~IO>mdd!v4bFW`-MeHb|o`lA30
zA9QIc!qQPPnTbA`WkMM&z&-#D8L$ZQU<D|Uj~N3hp$ckX5Ar7PBL<-hjzC<FbOKJn
z8OhGUdD&isD{vLA!!5Wc<6(FT&*9a$c|XD@j6bJxU$7lb_kV|<z}ZYThvl$bwv?@8
zt63q_Su*KHU(d?f7G_p%W0UX2vhCQvgEccB3nS}e33dwGvlHIBkcuy}0XE2n*iCka
z&F0DEJpN}@b~;*!tU*Riylq^~nE9v3PqfZy)=gz$9^o;b;3xTMewLr-m-xUxjyRQF
z`^#|$`CWdWKjzQ)OaA&lt!XM#Y-XEp({0nK-(ah-&4jsNZ&89uucownlwP5<M=+sx
zAXM91wqa8PW}7Oinpj^ASyYT(Dx6_N%?Fug6hKsc$Scsx$8v7U)uY#;Yg!kglRz>-
zU<43cT^1Mwa?VC7Qz=wEW^07$C0Qn9U8$VI8D6zssA|zh%#@+m!g1PI0$~%nT#nEv
zG-Fy~%VvT~n!-grnp<KCp-?54lz>W$i8vGK4bIK7mRWC+I*V+wNSQ@yEwb4n6&At8
z`RuJb!R{VYyB+K<lDaOnccqllQIAXU5EV!blj>tx1F6%bPNc%5#Yi=imJmgb!d1g8
z9J&hDX0OXBSX{V7eZM!udt?8Pj<12C;ET?;p$Fl2T@SmT^dx#m4va)b4z@)f_uW1;
zeE3o9){)Vp-}*lsdlSEu_=STs(`Rr6B+}<G68L9D;iUY+kSKK%QbHkh7E)(jN~}wb
zby=^=dacHk0#9B0PSU=cMlYt5M6Q>3j1t@giPl<A%EU;Me&KY+l{HGgrmAXODN<As
zBY`H*8<XZ!=Tw(pL7uoYGtVxaL$Kj}GXw9imGa(U<No{9I|J371M~5=$we)eLwO@q
asnEC^8r)E+!Y&m;UIC$f8oCZ4pMc*zbY$KD
new file mode 100644
index 0000000000000000000000000000000000000000..9a428f96e180cc75c0dca31e8b133771bb193031
GIT binary patch
literal 1822
zc$~FWT}TvB6h8NEnEhB571dU3(LjIJ%$-?xWzB!nQo}4slc;Uo+RbsZZOt{^jp#=b
zgL)C7pb&xxf+&J|=)tmjiHPVS=&>Gph@g6?hiE(J&d!>mU_^&G-~G<HXYS88m$^$>
z5iEyXNU*IAGaTuR=b8RkuVk*Sa4h7)FdWfbN1_%JF25NIMkD@M&=m;zqy7L!u4BO%
z0K*4eTAHv-luBizPh{Cp0`svCfWtIc2uoolD6keY22?^7)WB}!%@9NkLpyXsLXLC_
z`d~n^OE4(gD{vidz%9534`n<I&)@~T9y9L;_=xeRbnY{@-!lE*;U{o5oy}(R*dn%!
ztzv7~My9h=%8OpeO4$}>Rc>Pw@5Q$5*uR7AVF6|$>tspRhwa62Z(UBu*Vqud&F-+f
z>^_^tQ>i)p&#K%^v;bM7jGFnrF*TzWoFqTq4o|UeGBbIU$9a;U;r;v~ALLj0&_9ki
znce)$ac}bn{1Jb`pYvDz&3{_cWTrT*cCABqOr?Iaquenaa=_W5gq03WY4s@`LTQa+
zLO+C1?QGeGO$}IWx~OV=eKpLaV)SC+HW9S|WLr@PQ4Jt3M=u@Cc_~+qUWcw}?TBsy
z$pnEBLh!WPU=YYTo2X2sQ1w}@VbV*oOvt)oIfvU^T_{v_QxRrL&}-o&Z7hjUhAx*Q
zGzzVlme^83P)SpGs7LckEFcuB<dPClX+9BmGPA*)nf5a4ZBl2GGMkjxq}C=CHYv9W
zE-v8Q+W=1QsM@XI^pMnb>Afq(l#cm4ijSy3YFJbs%^FDE7Ih;P7R^VhS+syCaulu_
zX5i3Ous(Ogyu8I5m#FXdPxH?@_~X!*(4Fwh!{^%u%yaFhBTtVcJ4TN7M@NqBi}iJ0
zI6mC<IDWSK+lj9|?|a`St|ousAbaRDctR5C^B76|v!ZZPeql(Ix(O+vkU9&gvo0mp
zrN+9f*JZs{V@ZLhuC;-*kI?A(bdt#R0-sTUn;_Bl){`=E(xgYY-3eu#(xa)Wnou?=
zs)&<76X%Ty^XYS{%da3$T!vX^m(C$L@V?2yyKI%bci5Q!KJ{jyy0c*}-ZqO+ixp7X
d1XU_D?Se)xRI0F3g*Lx{wgVcv4s8JezX6|3WlsPA
new file mode 100644
index 0000000000000000000000000000000000000000..65d418012ae2bdea33a3e7eda450ec582870ab59
GIT binary patch
literal 1770
zc$~deTSydP6h8mIp<T2rDyr=&4Rljy{+V%CR`Q<WCCrk%AYE2Vb9UFf)SB)_5D3wO
zy#$d^2tfpbWkEeenN}|m5j}KytcM;Vs2=Je+RpiBM^hAxptF0v^PTgb`7hu8?5trM
zU>&4Dgqbd@CD;{C3-p##+~^MlJ3>~|#$X7k6>0}y_(hi%C(OxWvH1|2(SG4)8IA#P
zm<KCh4Qv7hwqnJAA}EG3*pIvxnh;wc0NoIgGo67xI4{`+xG3XgxC+<c28_TxnUBH~
zcm^-0tos2zV*V*!`;771#Q1mk37jReB({{TWNTR}+rrYBj(hi_XR|!Ei`ku}Z055#
zwj0OyusY^v7P2lDWqla?r#*Eko?l^uY={lBTkH;7#AC6={LikGiEKHtYMIsY15<h?
zt!b9}bUQZ3zS+#;?L5q*{477m`}svazz6?v#@X!pU(P$k@ACV6j6dZs_$&D=-LU^-
zip!33U2&@`!<7ih;I3C%lr~Li^eJsZX>7-WeiWg^U0;f!4D1+hDxTh70t=}bJx7=p
zqUMMBcGirj`jHo)=S|kURI5a<K-aVYqDdf`ATXK{JOKv`0=Z@lwW*Y<K06u~JtW(N
z?8}jBnAYZOp{f}>v672k4yWm0QG|SSxgDWVYUi}Y`a*&tTEasknpa{Lp-?54lz>_@
ziI~xe112wYwpr<r3Wwx7B-bJ34k>g<fkSX}es@C^xV@8VH-g(kQdh*!uH;a;)8|oq
zL<LgArut;nKx*35L@I2WiBz*`7E$CVTnQ||sf%HI%8sRJtI}7i?+(s8bo0oMqhFeb
zTb>_#)B3=A8+aIe9E!G$A0KZY?>Nvo)^+>D=*dUnk?wD&zV^KDeH|Hy{=!M>=x6XW
zOQfI2h~hsh3Mb_khD52GkP-^1vyeLLQes_dtjm5~_G@Lf6nN_zt4RAG&7Mg&iCoX}
z8CiG;60M<<lnIk2J;F32$~L7(Q&lyhWGJc#lRz`qjT!4x?kU|laN(;Z0pClh@)g6T
u{KwO10xFpVOJEtS#B;BQyc#H0p=KXcd!a~$y(+XG63}{BL)W3zFW@&SH(rPU
new file mode 100644
index 0000000000000000000000000000000000000000..84458a5f466e989000261aaa75b6582a945c20c5
GIT binary patch
literal 1810
zc$~FWO-NKx6h8O9P>ZA=D6A=&q8IdIzIWdnXJjf<GesQ``?EyMW+rEvAIBL@&1NE8
zL?A>#ZE7Jz5VbLkpf+V%ZK6f1ewMX}Hc@U|jh%DfJWWw3qQji;e&^gX=iU3g%exy{
zC2WS(kY;<8XgJ>6UlI@dFG%L>3-^SaVSlI;U3aE>6NzLnl?n!&XS$Nkcvrl{-<wPY
zQ_e)Pt25aVO93$ap-amVW=AtK1u(Oy6~F;li*o=RmccsM2wOmf9hfnp25O-Jjw3$-
zLBue`U;xsx(<QhJ!;)Qtn{vDbBXAe)!x%h~@i@GKH}G!WbF(vFF#ej$eZ%ql?EDl=
zLlzWPzzW$~R>X?gHnx+M;@VAg58KD8m{oa*Exs4q>T%x3j<I%@#VEwO*?G(iE%?`P
zF22rgun~5L-DUS!7ITdMUZu=N`N-;I)X1CX)y!GT68VMJ_J?&#SvwE%2=C^7Jk5vr
z6@Hc9_{WY**{#3qJHj9EQT~`e<rDn%e_GR0R-{<tCS|+wC-s_ArsP8*I9k=Pn$XpN
zS4{{tki>-1iBRWgt;eAOtT9(qyRg0vR!}i|g>Xd?bw3nXQ3z4<Bd<oUoXdGA*M#mv
z*Yy~pi$F3#V1^LfF&j(*`OFq7(<s!u)@VlQPqIwNx(fLWS9IH6p=qW2G1CYaX;T@5
zDs;INp;KtZw7k}X1U1y&O*6VjVmYDEB$t$cO3R42GP9d2TwyP<$tFIVRN17_CI@X&
zZ4+FR-_h0#4$qvx0dTlUU0-gyY6Ycxyl&M?R3J4iYRqL#q%MoPkP3^IA=NEfP82z6
zRR_zlbuH{#y?aeb(Vh+3r&G&19-f)*{1F-rzdidQ@+|r>_B{TwE0dV)o=i@r+IuE?
zADtWTd(l5OFm?Xt;O7hP)3-BOY;uy6cZVd>8!<EZF-5(k>cW&L<q}dkA>|cPUPCHt
zNNEjOZ^(MR!IA<GTA-OEk5l(DIy~e?xz{YmO^|49O{7deX)-8WuC%&S9n>{VORJ@-
zCi+RB#q;K(`P|Vo<Xe!3Y?fKam5!c*7fc@BUt8rx!{&YI0cZ12+?B8j@0ax`MKM&i
cK&=KXN8qRjYBV^kL8L=K<g|`%K*TTL7j9E%qyPW_
new file mode 100644
index 0000000000000000000000000000000000000000..42df50d3b45aa49e8c5ca07306107085afb8d205
GIT binary patch
literal 1702
zc$~FWO=wd=5T0F2ZL3wWD6~Nv#RqEovu|J0BvkvCmQ>T0QmbtZmByq^Uh~_eY17t3
z1ic92MFc_g;6(%xh2lZ*A_#i%;#u(ELA-bnK@W|yo4l5m1S;Yt^UXK2^LA(EEpHo$
z28UoDWXUHQ(PQaM^TPZUNzDFuEESJTo6{*h7BpWNMMq#dWuA#A&B3HE5z_rB0D^xM
zIf{fBRz6<^`I4gwx?n%f0Z^!b1JD3RK!FqJu|glX!2@H+Ctw;;hbSyTR<3jnZoo~+
zZo?g^@4*9j1dri4tV;Veyn%P{Vbi{!;S1Vdi@tBDzpu~#fM1Y@3Q|q>kUCON8i_(I
zgkkPB6esB*E>ehelhU;q!-MlfWQ<G^9a)mBkn5;#ZF%Z$(Y{X}k|*RTc}CXqFVMHT
zDemRE^$OWfY5gWZOYdA+#=mv!+Gbq2QA_J+J#C~4wNRDX>1pcv#}&(sGk>}65S^fx
zXn=<398LeHoXU;2#r@vXkK5XL4SzeK7EE46R}!icXjc+k2_(^>1rhp9-m|DYP|(F7
z_tyA+s1d;^o!k~dRQ*s@utJE;kKBdQz2S2R-!RG`n2s~lwkU!sfD5pO5bRL{tODeY
z;}|dUVNuk3#Z*K*Bcr$s>y#VVBF9c~##%ej(}gksS4CAhgdP-`3s;3%utk2}UIBd~
z5xbaC9TJ@aIg?yc0V1?b5L<4&y4o5e%VC2I8l=Y{T?QF2NUuR$2EpX~rpXa7IW}4y
z0Fzzx8CUFwYV^CoVrgn>Zf<E|Y--Bqo0$m)Lm^$CoehU0k!Um)i^mg*xw&LAm71SV
zrxz9$7c-fqrRC+ENco~@l|3X;w9uNvPahU1Tg0srWo=xR$z?CN?1d)VpvgXHGG3GM
zs;7`H9*e+;=ub?n-X>nP5Y5?cb>bTmg-s5NqB7$6tZ<txtDIC;RK{3VX;m0UzgEU?
zE$J^DB(EkrB@axI?Z7Lb67Q6w@+u&kzQusEmDtMNuorKDgINAy=pF|*gYi)~?|?oA
S=NN>29Kx4X6b-_D4u1f48$<;F
new file mode 100644
index 0000000000000000000000000000000000000000..8656939f5efee9a7970f87f5092a1da1d84d4bb5
GIT binary patch
literal 1788
zc$~FWTS!z<6y4{Hn3<MFNjVuNUC17K@40uJk+FQI`3SQlABfp#zQ#vBYD{M$2!!av
zeuPLUgdhUJvY<YqOsk)Wh(3CJ)<+)^lppmGO?#g^S5p*>Xmj^EYwxq~d8~W5C!Qrh
z0>pry9k6*@I{JJfMGQ)kh%CjI=;`d}>GU=NFnrLZg$T2vU@!uLOIieE!Fuci;1C8I
zAs)7Y0?C*$ARh{#7>**Zf=0v^Xor6A%aP8(5L}e(5{$_93S5Kha1$oszKo~fDLjW)
z3+DX@pD_L$%6-9hcCP<B`~=Qcu_zYH;@B3J#CEV0rsLXO=ou`V?Pq3X5nFmMmL0_Y
zL#&#4m={?e3$P(<hZntdITT-IV{DvFu-oh|Tf>9FwfxVjn7L>JvI-eh@wx>y^VYab
zezCQ#ux>f?@^0?q0e+re;KO``kMgm99C10j@t5O{^LzXOpXSf_OaA&lt!X(^Y-XEm
z(`_rM-)qaYt%7K<*C;JYm!>qhl`f$)bYntqLMXJ?6k$^gW*aIhSX^HSkyMPHDI8uz
z%>xl;)QqTlkmsUj&*xl}D?=|u*R*y-2Z3aQz-UHrwp(Bj$T=&iOr=nDo2}ucmt>ic
zb(wMwhj)91P}S6Zn8`vffwQ!+074GBT#nEvG-Fy~O&&o$P2r>-%_T9NP^gkiN<gJ)
zL>z&+4Ms;=%Pg}<sYP-ul4X$+i{x1(*CMz$kG-}W?5=sW8^G=)sY^q9S28Kx>vk$`
zq5`R5Qhh#aAa$73fmE0@4XI|*bfU;nxI$QsLl?lVnBB2^Hl=J<-yaLBzjfkA)7R#S
zmKUvW+a7w~wLj{3(i!NQIXTlk(^J<w-FN5I)al2*$^O|h-v&MmzVVL+e&Hb1^ckGZ
z66y080sOO~a8iC@NR+w>DWQ-$3#qd%CDx_Jx~$h_y;f{Wfv2vaoV4$t(bMQ8k?ZMh
zBONzEqScm>GCtB|KsX$JWv4QrsjBK%QWaJBNT8+j#*+EaIo0J?kSA`AnP->IA=vP`
z3CEi%NnSf_!GE86!%^KRSckVw9BQ!@vMZrLg~}sP;evb>4y({sFQDzXhOR@KN5F4z
C-dcG8
new file mode 100644
index 0000000000000000000000000000000000000000..4560270ae73401e2fb7afe9744a1f1574a712097
GIT binary patch
literal 1785
zc$~FWO=whC6#nj=ki^s^MkrN>prKx<t;YB6doz<^#EJQ7LMOqHHW(YE#z}NyW+thL
zI-1O=h~mO_5d>X`P(=$aY$c^oN~zk^LKj`vmM+9i7u~3fx{yxKxi2r#kboi{a=!bW
zb5G7Y?|YZIYeX$-u>yG!52S~(2XneUJZZ=}V)eOo$&u{XNO}+u^ha)NmIyy87Rymw
z)XLF_m9z&)l;BOQK^+t}P{u_o+K|8w;yW=&ID`z2Aa6RIz)74j>@!T6^*k=(3tYoj
zxM|{V@jY(im*<{)4}Vd7e>V4k*1zZW|G`82i>EYgsdz)wh_^(ocw4+fvu`4|MOegy
zR~Z+Jzl(3pwEw=?E_y{jvHfC9OwxL4!GC=|8=n*B#bt3-d?~IAA&bQl`D|6`TvS0U
zVWRD_=ee4B>sunf(00FI-BPwkres!*%cJtRJT1@4DS6=)J1%9HUb62Mc|%Ui@8l2i
zuKe{i&9syS1Kzqeup#gw^-drfC_^QJeQHRJ+G-%CMztC^KnZ6bL3^<816mUB*4d)A
zh4t;I;9~N)4y6h0B+9)gMQA07H<NFh&oywai@Xz6grN+9&7c|F6hS28gUeu^*NbYR
z83s4a)n;Ftg1BiMO0VCdEo<{u$~2O9;26J6fuM=p%%E)!y_o0fYhh^R5hA=}HyDgE
zYRhm#8MrjeBvhDttI7(0zAm41`lQJxjXvq{NsCXKeL}+}gS)yBY?zmL0Ko|B%N?zl
zZK*h?$72x{W2%X|9(CrkF42%jLqxSl!$fTr%P^0s@hUY~tzrnaV;S{s!+R?>)@)i;
zzuNk9cS--vy-)T%Onp7{+x~mQKc@f4+{*quQW%~2bmqX!*eByZ9sK6d?ZbC+(?=d3
zeKhf4^7s73!hh7{WBv}2ltKPJZh?MJNjamxb`2Wgw9!x-p|ug(F&aBYWXIGyrru6?
zTF_Y==w|V=+&#?ahuw+B+$ep1R&7@oOOs<!CUhv2SMRC`+p?^@+N>;{V}%yayNl+{
z>7*x^&tT5s9J9??wXF;gpi8EVZV+WI8?oS);r&w5cR3y0m2|tTrn{^T+j`Mvq4y*7
YG@#W&tAh_M4EJjc@3F}p3@0`I2YCiqwg3PC
new file mode 100644
index 0000000000000000000000000000000000000000..7b9db46710a79b30d0ae3249bd6a58351a1a5bdd
GIT binary patch
literal 1789
zc$~FWO>9(E6#nj=rqlxcAu$L8p`bSrf%d)o-pq6|hAI8AjV+-83B{&?c3PRznQ7^d
z6xtau2EqbZG$y!cNYJQ>3$>{+F@`{)VB*5HXk3tPT(|)jvLKG<+&8b4rcE%$lb-K>
z=iJlt&imfY+|6PKwx9x85f7yLGh^erI$W*8lZIC%1~VgrslKYyHG@?>i9SHkAGxst
zDTE@QFF}4qD?uGL&>kRBgcq?H+o7<NGA^3Xj8+^WeiVI#{Yc{svZm8}cpsMxyMigR
zUc)qQ;8T2w854hl?=Xk&pLy;B{7Uh|LT-W9-xl|O$0PiSr!;!8SSu>UMzK}AEMBGA
z_mJBnEMmf|jEj}u#kU69e?uG)9ip4qNiiZOX}z%QzpfVI55zU`k@!S>CO#KJ=JQ4J
zpH;<+Q7N%j6CIF;pQ%~0&Q<cu?f7%nt!6zkDKm0Zo|Wh2MR{3H$q)Zy$JOlmzwG<5
z{6fykZ{<ySU;gkv&9s^Y1KzqVuru&H^-drfScCNlcB+0gWUJno8q%tFm=ewjf|g+C
zo3ymTTMI?a%j;WE%Ejby9ZC_}36ywIlF&*JZy?{dl&j@jJNbT;5r)zPHiKqxlLV2p
z4=#gwUI)sFrWxE6SDSrp3gV`5DD}$g+Olf)Ql^f)4d?i6as>6{W(I9@=*2u&XCp%s
zj}YM<yVhWoQCo%^%D|;zCZXKoTdgnk=WF-LexKC)q|PU8K56txgHLF<M6l~1g0)K$
z_aYc!eYv9*vn>_p^k^)iVoWtr*Q3r-)+HM9Xo#rxXqc$2Vrk}4HCm?n%2f=(7Q8^c
zo3X26cjca!syA7`953pgdFRQAN6D}He?0kM;8yDA^zF>O!Q9aNsrljgkz=EG$G(1d
z?)07U*)xBfeLS%+`BQc}_ZKyJo4-ROX^_8<o1@=TQqJhFU4uqAZ8X$IXl;acjK+=;
z*)jEwskd7_E$FQE9%S(|+&#?ahuw+B+$ep1R;{a@r5R^YCUhv2Rj;WD+p?^zs!^66
zXN6YIyDR3+>7*x^&tT5sBD2j|wXHM|pgU#_-5|=`HDcK<!~4ag?>aiT8|Ze~gspVH
g?CU_Yg^ssyxE4(onj9RmFwm_r&|{N37)WUR4SQKyasU7T
new file mode 100644
index 0000000000000000000000000000000000000000..c61f69626120cfd1c7552c4b22c451369117bb85
GIT binary patch
literal 1788
zc$~FWTWm~G6kX>`Q&q2OA|8_l;U-??-gEDCIvFvgs*MtjN0dhBi>Z02J}B)BBE$zi
zM8bzi5F|d(5Q&I*6^Reu9`PZ5eE2CJe2B64xxF2lHX&kX_Bw0tvuEFP*Eut1n((6t
z1xSgAFW!>u?6Mb{J(|oQHY3*DmTZo<1A;!}+6IX5qD&?anPDvtWhkUMKq3c|Fby+d
zU@m1GRG<>o*hqX6nh9Hwz&@mOr$ac5W15}7DLtOSIb6UM+(566@8BLD;rVaReT{b%
zzaPkbpz-72{3rC|E56febHx}jQA`#^VwRXgYcD3ZM2QFsw=yDze;3cnX?}%RBWguG
zv7Mq_^w4-@$hS@o#HYm>aZy|rSH(3UWG0g%f33<LjPi+9>u8PK@LNsR>PE;9wQYY`
zH<C5Ts7%TZxnCZXN9A#ON}m14jw9LmzwCQSUYEDzU3p(VlP~_$nnp6e&mE`x=KB7m
z-u8ujqc9HsI-|vCwTz~)(W;E5HcHq#2&(*bD`}{PI}Q|84y~_3J{OZmR3J`hH6qWA
zqJ(B6@pAH|*<2~-YRFe(JYgU~U@<5LCrS`Zc;GPT=hb2Y(FB7N=W0E#bU{Qn4#a0K
zR;IaV31!O2SK$D^O`2dCxn6^^ICNuPSKV@k3SL5xXRK0<Ax33tt|<eTmM{sV2j6O3
zzPG*_kF55{GLMvbWR*vjd!*bWw75q9mbLJgW+iTdKgjxWM>A}hMugKH;h+&_s)#x+
zwX<1=XuzcbqROQuL@gtnU>-6$#v9EOj4=FF7)`w^F~4BJ#NsInr<!lK<<$3X|F)w)
zdb8!_&eyRA@i&Qw$)~&0t$n-u+WOkJc0B34z30*1$6dGfecAuH`$NyG)VcHzYO<O4
zAsE%j`{ShP|CE%|`YT7H7EWmml@?lQp>3_PtwpwVy{+r5YF7(7YfWoe{3LfT;q$|8
zhr&*Xwx3noQp3`8u_)at5J(yGjBd*`&6KgoFjW^TG<@C}Hm^@7Jwb1SK8J(M(r48&
z6M&B{nNf6u%+r^R&^Jl;7sm6sr0-ZdxP^4POr@J_CO2J)rM0LuQM(=+N>O2=!p1ri
Pv3iAAgGFv5)~N6k&)HW0
new file mode 100644
index 0000000000000000000000000000000000000000..4d54c32496bcca1fd0b4b63f16fac412b8e32ede
GIT binary patch
literal 2285
zc$}?OU1(fI6h1Sv#<prAm16D2l1Oe%E0(=~dw1Qoo955W?}jwd*lNfoo8R5LyV-0u
z*)$1KM4<{+6fIO=1Vwz%J`@pssh|(Os33wq^g$ndP!I(Lf57#ebN99(7Omj0=bLZN
z{pRe<oEgqOaTpH3?T{0@0>#yGX`P^{G+lJ(bE$08w7Z;5mGZ@=*0H9C=X2@&O4EtT
zQfb;f2q5r>#;r!K4#6iwumko&^*U__w85X)14szK9@q!>;7Sgm)`o6KKtG&7J_?T_
zPH==Y;~XqN9!ktN7|*~{@C>r&;CVQY{cG?hT!eS{+XwI|_dmfe*#A~r$sgE*s8$1L
zJ4J)oBZ8t?+$-)ErihBT=n{Qm2)~V@JtD@%l$aG6<ax0q%Hn#v+1e`NjCdMVFNjyf
z>)5}&ZN|IeEB4$X>*ZatQSO(`GA*msS?Me0r7IWZvaGOY1M#BV8sU<xZfoz$%jo;?
zZ~lL7AEW*g`T5mZU&<@;8y<a&_<ha)<CdsD%ikraI(4hst@f(@szn`AAr)3fRJ%&3
zK{cXIstGltvZ|<7)uwtvomJ=5i|S?ds(M4cr7o%W)Qzp}@(t?z_L2HbeW9+Xum9t`
z|D%0Z`_CWLuQetEb%C4VHVB^5=Cy*ZrDIyb(9%V8n6n6p;3=aQ`#!YZYpMsgPe{Nn
zQlrHUJByEr$sBeaXvfh8pdQh75p)Cx1(rhsi@<Sxuv}=s&LuE<S(Ob&=tGt~tT8OY
zxIITeZWbNIUZ+tJr+bre`EiF-dd!Sjv2eB)rVXv1S7~k{w4+7FDX>mMow3FZMwaOo
zqs{0rMi`^44-vAP=X9cliLjoIA%!;S9mg>U9;Gv+6CChKyHDDD((jW_pLF<yg5Y2C
zzHHtZ@6_e(^WOjcBq%~$4~0TmKV6Y)iA`gYD66!*kQUbpVXYL?wHQ$YspU~!E123k
zjva4oA+@!bOFXKT>b2<xEe62^?1W%)1+9X%jJAlj1QQdf)XdE6?7~7Olg+wrE|<?2
z3X6-y;?h#7w7gs{udJ-DRw`?2r%$i1Z)|MRVV;CwYkTluh|-4RBrTD%Wwy{oAr>L#
z5Euk$N(K>|V2a$FQiH_?r^w)J8JtpsQ)+raIh`i!O;6ANV^}SGS;qOAFq(`Oqs{0r
z^5xQ_e8ocEMPp>W!Fq%BMwrpNjI1|VX>xp%^`@sc+juUa-shzaA7gr$cA5juv@uoN
ztQn12QI}sK4miF1)_m5ASFbgM6%OETI08xtK^5;N%zr)CqTO(3ttK@>GqMA4AB4by
zC>(<hu7X1_0%KSOCoqPBI!t#x+<~(iv0k>qVbnf=m9!g`!>D@<CSeY8SRdEmad;BW
z!n0TvUxEv?KHg-T_gIpX{@aX@hmX_Yo%10eOLA^$6ed3(qfP!P@5v>}R?$jmWwat3
zAA_+G=rSSG*<lle5eCU{)HT>?GFptDC(P(TCXpO487)SeG0ccxdnjBFh3oGgK{_~A
eL-Y&{KV&l^AMPRl=nxr_lmVGZ9SuWI8SoeG%Va(P
new file mode 100644
index 0000000000000000000000000000000000000000..349701aae64486d6f36c9e83d5bda049ebeca87d
GIT binary patch
literal 2497
zc$~FXO=w(I6h8Oeq*{NH5~<cqDU*_GVoK}0zxiRBPMV)O`JEvqCAJbWnMo$e%*!N`
z$zLavMG*vbp(x@)H-aKAw2LBAK`Q9NjS3>@qKGa;bfcgPbupfE-n=xVL95_p&Ue3a
z?stFBeQ#c~I0X;EAy^d6^~H^~(n&p-F60ZvEpq(p^QAez9`ti)#h;(g&G=LE8>N||
z10e8+#-&DfT<}N|?t~*y-KQMFRzJ1?Xix`-p&5?jN;)uN!#Rk<5Ilx_9G*a&;t?{8
zbFcsfC^4@vUWTXOS!B<{3-B`5uftn#1>WVh58*See}Uhy{=K%6KWSc3t=6F(6piAr
z@QD`DCQb@dL_|#Vi9wOXwsEw_#iU4!tjHlRh!wFW_S?<wvMDZ$XHfN`cvZZC^*eid
zyeGcq$lY3l_MmoDJEpa08Le8)YMx?VbF^h`Romo91@VfudxWc6bx(O;yN<DsZi)YW
z`2_W!YG3U1`bxW@eaGJSh(FchKkpj#SM3iC<N<k)Y?4RhG1)3RWIzVxY1u8~azu{F
z3vx=%%DgPf4Y@6!luyg&<V*4u`I>xFzAdlHYx4HicKtSWUinylF29sF<hMKhew3qi
z|89)`TCUaR`JnEH8f&V*zy1!m7kn4hyjs##CaRVUl__Gt%p$~n7mWd|2hj#@svh0j
zAr5zu8ZBnnd3>0d%wg4ob{1_I8W3#<K}QIozzUJTA_zGiSPnE|<q#MHtjhbs)R3nL
zYYdApX3r5&m_?mf>*N)&yW1I;9}AI6kD5^{8qC**=|UUgRhruf-Du%S8dxV+XRL99
zk!8BYXfuWw!;BHu2M9ULeR|P?L|9M9kV2bwkK+vZI_V7Q1cyD+?U62z40)v2BRw9W
zL2zo`m(4rlojSaI-upkF1dR~W1A#!^OIP@2Vl$W|$|@}{pkit%s7g^?MTr_nEtl$Q
z$y8hDhg{!6YOAP2JfcbsYNk;|!54>v;7hEdZKAEBEu*c#)Kn@pJDbfeEaY<eyyGk`
z779yC%ge>$%1WuUy1KTuzP_=sxq0bQxxBSisch3>UI1Tvx9{Nqr49WAEs?Wjw$eo*
z7A6)VFbFb~3?eo`n!=n?gT)4?$lz=loKk~RYPy4RI!)G_uAb*HtX94(lYC7WO-75+
zW(+a%<<cX3#RBd{V`RO-dV}>wkkP%2tT$O{^7tm}O;>MrabH4x&`ldYjG0l|=^}8Z
zjdX3ZW+ZAw9H4BK!xi<2DhDg7LzT^nI)ObiUW22ODNI~8rOJ9mb*hr3X4o^?3)Vb~
zJ-y}y*)v@)gQ>rD9_#;^hu$hUY|I<>v??(*12`Y*khhJtA;oiX_EWaCw|T;H#Hj2j
z+woCs58yvOzylC~Z}7u`z5wd+d1!zpj2(p*{0caMZ5Bk}4D|4qKoZ7a0>1>Nu%Cnj
zc;y@5K2{%xb~shj_QC)v&!cV{W+8`P2`jKpN#f*oxi5*twD(R5Q-rTkh%?T~N0#6_
zO<s`Ve0^++r`=agf@}k=gtmrOgtHScF$R4m<a&E-f*`^O8G3yqy)I%fo*1?nk@u6d
npQJ<Q#*mIo)DR=d(epMV^3i^Zk0;5HqzuSS>u5Mz+JL_RYwM6F
new file mode 100644
index 0000000000000000000000000000000000000000..355cb6e110cfb110dd03de15544d29e72bd39f59
GIT binary patch
literal 2427
zc$}qGO>7%Q6n?W~3gst}iYiK7RY{eF5R_zhcGo|+t<(Gz=hsn4s?d}uiJdr!?bxxM
z#A)InRY*vb0|<mTz@<_V;s8BV2*IUDa6m{DsX~H7h2X#eE+D}HIGFd|dT9~@6fyGq
z=9@R)o1K|A<2fwa;UTDpC2_-7D6f`Ul@mzhGP%MgwHj1gur1uMwosaHD3@jn*#_)x
z<^Cdoz#kfy8WB5M>==f-;1E>zC?Kj&BZ3A#I0%Q~7|x^xl@6SS7!1G@$j9Iu;uOax
z8RuaUa!_JkVY~p(!t=;pgqPq|tS`e`a0TAwz7OF#*FV88SpQm^$M3*julmsTi+XWT
z_(h|5ShNaDghf>Jh<-7QePd`(ib;_WDUn8=6GgEq_FBvKvMw%&i>P{8ye{6r`kh@7
z?}@M2bB|W1J*XYgj%tlsQma-|nx|OMvf8q?qOG&1f_O#SKEhS4x~qJkT|?hTfARlw
z`2_W!X*d3i`ck{8eao%y5Pzuof7~|e&)RPq$bIr&c|abLM`e?2k%kP&<FZr6<d7Vd
zXXTWflNni%Ww|Avk<ZB&<SX(uc}c!0-<DV9`||eYcI`HGUinylF29gB<u@4j{eO)8
zza{2#>jB@z8vE3D-FGM42mT3tLC>3dGNR{|o-CllN+HDj6RHpEezd+@s>gQ+#NcjH
zqeYdI!K=h%9;+_2Q)q)whv;MxOoSi`>>vqjf?(DIJB!!cKanL+eXPp(L)4KW4{MZ7
z7<J|e$jzb?Sew);V7MEM(~ky8Wk#%s9SLM=!*rkx@GPw@gif^3Bn@m*(`2l1#mF+#
zW^@>Xj3LG_>kUG7b4)i{fC%ep8>Z1_-0e6C{u8u^w1a~l>GVj4M+Q97?U62z&>;9}
zUYElw<CSK4`Mmaj-w7HaY8r--@zNE#mDnUEiLy%5GxVsQ59p<csYi$^q_#^<J#Xoo
z*bcgF8>yp5vc$uBsZO7**CXJM!G7?^*U;9{R?wEwiZC@bJv}#<N-Zv?)0s>*yR?+c
z<@3wSg+j4dDy^)nuCA?>%j@gs&u?sOZdNK=w3%nY-`wec#GtfcJ5E#NY*|foP>6+y
z1ql>El9EBhAxMy$Q>s|3I7N!Hr8uREQ);<`ayl*6TdtnJqwFR=ER%dp7%fJd(P0cS
z^5HVWe8dd*pfR#uv0kxW1sL7K$a;&F7LRYS-g5O;2geec{chUuGA2i8rAxq>R*BkT
zt#HH+<DGfRj<}b$keYdn(zu}<r=qv$8*~aPdb_UL)Ob6k^zVA?y?gxU_>SW=_)Khs
zD*AD~WbxPZS$3HL_JzIvR_d`rczRt`B)dD@-Xq*JcEsB|<D2mgH5>F+13Ul*e2s5B
zz1?@<Nv?wf=sN<9_<lc%eKv&QBy{l`J`AHUj&JxB#!1+RhqVswXZ0~?hPIlv8~RXr
z26Zzq2WfoYi?Bx9%W3IwuXlXL`!@-ZhYvuIbH!;x7U$DQtpNEs@ecVD?w>@Qtc+Gd
zTSY6tsc{$|g&qsi-CYhr0AYv>TRlVFE}}CQA9NUz_mZ@iqywi%kq(X55Iw^qXB<Z4
WBfaDw8zw_Ctsp&PqT$yP3jP4(aD27^
new file mode 100644
index 0000000000000000000000000000000000000000..91ae94737b89bcee33dc382ffb63606b5b5713c3
GIT binary patch
literal 2425
zc$}qGO>7%Q6n?W~3gst}iYiK7MM;%~5R}wAyKAp;Tc`Oc&ab18R;DRY5<77c+p%Li
ziPOY6R7gma0|<nAfC~}`aey8wgy2#nI3Og7R3X8kLU7;!7m(lp9L#%fy)+2{iWvEQ
z^Ua&@&Cbl5@f;Q%@DMb@lDOe3R#wX$j+4x1^TkbSG^@@~XSjK7p*-JQDbE&j&5qN-
z-6a5lKQu0NB6hUcF$#CVA*k(9642FDs{v@>gM)Awj^aGpQE9_zh`|s%f&2`dN1WpL
z6yrQBLLSP@tBe=n8F&ua3-BUb#`<-53$DPs-1i||=lUo31?yky^Y|TW5Ve{QZNF#~
z2Zdj>h=)aoFhy8IMV}ZHqu6%_?MX2yk|HfK$n&BkR>fXx*<RMgMR5sLFNs&h8(6=y
zE8;!z6?^W{8ng$sBU+QzqNTK2Ev<Qq1uds7Yb)A1d#Z?6wCy8Y)oQ!S2ii6Cee@Uq
zKbKEX|Cx5<&!{i8o7%VB`VR4jy8p**qyDV@rh(ii@0ADSA=xBbWxEW>pgb<SWlWC9
zad}Qo$vK&oMOl$s@@e_3d|tjRUy-lLH|5*%s(fGG-rTO;rp_xL%g^N(@}~R-<G%lo
zvH!Qkd~QADyHsbN`mX!#g!{lhp)cqKLr+EYg3?n(beL&`n14bIU_FR7a7*?0?tmEF
zO=`5Lva@)Vn9O6<gLVpS7#a}m9D;!mLV*<`fkhC?d0^%6lKUre1Zsd)S-(RaS@N((
zS%gu0o`BpeI)Sx8ts;iI!8rYBh*U<zj98IiwmwW3+7Qpu+(PI^b0%qEgPI0oohwF`
z85X0>7-Do7!>kVwvYTUi(Sk%+Punn!Hsfx`N${VbJ)|8R_DHu!x;!%EkzSAVc!UPQ
zPxHELUKy`6$IIun|NBnR2vH*t2xPr<Ikys<!X!~vX?g)YsuzNKIb!G$q6(?yQbRA8
z`X;tRZreg?>yaGsuwHJ^XB+hh_+zji{P8ukb+i?<Wwa7ZO-)bF&85?ei<wL|o69XN
z<@1HY@^Z0QDwWGCE32z(Yn96S`h^P{8=ITe>K1M0Iq<i2`yUBV+OQp`DRQ>VRyrue
z9AY5?MUbLo5U~l8<mQwr7AsDX;%q5Ssp6EH?x37bll7*n=kF-1l@H4#9}`BC(PFe2
zLyUa5j4&UufP2swS+7{HSg(SN?qOuT$x4&QH(77Gdb5jT35`KFZFm_|W3<vG;7qGz
zeX(XZVukU}JY_}POIu9OJVt5UP_|vw+w~1P1y%i+t~yoX7^U>@daS*B{O9?O<23k8
zY&cc@xL!8-Yx*p^j3E2MUVjJmm=2y^R~5<a4!8CQHv&82t)200c!$~o^i~5r00H<K
z-*|ev@4%DX00+=_1X}R@eiZvG2*XL};WvB~#vy@k_!P!T*oTL;0q$q@QD}qCy0#Yv
zP<a-0GcX4keBVp3M%&A2>2j}ke8&4Xamd35AjG-iv>}W0X{1(={G523{7LsuB2HF8
zE2FKV72#9@664TkLZ-LJCI}*okYTHDq}N4s#^S>^Bl3Qd_LFqz^f=OyL><vHI(F7(
XL_XF}{xhRwNTwBJW(+j^T2jFuXQ6wM
new file mode 100644
index 0000000000000000000000000000000000000000..05474636f9193deb9d38651e5a114bbf48f0b8fe
GIT binary patch
literal 2145
zc$}?OU1(fI6h1R!t5r-;DV46mw)WaYsqUS7?{1bQ-TZ7M|C^?15*wRlf0A^Yy}O&;
zO*Uz^g@ULr^+gm)AKI6S7V$+y5qv4As30Qv;8UN(hdxMO6coLlbMD?!Qm_>q_WR~L
zXTO;{GiNS$uZY02pr9mvP}Pm~`k`#5R>(C;hU<$}w@}Iy!<btPcg%)o3Z;Cx5k9(E
zt1r5p00MsqZY^;;gg{KdL+~Vc9)N@gU^ncA{rE%=+jEeBZs>(UjE3O|@-fc8%zOe)
zLLLgNtIQ2(!g*A$!5i=<_LtxaybB-jf1kh?-2VbMvHz8|=iS2oH^d))3_HXl;xVyD
zJT0CPo#I8|h=k}7o;QFP664~im=SZRPl}va65c&pK~%*Sx?U9*#5>qu-ZtVr@ik}u
zME+X{spL*MBt36b299w#DW~OeInS9a^4s#x87@k1Te~8!V($IB^8emGME^(f)7zsy
zm)GT29DR%YeJlUt9kc!<Z^)nJO?gZHF8`8B?NaS(w+g9!>YzHLEEQKtHK0b+5jCSu
zsGKUOvRYGH>b!bgT~KeSi|VqvzqMVxPhZfksgKoX>iT~i_5ZXl?|SMt>O1uyJPM&X
zqhM4_BcCuT+Q?TiVJ#yKhUWAz_9KYl?XE$1m@J5-c8d6(usDTXKcW{g25rcWi)13j
z&|t^NU=zjMfNU4qv5UCGdYEm+P#67Eqzs$1O`LR25mA~=-PoHHRYP;GKNuICjFHPs
zSP453Ew-lVL5%V;t#e3yh^~2Bnn|H%HZ?OFOq<zZjxl#J$Jrkt<}{B<A)+MMPbZK;
zWc`yk454m1K03UyK=cKoClI57NCl!l5Htxsns?;zo_LQgZ=831?=zqol4c|lDF&6o
zBaTrOX-yF$X;h*{Jz*LNk{YG$OVg-WMib+hAKNG$BjJ*c8}&A0vE4{OXb^TmDBVD8
zBGwSAh#D*`WHL)j%gd)vudEb{u3IXV%azLNYPDLc)$40(>+6li#>VF6nKN5k&F0y&
z=ja5FL#U%K)ES{FVVtHVa*3=1bT3GCk%|#%qC8cAghQ00G}lqHS#w=9mq>FRHP_Md
zC*>Mi?6-VBKS$dK_=fO3(aaXJ&FnD8nEksHpXa;5%%e2>HTyODb(ER?n*A0#EuP<E
zzvcU_9v(|<j`;5%zI^#f+Gz>6ygJv~>=+#wB7$EkfISd_8~FXAFV_w%aT`32xu;+s
ze!ZT@|7?iEVd%%N*C<TD6wJaauz=$f?8GXz!4vG>4;}DA%bS8>bWWo$3rny9WvD@e
zmdfkx@h^Ki8@yFrl;M+!@g{gbsM1^}ilUU~6LBb?^Iw@XVFOV|tRt$>I}5W@Fkrz-
zs^1}sB8?L;8W>OcjLE_Dn8S>Eh^#|o9ersE<@juiF*7ka?J%RB9HRWO2?C0YhLx;|
Jz^COj`~wd6G;II?
new file mode 100644
index 0000000000000000000000000000000000000000..8cf3cd9d92123b0d5507de4478318704892e89d7
GIT binary patch
literal 2229
zc$}?OTWDNG82)EwjcwHpREo7*N>Xw(tyK2h_QKlkHkZ1&Zb*|F8wuI$=DO$XZgw}x
zZkyzx2!i^cDB^>C5ft%3`%pymrGh^AqJjweP(&YmP!I(LFAwYg|7TAdV$li?`+f7x
zzu(N6nSX{kBrJFU+My`+1uFIR+KF7rDOEN}cGTu8?s75fbj-VJPPSI6baYR3JhoiS
zmo_@iHmbFG_ZWb{AA(Cu+-QO?#$XQ|gyt>E9!OyvKtccxz#%w_vpJ3t8_qx)hT$yg
zNq7Qzmiy<KmtX}-P-DHtd<mX{XHh*5FTl%KzXor@6?ljL`v5-W`e*nR>)%`R_>;aX
zn#}-WuV@zsL`Zas2gM0tinvIMelaA*@V`mK<6=hS#G)vmE{UpG7q?o=&e9N<#53r6
zQCt?UWBvB79`A~;IC7T^%KPPEc|>-~ylgfXrSDjlu3VLCvcZup<STOL2v=ouS9xDv
z!`O#^i~n=^82z8f&u{elQeKzea_c+fA6oIBc8vOq{6m6jQ+KQV>YzHJy3}zMRuT1x
z>QQMmswUKVHLDhsqbjPdw$+pBY4x0XNxh<8Rd1-b)K&GKy1ltwyG@^8K2o2lFVuDQ
z&429of0XZA-~3Vi)>1Oi7Pu4cfzY(Jtd(^wpU}#NmakyITtrHTrj0?YhY*7|U61bW
zkcNHaMkEc}!K=h#39DYjX~YNwk!=@AM~b4siju)1in=~oE?)J}v`b_Rvdam@=nsb?
z>@h6jq`gE$VK$w_TBlY8yL+8+`pGD{^n{tP5)r30ObRi~voyDndJwT08d#^M&fL-l
zGuw2F*=CM1$C%^n4-<2k`}83qB-l^ekVVXS+i?m)Cut992S<F-<BOCphJDfJi(X&Q
zAoyusm(45VmAbrqUi-iA1dWi?!{M;wrz>_dv3X1qWtFBE){<H|qSX?*mLO@Mv^=S6
zWmDV4cGPQIC~Ym_l8$S&pf=yGB_NcBy%5T5AR34@#44f+v$NUk!ouR>%1WW&IIdeP
zmP+OF>T0D@t=4L5YwPP98})jlapA(ni<_HUTidjm=ONVH6FL^Av|&3#Q{-%!U35@L
z#Yjbo45B<GgM>|#qcEq`V6(v~GB{fXr_|t-n%<zCPLutn=jZPjRu><Z89pY=CbPwC
zGe?>EaOrVAVqx!~F|*%bzrlVZ!t5PJ_M7Z9d3=-orsp?P+?QA%^3sNvF+WZ#EdpoS
z$h8)0#uHZD<y(jiPA}gzUv=Zr>ki`!2XG&R;cI**>BYMP^B;u$7&{D|`071`|5*@+
zQ_#yV-xy556ux}3*iS(lrZ@=qvim4>!^16a9}J@N9Qx*90SfpkR$+tY!HY?Gmm)Lg
z-@zC~c-x}9LS8JY4Cjzq5sLG6*%Z%tS1UuPBWj3sL<LSy!PErwn^5TMwTU7~qXcaA
zkM?<t!E|QCW=1_g)&a5(pP4{8I@Mx~jE$eOnNg1qP<(QXfFf%^VNOTj*K!8@1+>FV
A?f?J)
new file mode 100644
index 0000000000000000000000000000000000000000..b122aa53304a104c3ca03acd98f6a3a98b23162b
GIT binary patch
literal 2251
zc$}?OOKe+36utAtKwBWGfbyv$<V1boQd0T-{K0DN=12av(xe!ILJ~X8&(C%o=VM5+
z$Oa@35~2%)Kw{G_Dn!disA5qlq?<12f=ye5D#4-)SWuu+0jcKR`~1=<R8S;FzGu!{
zpF3~v+!@VI5rfB|7INYNPjPX+)R-=hFHGi^i2F)oMSC(glJ$+*bJ>wnzUcF(e9uhg
zGWiAH!SZZr%--$G=X_2GfWRLbw<=j5!a7O97I+vcw`f}+j(z|IJg@_HLIbYs3G`Ud
z2JO%d2aylJ^N7P7pJAMUDab>K`7+}wybP})djsBtx3E77$KfP=%Kx2#^W0yBYuNu@
zUB{pFT~Voc(6)+Nu|s%8y?9(S3PVIhOtgwFk;MN7(4G}TA}z+nH1fQd74za&xom7@
zu_|6g)e-ToIEMX+O%bQWMfTjS)F_WAb;_eky^>KXm2t&YOe(fAqs%E~_ADcQrfi(y
zv{KpB&MN27_x0cW|J=So{RQQ_^{DTaE6Pti`Wf+B)&IwaS#KyFxlL}D56U{(ApLT$
zH04t=F56_c?2{=uBr|eK7UaBKlB@C+`MNwJ-<I#mWAc6Zkvt_&%Qbm>Ydd$FI=7vd
zm*i!6MgI67<NlBKTlJgQrQ&heJ)Z5JyWn2%4yu!CK~pnPwV<n+B07w5gm&+s-idt|
zTIWsG)0+d@VH>H@V!D;ZtHfjiyJoZlXgyGaXxRuFLI?$Bhy*4<$acZB@!ER_Z34ZM
zRatMC{>YMtHM&U{vnB}0&7ytSYcwiixD$-akA+C3MUAK#4Q8v;#L>EWmBtD}6IytP
zCe~=EF;=<G$TH1jv=~E-Va5pS1BC46m=?4k5!TZ-jG&D=+p!<K`)Cho2YX!7<dV2c
zx?R%Zl4h6CB=~90%i_#9Q=8N0-2Z(iXoi>;2n4cjxxzOKo53PcRcUzvHKrDVYALFz
zQKC9h)1jJLFw`X+hn%sA)Ka51@rYWgQO9c4D0tgpD|izNXl1lHv>CKn*mL5^4;qI8
z-wu05K0JJV{OZKXsf*K}XD``b<j&?-3TrcK#kJWNN?*-=GJj^_%f*k&zrOg(OFt}K
zSbk^a1}^M5@cNs)y8~1}+~x!=mg{Ehq9a2rOe{p86J)3?L@a_dxw*JHi*+uR&UMqd
zxH=cta3<x#8mu=QJ%2|xck!_q;se8IFq(`OV~CNDnHJ&07I2OnBkOh6>#Wy<jLxxS
zy}?R@=QmhyIC>+_v4mQeQ$W0ynLf%i2V8SKT}{@AM9qlJ_YntNXufqW^W!1(2k@-}
zcnAV;8DC6#`|iM#Py_d&uMX<*{o8~8nGk{f(9CaO68a&9Z{RS-Nw^b>T?6;Cx&i#K
zx2kP{PE;O3-6$M}X?!1NVS(1c$;6%Okr;JvW0*X=Z6VH(lSP)`8qz38e%>yN{AuTs
zCCC=hN@(+FML3XxR6n#DFx}E@5d;x>$#B%#+u|TP+Y>z&Bk~TCc968YtsiM`s*31I
b_8qbqk@t0we;`SQWJHJQQ4I~hme%1fl2cu1
new file mode 100644
index 0000000000000000000000000000000000000000..2350014d89e1535165ea963736152c6c57c99d02
GIT binary patch
literal 2269
zc$}?OOKe+36utAtKw5+=6)GUEkW=-Qls3rk=Z~z$Y2uXpZRJNGRfuD!i5oxLah#7!
z8lf&=K{tFB-Ov@V=z<1;sxB%)+aPrTLTpe=g+M}GzyhhQKt&+Tz4!U0QK+CujC{|W
zxpQXT+_^KJdNBZdU>oGcc28+(q1=?NOf6>fP5D$gyD+&-E`NElWM}iKoPW}u&!x(R
zlE2aE_V*6>pU>tqg+>2BWv)DF`-_EAd9S~a_dC-72>hXOsgd<2tdk_v!4puuN2!Ar
z^aCj1fgMl}yKuG7pvQtk&;dO#fP4rJBaZX<4C6E$g#whBA7?xPufa)VZ@^n{3hVda
z46MRA?z;$Ia(xqi!TPt_I)10`ifYw^wnc0cJA_X(h^Ix9FhoSeM7!t~N$eX!dqIqe
zw3rez$O~dlEQou>vawXe3Gq6r-WKnO_pv^^X~cPPjXe)5Ugb$;r}C82pk$P4bxLs+
zS;banm3gJYp5ut;m5no8P^z2CW#tO`KL4BlpUYRM|5~}eKI(hrhVm1)enz}q^WWJp
z>mQ0D>!epcChMhN?veYYF2k}}#$}gG%3*m}PRMDQmt}cOz9L_hC*_;+lsqlpm1pFt
zJSQ*6OY;8KcI7^GZuvr9mEX!6^2h%;?*AyaYTx`-g2!Q7Jzmd4@Cf)u)vQ|7)J#+@
z>T0Hh4r2<T!#ApTVcm_^byxM=<^dhBmDFf4-OAxrVls_Y8`?p%UhpDXHiCu_LV+0~
zfk_auT`+C@EAWll1bP>%a=tKi<jBJs-6V`z(*)#Z(E+SAYL#%fGZ>d23z15T8c{PE
z%+;o8LF?gF8Y>8`XyGxMSfi%KSmQb)%QTbGVhk~c86&I@5VD)c#L<F8SWnxKLYr{5
zqZxb$Xb))zdtK7%k`|ZrxFqh9HkZ&O_-T&I;>b8so5SbW|9vNDhL{!z1afY=!gmv!
z!6Z>uX?X!PrWS*0IjX5qqB>I3p_*DW)MadkoVJP7QlmEUh+6illiSoN_&Q(<_!5g~
z6|{M@S+qIWcXs~=O=E%U<DS%qNA67BoL)V8ZRV5QH}<Fb&k8HWwb`}O+T2U!%kv*E
zTwJ`g^ik#Zv0E?yuzYppPh8fE;A?F4?F~@+aFY|XRL+{Qn+^=IFtHGUPLQFb5U~i-
z<mS}sEY>+yI%iGi)asmC!<m%RYOvmL^!y#&+|7q(jE@VW!DupCj3GuoWLkueTEIDQ
zjI7sLud`kcGCGHn^#&^qp5I`-;pmMP9!scoJL$tqndzrU^S~L`)3soYNYsqjd>gUB
zY34iUvPL|DjRAb=03L?`e24EPy?hVgIq<@E^zDQOeEs%ep9v9YhBkfylQ0M)_yUgO
zI0+A8s=e?it9L;oJX_Pop$nD6sGEQzFoUn-94yj0IG7gaawI0)yBH=9Z(E2X<Y18{
zIET~<lApKBB7fSsVhOS(v@+TPS_ux0z{nu98!!`Zvj~C+ePq~b?~6N#&W=Q{#fZF<
oq@5(~IW&m0Z={CkN%jw0jL7>t$v>1NLz2>AW<o>5ucdYP3-RG&a{vGU
new file mode 100644
index 0000000000000000000000000000000000000000..e0c77fdc0fdcaa7ac3b8fdf4ce560fc1e5e644c4
GIT binary patch
literal 2227
zc$}?OTWDNG82)D_#<pq#m16Cdl9U`xE0sNS&e;oVyJ;?UbKQ_8H8v8m$>zFyb~k&=
zZkyzx2!i^cDB^>C5ft%3`%pymrGh^AqJjweP(&YmP!I(LFAwYg|7TAdV$li?`+f7x
zzu(N6nSX{kBs4q#?T{1uT8g!5`9!VYZj$IIFBaX^Tq@hK=vK0+a=zHnJ>BuxYA&7M
z=r~(1l^5M(00MsqE=_Tx3BDMIJ#Y{jw<vp{2jc(|THpX2f}=Q>;}~(^3?yI#&Z3@z
zCy?j3f0}s()*ugM)?3V%;3;?()${NIyo~j0@FrY=clf^#;8U)DhF`J%y*ZCR>ARxQ
zXhG~1?c#t4h)(gKI3X+%6>%{jhQ&DkH-&gy%!&oEEHbF`q9m%~R%_W=>f(}k23;?T
z%i?vc-`>^ZUGWu1?victetB3Pk)1Lv8;xb@J65GD*JVZ4IkJU(MeZEos%-2k@5^f#
z`|xk^e=Z-R{}cK7jb2~M>+)M}eTV!*Gyc<#QGbztNKmcnZna+>R7X^oI<A5$q#jYd
zDxt>Iq&lzW)RM}oqN=HF^`v@QJ*Qq$uc%km8|p1}RlTQfZ*JFa)906u)Mx4obzOb)
zAN&0u<@@G0e^kFUm27EkxfAYzz>KkK6ig!>GYZ;B7cpQhBP9YedI;-b#L!LGqq{pK
zU>~^=aqVRBDzR9>st<7*F$!(Sj*Da>h0$P#$zT(OU7u_hFM43cCDKFe$_66zN0uV&
z(Kd11Ss|h@n@(bFQmcsFz0NrOc$i#f%!=8uP_{Wt4`PI8X>B9*A|kUiut`mmxv4cX
z+f19;VGc7#n4|0u5_6dQ^dmwf*iYM#Ld<*HaS8$_X%A@!M}5)jiymK$_@dtzeZHVU
z@YB35hgZfcb$R)`_J7|A8X;~5gTbtyuE@>ArZGvBRhnMVh#Q5FQI45LjHE_sd(t!t
zma&QLu-CRxI!4ST9W}~r#$vk>gFpiILLj+;s3R(fbwml~=2EGprRC+dwM-_Pb=_Pp
zpDz^F*Neqcsa&p9s@08+TCHBcaN**`&CRW?ZQ9K95a{j=91Bv~u$`nSa<;54Iw+(f
zq{2j+C{4*A;SeoQm{Y3RtT{!Rv!ywunp0|dgK|18_FJBxzoYFgJ}k3*OqeZZo7rIw
zGxOmxqkP1I-a%t#zh=K?zYZ~bhmrjjJ1rjHV!!42tsd@6Yz}*A!^@bSpq1u;Gp!ez
zi?yOLJL>W+#0ICA@0zc=@#u92@r47p4}$PDK9ls~-GTXUgZ&sg44wGuJ%s<+5QS6F
z$1mSFOu{t2d~?`OK`W-X4en+4QRs$;o8EpHLgzX3&BGF8@Kr3q2F-&P)8k!=<h*|e
zBNX9n3-bzjv8a-qLu!R6&fDcse8Ia~NkR=#MpO|+I6V#1lQ3XGroYc23L%XVur)B&
y?=c1w$x(+H^&nXX$vSdo66M%*lQA+ran4~zJuyh}sc`~|l!nZ_iNLQdX!r}u@=PKC
new file mode 100644
index 0000000000000000000000000000000000000000..895f0f679d490cf5c2f23eb5a8f1df3eb46caa2a
GIT binary patch
literal 1587
zc$~eIJxo(k6vzL!5<r8XBqYj<T4P=m`FdZatyR7X5rqN@7(Sw*lz!3IQu@J1`51I@
zanVF$G%l_#PEIBc4#vg7!O6kF!O6sgIG9+^y|0g;;9?>-J?H$+x#!(;?|HAco}EP_
z4k6A8j%+9s4yV?xjXG6DY3&*ux#S$zTiOigVmy<}2Tf-#oJq!0K@(u&Cj?CBox_^M
zFe-5b#a%`vI`Ojzl%bq*j^a3EG>FV*w9{M<`pFAmg7kGvBZ4_Gn?f3S6o_x(wus!p
zT|6Lqj3;<X_8Fez1zwh_zAD+*WZ#tdE!lTlyLyig_=r#Vj4$|#P5hukRj?{nEFLDQ
zWA*F=vocSy)2x;4b{cEAY3>~JvjH|nbc01%n(WGsCvJ+!J<|8tL-vS0Vc&>1|FZIT
zihCT}Bj+7|=J<C+{?F)h4DL~-(SNKnu}AycK4wZaBaXB~nwmrf4nmre<8oS+XMJ*7
zlV>v&(4(aKq^Zkf`eE7MlKOCfXOMJgE|dNi^o$V`UX0ieDIh{7>0y!ps!6+&q*Sgt
zRK@V}OpSX6CpRZuxJlHIN!Hkjd=;^jCgwFtkZ6Yu3ONH-@eN2r-6Xu2rgHBJ$yJgO
zUemR~wOeS9&|a=JMX*5rOb<aD_jvvgonoj<?7@`Ug^fuUAocQQ@Ky}l5U`=!hE5v>
zZ0NDUZv!nI5(iWi)9#!HlAE`duc*i!a=J~<`Bd4*Q6<zZ)Cdg=bwam=2BFJB7ojHm
zlAOJAu38S)$UaDY*pJ4>rl#iRmKH^so(={hk!Um)i^u2Y5((2xCR3^T`E+_=A(P2w
zbGdweadByBd3j}}P*`1ETU%e>;N6*obf(*Czae_33oTgX-;3_`8Q!FL@8pQniWgg=
zeRSVepcbmQl=%f*ES7EEa-jKg+GrJh1+}Q78}}Ga@`@yUfe^aJaZ$neD8@YKRS?Kx
RL_s2`Au*$p=tzV#`~q_16aD}I
new file mode 100644
index 0000000000000000000000000000000000000000..11fbb23a81590932243b2a18a47e1396772efae7
GIT binary patch
literal 1912
zc$~deOK4PQ6#o9Hs4dn|L44d|BjvZ1IC`J+=(R>O6CE{k6HNk|pd^k-W->F$IGLDt
zgtm)PD3n%gOGOH$I~VP$tAYy`r5hJ6T)A-JqN{=+E?mTO&dn8LQYeD{%=ylDUjO6F
zz5m^*TF`<fl+?r6M4>)3G#0nLL}9!#UY|b}^fq^kuX(D}C^l1|St1jFlAj2a;OY?u
zyRZ@4v9!j3TDk(P!+OftfnCtpD|vAo!eL}_lB_(=5}v~VhA}G9G1M@LS>m7LOYwY-
zZ}B~`>$rhmNZ-Wo_yd0~uX$@(-zNRnGXI<Oo#%VHi+i|_2Y85o@Gl<YDV=D8+N742
z-XqzncB&6lnE9dlNF7jXoh2MeihZIoszdb>JFiAmjr7c_iqFLJ9pN?gqxwnRP>+Z|
z{*RfTkUtfB(Q`2Na!zKI=k<(SEO<jJ^}OObXW!8NUK|&e*Bp-h8Z-L)umSJF=+`A(
zv-Cw@*KB>UP7Y^;AZPTSAaxR<UXhf;JDfq%YI_xWEvUvVid7_@fsq$ig|LexkIjT$
zmB3<XwM;k7nKoN4vm`S|%qqR-Mt`*_O5|B&DqG?<B^b2By(SqQ;o^%hI@?HiG23G6
z6v=6lZeG({WK0UC1k;SRDO@PmWQio$;`~lJMduOOL&Z2Gx@dd~qn(?<t>}tKJ|b-q
zIUJFWh-4#@i3m+ykOP`#CF)!XMv`00Gn%?p*AlwnTiR!85p_ap6LmxC5KV^ECF+IL
zBWi2E$~>(boApqW_F?4kHd<Qt?Tg3v?>EhXfx*Gy;gOMIu~ZrzEte~mYISUEe7sh>
zbg5pSm}oR6Cof-~nwp-TnVFrPo133sSXkul^uhSJEo{Fly>kSGTl~B@Y2Qs(<$tHc
z%HHQv3;LjLIC6A7BrYo<zH}6ibHqvco*!oU)tAfNHOeh>MZLSC9&gd@zKd?@-{kh^
zn||Gzcl`euJllF|;U;=Mw_qFI$8PMQuhIdyNYl3<gB$|%pijO671S|}MSOv;@C~lw
z2VBR`+&L27UjawX;FyUsJ?KrL-9)#EayH{IxC|acf+0x|uy8QoV8FqEg8>EGgDly(
r&OBkq(H=+86%0KILCQRRoTG%UpeL9Rq-bv!%7Zq_7c3IWE7*7jZ>fjO
new file mode 100644
index 0000000000000000000000000000000000000000..12ad5b33aa7eac90e5ee16e01b7224d11f7569f3
GIT binary patch
literal 3412
zc$}?P4Qv!e6n^h!Ye69x2!dYJ61(!Fk-MFpxvM9X(iU3iA1z3wqEuSi(z~|w3N26y
z1|tEL;QtRAMWQhhqee|kj2bm!3^7J9Q9}$7qlp?5jT#dF&NuVs4kf5DadY#1@6CJj
z&D+`8y}1Zua5+qZM{rls$WZ5CX4GPdfu6qhbV+AsW4e8)f3Rd$Yst!<zK;Ikl9tWc
zq0Y=~0JJ~b04+kkGw%U5!8n)>xwBm3U;!m~a1Lc$2$xVDbKok<EQ2Lb2Tib&?CW41
z;d<zU5g4^9JKz@B4SUJHA0CDS#81K@cn)5I*WgWfm;9sf5qt`tyE%VyT#UKgdC2xe
z;>nn=;{v=0ORyAY;guL*66a$TF2M$hw@_P&*JC?&Vw&tM4&!#ro%Py<`)uSvd>jwq
zi})%Y#`p1K{0zT#BYwbB_$%2M@gjEK$c2&8$jr#>$d!@Z)N^~}&w6_c-d$w9W4$Ah
z5B`#K`uZqx{BI)vbe*tczATLVHu7WS7wbhtE;n9q@A=~Nh-u<tahaGS;vy-^#bVJY
zR*D-%m*^M6V!OCi+#&7}`^7<VNW36k5pRhj;+QxtPKvL@cjA=DiDGY(H_f}$o9WH<
z65f2T+N<+gyf$yG*Xw1yt=>-WHt%llA@6|ql=t86<r(i~?^W+@@7=<<qu%tQzvkRf
zbmpjBZtYq6{_EA_G%`iQ|AX4UUpE)sQWR}l1;sECqHTVUKM?mjQvN{TcMMX8>>{X%
zwgpRwmr`4DI&1Nn18U%0lTEEWP-%J<$%qGO>voe<Nv(oAQ{2-;tsbJYV#F##5YO0n
zEG#qOz<8mtlEz9DAT(fSZl%!+O^db_hNex1fxspQHoIJPmtGT(#pcd8wu#OdAWNpg
zw8@Unr=B`nvmAqHBWX68>VmlOmQib_)?!LjV+IozlNQSi1~HRq?mjR^6&c#}oAgF=
z>+w{ukck$dkr#sJEsu9c=W+GY7H*C1{5>}1jrzQ?FmEi#8!dUGE^k!jjmo^SJa3q}
zd(0vkPy}nwwj9aR&$k1j3G;C4!7uj*%KRaEWPT^Dx}S=+#Y~^}hf;ArWlTk8z-B;Z
z$Y$Ihkp3w73HC!W6`Kh%lYWYxQVoo!rKyHBYuek_t?TOQ=~=(Nw>O>6WcvF0`v(R#
zY#1EOW`~A0ZrrqKcz9%F^X4sEwr(9A-L`GaEcGh0bct?@w2Y05sF^jBsbGv(ei4&>
zN`+4QsMu45PP1x(v=26PT}@2On3|b*OSoYP$4SR!%t6d?+_5Vt2=mh^)>f>oSX()5
zx8WQo9hWhawsP9aX)CAAc`41>nzc1+Yp1Q9wszXuX=|sgowjz`+G%rMO0u?OZOPiw
zX-lUqowjt^(rHVlEuFSoZI_n{SvzFy&}uK`JxL#&4&&=S`?910vw=;MWvQ^tyzY|s
z+}8Luf1W=S`kmI3*3-@ltrvHmww`3K!*0j6@PAQ}_A6x3?nWD8d1ujP%>W2G>nxx%
z$<GlaE0+WMD(7-j?3rf{#NcYEfEs9oYhg8XKral!X4nC{=mc{wonH>Z)9^gJ46nms
zcn>~=<8Ttbg74rI{0>Dp0jJQ}WCoo~=Ay=VbS_zn&3GNI!7l8>jW~)saSz^!58$JP
zQ;DhQ9C{-s(5Y@ROr<)abherSr7)XLR}zvik1AROOX-BQ0#?BqI$@=$su38YyVwK!
z;6B(7kHHgE*|T)2dIjEqcc`{w@ClrNFW?*ao~ru|1dhi^I2EH*-%Pv$W2o?IET<Z4
zunwCrx;h>Yih(FdnH9?xn^mNLqSeZE*#95f9h7Xyf90&@b`^csm=u#{N{s#ayDXVP
zCdH(g5-x>5AR&`t(o6{^S;Hwzib*pi_`|~+ol6Sb>+0UDd`Ys3RhSf$W=ik}%c^Kr
z(X66bMYD=~0~M#Z?}&TlRbe9jYYLeZlV(b|zpV<+WD1!SlV(a(Kt(GojzQ~kSdoOv
zL8#0^bquN{)Mue31}&Y?l7-%?N@*Z8pbTgO34#XGOt8TO8%(gl1RE$=-B2Yhh8C4Y
zZIPlijrG!EXi-_z7Aab5W~?<c)|we>&5X5X#=1qzrNz*qvZyUmw4v2R2}6s@qP9rU
yrsiv<#n7U%s4Y^oxz>y&3@s{)+9E|)G?^w1ga(uWZGeL90rcJ!r$+I$0sH}9CW$ow
new file mode 100644
index 0000000000000000000000000000000000000000..80f0a3479a187d72df19eee95a6e0f430f8b625e
GIT binary patch
literal 3462
zc$}?P3v5(H6uo!nm5NF*5JlOjCGrHS(B1dm%<i&6DQ%&J{%k=CwGpJHE!}?T7F*~C
z5{v{?g8vU1MWQhhqee|g2pWG7VvG??)DUCDXoAKBqlU!adS~wJB3d*gzU-WH=iZq!
zcW36!o2lr+^)L~h#CP)s`&;|EW_wbt?Me0Y4V!AgKu3Rj0r?7yGYx>|X9}P}u+ChK
z>^iszu7u1O4`5~sfCJ;G#Z_<(ja~?IsAU3{Ko#{{LH0^mN4OrkVGxFm%2v1&cEB#O
zAAu)eFY$A*A6|yn;SG2jj#B*?d;*`tS9Z*wE$3q<a|yCNfp`*T^SA=1VgXLanRp|5
z7{~cohD)%9;tf<*;H|g@TQNm;8V7I-X2yKB<8Bjq44=XM_!=I<!}uY7ieKWlw#Scn
z27e<PLr%zy8@ehqJv1XUD|BOM2YK!Z{Z(&Qu693JM@;Sg&`0OAIs1GPI&q%Jzdc`=
zKHubeejoZN^sA|bL?$y{u=g@?w#O84wYW|cil~T-VzF4%iWTBE(I$GtfY>7L68DM+
z#U8Ow>=&<!gW?_WzBn#Uh?C-!I4#bIjL3H;I#Zl$of%G%6LaP}<xZ8;;50dFolYn1
z3_07JyPXG|$DO^-^Uj6+mlvG_&LQVL=P30%cAmbGynp)S7`_XAl2)TQZ}fjq`|szC
zytnegO{*XuCP28!?QnaeZcEbb_1u;|a`<fo72zgt3Gq@YOU|}h{PzwOaItPprPz}x
zdKJltdMQ(Fr%EZ65_TrpQ%9v5!ZRbpvWp<vW#W+_p~If81=@;hE0%*mgBiJzdN0%^
z+?4B@(k(Q2rm<&Q7t8kPH$@|nqWRj^(P_P8`N<%qTZiY9r^@8)k3zVXG;4KsUR2j^
zrczI(L8mB3HO36a4JI^t5#3V%druo>WGL;|&1>~vk0!l^Of(6#JP|x@akM==kF)np
z;>Kvt{>QqkQJpmwW{m||qakZlWsS0|QJOWDWeq)chn^%2l3?vv(-A+rzAX@r>BX%E
zx7h7Xxc#(bZY#~Yn+!Kav`@MH$*7yurX<s2(<3urGwSyG?l9G3To1^UY{tlpyGdH5
z3K&mQQx2<FuUWHhU0Yj6$NKf1ovBn;S9f<$PjByr4Sjv-bbtTGjd$EJFfcf{Y18J-
zLqo&EBO{}Fs#oc$i?ti1X{=pDMbDX^^hSB+7crSt$~nzaaZTo&de%JOENoz1bxb!i
z)id#yu-#&o<CYW5Uc_?LvQ5YfvcpN%maHvVTUu?q;Vj23CzwfFT5V~yrPbzkNyXZV
zwH0eCtF5fIvf9dOE32)nwzAsFYID1!&)Pm~`>gF-ZQpA9R@=AQzSZ`vwr{oVY}<Cp
zfVBhG4vh9v-jj6TwCK9(HZM!k(;HY9KamU)w2_*FBp*zDZMV<W`*6sUa>Olkhv*21
zjJQRvH^*x%(tGlJkznjd_*OlPIadstchc<dq4<b<liTl`f!$W)iYntvWaG1S#HS_X
z^vtF|w|g)~_h{st{=vEZX{UFAp!?ARy3hO)qB|4aQ-DtNOlGpVFBL)r=0XWnKrP$?
z&Cmj!&<C4fD{QCR&qH+g*#|GcD{uhbgv0Owd<-YxB%FfNa0dQ>JiHVq)4gUI-D-+Z
z;XJz2EX8_UiL0><yKy59<2Kxh_u-@XRPIItl+iePn=hq%;3T-5@(9ztY#L05S#&e=
zArA8>qeZZkZfDD36|AP)S&Fh6gi-nzJ7G6G413^dc$PAIiEd;E;Vn2qxgCek;0yQ~
zzJnhqyWc_Jc$|orW0>-rfj3|TCC<fS%CQ2gunxn`(WsYC8-l($ddkxIdim%p)-0{V
ze7lU>E7*`dA&q5sB%O&&l1VYeM*n)I`%D3oWKv8q+k_9FfJrhbrWli7!A+PXlVXbT
zp~Wu=r{vjJ-M*FCl>9PQVUkRWDaMDLQBka-SVgglVio)LN^WA$AbVWM+(7(U3z#I6
zVv5;MUJ18k3Ya95Vv3bONh2(dK;tr49*5FCC{06o1j>D=PD4Wk8d{+t4V`7BzJ@@9
z)SxuP2x@fE!5ST`(ZL!Wtf63eO_^^nFenWwgA}c(t@aHD2Bkq|kfN1(#7aG4r5>?T
zk65WktXj0pHy9X{29-gI)->uUVPH@iR0b(pSAUCdFfb?$DuWcQuhe}B1B23_GDy+o
ab-MT(0u54w(m=sA9(3Lwr9$zw9{dS|+m%QF
new file mode 100644
--- /dev/null
+++ b/third_party/rust/term/tests/terminfo.rs
@@ -0,0 +1,32 @@
+extern crate term;
+
+use term::terminfo::TermInfo;
+use term::terminfo::TerminfoTerminal;
+use term::Terminal;
+use std::fs;
+use std::io;
+
+#[test]
+fn test_parse() {
+    for f in fs::read_dir("tests/data/").unwrap() {
+        let _ = TermInfo::from_path(f.unwrap().path()).unwrap();
+    }
+}
+
+#[test]
+fn test_supports_color() {
+    fn supports_color(term: &str) -> bool {
+        let terminfo = TermInfo::from_path(format!("tests/data/{}", term)).unwrap();
+        let term = TerminfoTerminal::new_with_terminfo(io::stdout(), terminfo);
+        term.supports_color()
+    }
+    assert!(supports_color("linux"));
+    assert!(!supports_color("dumb"));
+}
+
+
+#[test]
+fn test_fallback() {
+    TermInfo::from_name("ansi-cargo-test").expect("failed to use fallback");
+    assert!(TermInfo::from_name("really-bad-terminal").is_err());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"2f46f0deea4e5a52df14c438928a3a50c824b440aabde146639b7377c8cb8d0d","Cargo.toml":"08126c67fa01f4b4bccca9b0e6e7dbf315370e0dbcef0ae30b3524761e574be3","LICENSE":"7456dcea1487a949fa019cd4ddba8251aee536b52f341e2c538febad97d3d5e7","README.md":"90030ffd7060b88d38ab2b9dc81bd761585c36891d0ec0c386eb22ba8de0488b","RELEASES.md":"9c02b6142ead7f506129eac8d81c18870f634a0f5d7d1e11b5a926f4b1e048a2","build.rs":"d769fc618280ea970759eacb0eab9edb6817b526228bdb39656933df0c4dff81","clippy.toml":"30bf8b7f76b4214f38db6095061166117a3f5dc8172611fd42bf48a866b6fa43","src/lexer/mod.rs":"5f0bb66cc0106c93359553c61109315bd342c227465585c3c1848014542e41aa","src/lexer/token.rs":"588f52836016d671390df42bda0cf4f9d6a0f27195aead10ea0e4c05cdf0bccf","src/lib.rs":"804f159be0244ec5362b576045d5fc5f4ce7c1a52ef681f752c55f3c033f0cb9","src/parser/ast.rs":"2e14b04302ca454e9433d50a2c23dff30e013911189da3f37cec3f1d981c960d","src/parser/grammar.lalrpop":"60c8da53c1339fe687cc7dbc3619cd9810d2562a27371078b8a7de1bda72c175","src/parser/mod.rs":"0ba24d147069c7a80100414c6dfb0df85e39d3accc4288e292d61de4404c3369","src/parser/visitor/mod.rs":"ec4cce4e84161f3dfa513b5b40fe9d799a23f2eae9720e55105985f8a335c032","src/parser/visitor/pretty_print.rs":"791f945baf2d6d0d452870c00c0eb7c4b6ef89a30ea3ef0b220b65c5db257724","tests/parse_test.rs":"775aa5744a4227c206e7d2560f31d08fa5352e98fa84855394febc1cb7d208eb","tests/pretty_print_test.rs":"37e8b2902d30912515774de6c2e02700ba179022489c7b7fc272985cfa3f5ec1"},"package":"dc14e4b71f94b5bb4c6d696e3b3be4d2e9ee6750a60870ecae09ff7138a131a7"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/.travis.yml
@@ -0,0 +1,6 @@
+language: rust
+cache: cargo
+rust:
+    - nightly
+    - beta
+    - stable
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/Cargo.toml
@@ -0,0 +1,38 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "webidl"
+version = "0.6.0"
+authors = ["Scott Godwin <sgodwincs@gmail.com>"]
+build = "build.rs"
+exclude = ["tests/*.zip"]
+description = "A WebIDL parser"
+homepage = "https://github.com/sgodwincs/webidl-rs"
+readme = "README.md"
+keywords = ["webidl", "idl"]
+categories = ["parsing"]
+license = "MIT"
+repository = "https://github.com/sgodwincs/webidl-rs"
+[dependencies.clippy]
+version = "0.0.165"
+optional = true
+
+[dependencies.lalrpop-util]
+version = "0.15.1"
+[dev-dependencies.zip]
+version = "0.2.6"
+[build-dependencies.lalrpop]
+version = "0.15.1"
+
+[features]
+default = []
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2017 Scott Godwin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/README.md
@@ -0,0 +1,88 @@
+# webidl-rs
+
+[![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
+[![Build Status](https://travis-ci.org/sgodwincs/webidl-rs.svg?branch=master)](https://travis-ci.org/sgodwincs/webidl-rs)
+[![Crates.io Version](https://img.shields.io/crates/v/webidl.svg)](https://crates.io/crates/webidl)
+
+A parser for [WebIDL](https://heycam.github.io/webidl/) in Rust.
+
+[Documentation](https://docs.rs/webidl/)
+
+# Example
+
+## Lexing
+
+```rust
+use webidl::*;
+
+let lexer = Lexer::new("/* Example taken from emscripten site */\n\
+                        enum EnumClass_EnumWithinClass {\n\
+                            \"EnumClass::e_val\"\n\
+                        };");
+assert_eq!(lexer.collect::<Vec<_>>(),
+           vec![Ok((41, Token::Enum, 45)),
+                Ok((46, Token::Identifier("EnumClass_EnumWithinClass".to_string()), 71)),
+                Ok((72, Token::LeftBrace, 73)),
+                Ok((74, Token::StringLiteral("EnumClass::e_val".to_string()), 92)),
+                Ok((93, Token::RightBrace, 94)),
+                Ok((94, Token::Semicolon, 95))]);
+```
+
+## Parsing
+
+```rust
+use webidl::*;
+use webidl::ast::*;
+
+let result = parse_string("[Attribute] interface Node { };");
+
+assert_eq!(result,
+           Ok(vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
+                extended_attributes: vec![
+                    Box::new(ExtendedAttribute::NoArguments(
+                        Other::Identifier("Attribute".to_string())))],
+                inherits: None,
+                members: vec![],
+                name: "Node".to_string()
+           }))]));
+```
+
+## Pretty printing AST
+
+An example of a visitor implementation can be found [here](https://github.com/sgodwincs/webidl-rs/blob/master/src/parser/visitor/pretty_print.rs). Below is an example of how it is used:
+
+```rust
+use webidl::ast::*;
+use webidl::visitor::*;
+
+let ast = vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
+                extended_attributes: vec![
+                    Box::new(ExtendedAttribute::NoArguments(
+                        Other::Identifier("Attribute".to_string())))],
+                inherits: None,
+                members: vec![InterfaceMember::Attribute(Attribute::Regular(RegularAttribute {
+                             extended_attributes: vec![],
+                             inherits: false,
+                             name: "attr".to_string(),
+                             read_only: true,
+                             type_: Box::new(Type {
+                                 extended_attributes: vec![],
+                                 kind: TypeKind::SignedLong,
+                                 nullable: true
+                             })
+                         }))],
+                name: "Node".to_string()
+          }))];
+let mut visitor = PrettyPrintVisitor::new();
+visitor.visit(&ast);
+assert_eq!(visitor.get_output(),
+           "[Attribute]\ninterface Node {\n    readonly attribute long? attr;\n};\n\n");
+```
+
+# Conformance
+
+The parser is conformant with regards to the [WebIDL grammar](https://heycam.github.io/webidl/#idl-grammar) except for three points:
+
+- Extended attributes, as described by the grammar, are not supported due to their lack of semantic meaning when parsed. Instead, limited forms are supported (as shown in the [table](https://heycam.github.io/webidl/#idl-extended-attributes)). This parser allows a bit more flexibility when parsing extended attributes of the form `A=B`. The specification states that `A` and `B` must be identifiers, but this parser accepts `B` as any token. If you would like for any extended attributes to be parsed (essentially any sequences of tokens), please consider looking at [#8](https://github.com/sgodwincs/webidl-rs/issues/8) to help resolve the problem with doing so.
+- This parser supports the old `implements` keyword that is no longer a part of the official specification. This is for backwards compatibility. 
+- This parser supports the old `legacycaller` keyword that is no longer a part of the official specification. This is for backwards compatibility. 
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/RELEASES.md
@@ -0,0 +1,11 @@
+# 0.6.0
+
+ - Fixed bug where the generated parser would still be in the source directory ([#13](https://github.com/sgodwincs/webidl-rs/pull/13))
+ - Add back support for parsing `implements` statement for backwards compatibility with older WebIDLs
+ - Add back support for parsing `legacycaller` in special operations for backwards compatibility with older WebIDLs
+ - Update `lalrpop` to `0.15.1`. Version `0.15.0` cannot be used as it breaks with usage of `include!`
+ - Remove unnecessary `Parser` struct, since it does not do anything
+
+# 0.5.0
+
+ - Reduced package size by excluding `mozilla_webidls.zip` and upgrading `lalrpop` to `0.14.0` ([#12](https://github.com/sgodwincs/webidl-rs/pull/12))
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/build.rs
@@ -0,0 +1,9 @@
+extern crate lalrpop;
+
+fn main() {
+    println!("cargo:rerun-if-changed=src/parser/grammar.lalrpop");
+    lalrpop::Configuration::new()
+        .use_cargo_dir_conventions()
+        .process()
+        .unwrap();
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/clippy.toml
@@ -0,0 +1,1 @@
+doc-valid-idents = [ "WebIDL" ]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/lexer/mod.rs
@@ -0,0 +1,1260 @@
+//! A WebIDL lexer.
+
+mod token;
+
+use std::error::Error;
+use std::fmt;
+use std::i64;
+use std::iter::Peekable;
+use std::str::CharIndices;
+
+pub use self::token::Token;
+
+/// The type that serves as an `Item` for the lexer iterator. The `Ok` portion of the `Result`
+/// refers to the starting and ending locations of the token as well as the token itself. The
+/// `Err` portion refers to some generic error.
+type Spanned<Token, Location, Error> = Result<(Location, Token, Location), Error>;
+
+/// An enum of possible errors that can occur during lexing.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum LexicalErrorCode {
+    /// Occurs when a block comment is not closed (e.g. `/* this is a comment`). Notably, this can
+    /// only occur when the end of the file is reached as everything else will always be considered
+    /// to be a part of the comment.
+    ExpectedCommentBlockEnd,
+
+    /// Occurs in the specific case of lexing a float literal of the form `-.` with no following
+    /// decimal digits.
+    ExpectedDecimalDigit,
+
+    /// Occurs when `..` is lexed with no following `.`.
+    ExpectedEllipsis,
+
+    /// Occurs when lexing a float literal that does not provide an exponent after the `e` (e.g.
+    /// (`582.13e`).
+    ExpectedFloatExponent,
+
+    /// Occurs when lexing a hexadecimal literal that does not provide hexadecimal digits after the
+    /// `0x`.
+    ExpectedHexadecimalDigit,
+
+    /// Occurs when any leading substring of `Infinity` follows `-` but does not complete the
+    /// keyword.
+    ExpectedKeywordInfinity,
+
+    /// Occurs when a string literal is not closed (e.g. `"this is a string`). Notably, this can
+    /// only occur when the end of the file is reached as everything else will always be considered
+    /// to be a part of the string.
+    ExpectedStringLiteralEnd,
+}
+
+/// The error that is returned when an error occurs during lexing.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub struct LexicalError {
+    /// The code that is used to distinguish different types of errors.
+    pub code: LexicalErrorCode,
+
+    /// The location offset from the beginning of the input string given to the lexer.
+    pub location: usize,
+}
+
+impl fmt::Display for LexicalError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.description())
+    }
+}
+
+impl Error for LexicalError {
+    fn description(&self) -> &str {
+        match self.code {
+            LexicalErrorCode::ExpectedCommentBlockEnd => "expected end of comment block",
+            LexicalErrorCode::ExpectedDecimalDigit => "expected decimal digit",
+            LexicalErrorCode::ExpectedEllipsis => "expected ellipsis",
+            LexicalErrorCode::ExpectedFloatExponent => "expected float exponent",
+            LexicalErrorCode::ExpectedHexadecimalDigit => "expected hexadecimal digit",
+            LexicalErrorCode::ExpectedKeywordInfinity => "expected \"Infinity\" keyword",
+            LexicalErrorCode::ExpectedStringLiteralEnd => "expected end of string literal",
+        }
+    }
+}
+
+/// States representing a portion of the DFA used to represent the state machine for lexing float
+/// literals.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+enum FloatLexState {
+    /// At this state, it is assumed that a decimal point and at least one digit has occurred in the
+    /// float literal. The exponent base is assumed to not have occurred yet.
+    AfterDecimalPoint,
+
+    /// At this state, it is assumed that the exponent base and at least one digit has occured in
+    /// the float literal. A decimal point may or may not have already preceded.
+    AfterExponentBase,
+
+    /// At this state, it is assumed that neither a decimal point nor the exponent base have
+    /// occurred. Digit(s) may or may not have already preceded.
+    BeforeDecimalPoint,
+
+    /// At this state, it is assumed that a decimal point has immediately preceded current location
+    /// of lexing. Digit(s) may or may not have already preceded the decimal point.
+    ImmediatelyAfterDecimalPoint,
+
+    /// At this state, it is assumed that the exponent base has immediately preceded the current
+    /// location of lexing. Digit(s) and a decimal point may or may not have already preceded the
+    /// exponent base.
+    ImmediatelyAfterExponentBase,
+
+    /// At this state, it is assumed that the exponent base and either a `+` or `-` have immediately
+    /// preceded the current location of lexing. Digit(s) and a decimal point may or may not have
+    /// already preceded the exponent base.
+    ImmediatelyAfterExponentSign,
+}
+
+/// A helper function for creating a lexical error.
+fn create_error(code: LexicalErrorCode, location: usize) -> LexicalError {
+    LexicalError { code, location }
+}
+
+/// The lexer that is used to perform lexical analysis on the WebIDL grammar. The lexer implements
+/// the `Iterator` trait, so in order to retrieve the tokens, you simply have to iterate over it.
+///
+///
+/// # Example
+///
+/// The following example shows how a string can be lexed into a `Vec<(usize, Token, usize)>`. Note
+/// that since `\` is used to do multilines in this example, the locations may vary if you lex
+/// directly from a string taken from a file.
+///
+/// ```
+/// use webidl::*;
+///
+/// let lexer = Lexer::new("/* Example taken from emscripten site */\n\
+///                         enum EnumClass_EnumWithinClass {\n\
+///                             \"EnumClass::e_val\"\n\
+///                         };\n\
+///                         // This is a comment.\n\
+///                         interface EnumClass {\n\
+///                             void EnumClass();\n\
+///
+///                             EnumClass_EnumWithinClass GetEnum();\n\
+///
+///                             EnumNamespace_EnumInNamespace GetEnumFromNameSpace();\n\
+///                         };");
+/// assert_eq!(lexer.collect::<Vec<_>>(),
+///            vec![Ok((41, Token::Enum, 45)),
+///                 Ok((46, Token::Identifier("EnumClass_EnumWithinClass".to_string()), 71)),
+///                 Ok((72, Token::LeftBrace, 73)),
+///                 Ok((74, Token::StringLiteral("EnumClass::e_val".to_string()), 92)),
+///                 Ok((93, Token::RightBrace, 94)),
+///                 Ok((94, Token::Semicolon, 95)),
+///                 Ok((118, Token::Interface, 127)),
+///                 Ok((128, Token::Identifier("EnumClass".to_string()), 137)),
+///                 Ok((138, Token::LeftBrace, 139)),
+///                 Ok((140, Token::Void, 144)),
+///                 Ok((145, Token::Identifier("EnumClass".to_string()), 154)),
+///                 Ok((154, Token::LeftParenthesis, 155)),
+///                 Ok((155, Token::RightParenthesis, 156)),
+///                 Ok((156, Token::Semicolon, 157)),
+///                 Ok((158, Token::Identifier("EnumClass_EnumWithinClass".to_string()), 183)),
+///                 Ok((184, Token::Identifier("GetEnum".to_string()), 191)),
+///                 Ok((191, Token::LeftParenthesis, 192)),
+///                 Ok((192, Token::RightParenthesis, 193)),
+///                 Ok((193, Token::Semicolon, 194)),
+///                 Ok((195,
+///                     Token::Identifier("EnumNamespace_EnumInNamespace".to_string()),
+///                     224)),
+///                 Ok((225, Token::Identifier("GetEnumFromNameSpace".to_string()), 245)),
+///                 Ok((245, Token::LeftParenthesis, 246)),
+///                 Ok((246, Token::RightParenthesis, 247)),
+///                 Ok((247, Token::Semicolon, 248)),
+///                 Ok((249, Token::RightBrace, 250)),
+///                 Ok((250, Token::Semicolon, 251))]);
+/// ```
+///
+/// # Errors
+///
+/// Because the lexer is implemented as an iterator over tokens, this means that you can continue
+/// to get tokens even if a lexical error occurs. For example:
+///
+/// ```
+/// use webidl::*;
+///
+/// let lexer = Lexer::new("identifier = 0xG");
+/// assert_eq!(lexer.collect::<Vec<_>>(),
+///            vec![Ok((0, Token::Identifier("identifier".to_string()), 10)),
+///                 Ok((11, Token::Equals, 12)),
+///                 Err(LexicalError {
+///                         code: LexicalErrorCode::ExpectedHexadecimalDigit,
+///                         location: 15,
+///                     }),
+///                 Ok((15, Token::Identifier("G".to_string()), 16))]);
+///
+/// ```
+///
+/// Of course, what follows after an error may just compound into more errors.
+///
+#[derive(Clone, Debug)]
+pub struct Lexer<'input> {
+    /// A peekable iterator of chars and their indices. This is created from the input string given
+    /// by the user.
+    chars: Peekable<CharIndices<'input>>,
+
+    /// The original input string given by the user. Or alternatively, this may have been provided
+    /// internally by `from_string`.
+    input: &'input str,
+}
+
+impl<'input> Lexer<'input> {
+    /// Produces an instance of the lexer with the lexical analysis to be performed on the `input`
+    /// string. Note that no lexical analysis occurs until the lexer has been iterated over.
+    pub fn new(input: &'input str) -> Self {
+        Lexer {
+            chars: input.char_indices().peekable(),
+            input,
+        }
+    }
+
+    /// A private function used by the iterator to retrieve the next token. This is essentially a
+    /// finite state machine that matches over characters of the input. For the sake of readability,
+    /// a lot of the lexing has been abstracted into separate functions.
+    ///
+    /// # Return Value
+    ///
+    /// The return value is an `Option`, with a value of `None` signifying EOF, whereas `Some` is
+    /// a value of type `Spanned`.
+    #[cfg_attr(rustfmt, rustfmt_skip)]
+    #[allow(unknown_lints)]
+    #[allow(cyclomatic_complexity)]
+    fn get_next_token(&mut self) -> Option<<Self as Iterator>::Item> {
+        loop {
+            return match self.chars.next() {
+                Some((_, '\t')) |
+                Some((_, '\n')) |
+                Some((_, '\r')) |
+                Some((_, ' ')) => continue,
+                Some((start, '_')) => {
+                    match self.chars.peek() {
+                        Some(&(_, c @ 'A'...'Z')) |
+                        Some(&(_, c @ 'a'...'z')) => {
+                            let mut identifier = "_".to_string();
+                            identifier.push(c);
+                            self.chars.next();
+                            return self.lex_identifier_or_keyword(start, start + 2, identifier);
+                        }
+                        _ => Some(Ok((start, Token::OtherLiteral('_'), start + 1)))
+                    }
+                }
+                Some((start, c @ 'A'...'Z')) |
+                Some((start, c @ 'a'...'z')) => {
+                    return self.lex_identifier_or_keyword(start, start + 1, c.to_string())
+                }
+                Some((start, c @ '0'...'9')) => {
+                    return self.lex_integer_or_float_literal(start, start, "".to_string(), c)
+                }
+                Some((start, '"')) => return self.lex_string(start),
+                Some((start, ':')) => return Some(Ok((start, Token::Colon, start + 1))),
+                Some((start, ',')) => return Some(Ok((start, Token::Comma, start + 1))),
+                Some((start, '=')) => return Some(Ok((start, Token::Equals, start + 1))),
+                Some((start, '>')) => return Some(Ok((start, Token::GreaterThan, start + 1))),
+                Some((start, '{')) => return Some(Ok((start, Token::LeftBrace, start + 1))),
+                Some((start, '[')) => return Some(Ok((start, Token::LeftBracket, start + 1))),
+                Some((start, '(')) => return Some(Ok((start, Token::LeftParenthesis, start + 1))),
+                Some((start, '<')) => return Some(Ok((start, Token::LessThan, start + 1))),
+                Some((start, '?')) => return Some(Ok((start, Token::QuestionMark, start + 1))),
+                Some((start, '}')) => return Some(Ok((start, Token::RightBrace, start + 1))),
+                Some((start, ']')) => return Some(Ok((start, Token::RightBracket, start + 1))),
+                Some((start, ')')) => return Some(Ok((start, Token::RightParenthesis, start + 1))),
+                Some((start, ';')) => return Some(Ok((start, Token::Semicolon, start + 1))),
+                Some((start, '/')) => {
+                    match self.chars.peek() {
+                        Some(&(_, '/')) => {
+                            self.lex_line_comment();
+                            continue;
+                        }
+                        Some(&(_, '*')) => {
+                            match self.lex_block_comment(start) {
+                                Some(error) => return Some(error),
+                                None => continue
+                            }
+                        }
+                        _ => return Some(Ok((start, Token::OtherLiteral('/'), start + 1)))
+                    }
+                }
+                Some((start, '.')) => {
+                    match self.chars.peek() {
+                        Some(&(_, '.')) => return self.lex_ellipsis(start),
+                        Some(&(_, c @ '0'...'9')) => {
+                            let mut float_literal = '.'.to_string();
+                            float_literal.push(c);
+                            self.chars.next();
+                            return self.lex_float_literal(
+                                start,
+                                start + 2,
+                                float_literal,
+                                FloatLexState::ImmediatelyAfterDecimalPoint);
+                        }
+                        _ => return Some(Ok((start, Token::Period, start + 1))),
+                    }
+                }
+                Some((start, '-')) => {
+                    match self.chars.peek() {
+                        Some(&(_, 'I')) => return self.lex_negative_infinity(start),
+                        Some(&(_, '.')) => {
+                            self.chars.next();
+                            return self.lex_float_literal(
+                                start,
+                                start + 2,
+                                "-.".to_string(),
+                                FloatLexState::ImmediatelyAfterDecimalPoint);
+                        }
+                        Some(&(_, c @ '0'...'9')) => {
+                            self.chars.next();
+                            return self.lex_integer_or_float_literal(start,
+                                                                     start + 1,
+                                                                     "-".to_string(),
+                                                                     c);
+                        }
+                        _ => return Some(Ok((start, Token::Hyphen, 1)))
+                    }
+                }
+                Some((start, c)) => Some(Ok((start, Token::OtherLiteral(c), start + 1))),
+                None => return None,
+            }
+        }
+    }
+
+    /// Continues the lexing of a block comment. The call assumption is that `/*` has already been
+    /// lexed.
+    fn lex_block_comment(&mut self, start: usize) -> Option<<Self as Iterator>::Item> {
+        self.chars.next();
+        let mut previous = start + 1;
+
+        loop {
+            previous += 1;
+
+            match self.chars.next() {
+                Some((_, '*')) => match self.chars.next() {
+                    Some((_, '/')) => break,
+                    Some(_) => continue,
+                    None => {
+                        return Some(Err(create_error(
+                            LexicalErrorCode::ExpectedCommentBlockEnd,
+                            previous + 1,
+                        )))
+                    }
+                },
+                Some(_) => continue,
+                None => {
+                    return Some(Err(create_error(
+                        LexicalErrorCode::ExpectedCommentBlockEnd,
+                        previous,
+                    )))
+                }
+            }
+        }
+
+        None
+    }
+
+    /// Continues the lexing of ellipsis. The call assumption is that `..` has already been lexed.
+    fn lex_ellipsis(&mut self, start: usize) -> Option<<Self as Iterator>::Item> {
+        self.chars.next();
+
+        match self.chars.peek() {
+            Some(&(_, '.')) => {
+                self.chars.next();
+                Some(Ok((start, Token::Ellipsis, start + 3)))
+            }
+            _ => Some(Err(create_error(
+                LexicalErrorCode::ExpectedEllipsis,
+                start + 2,
+            ))),
+        }
+    }
+
+    /// A small DFA for lexing float literals. The call assumption differs depending on the initial
+    /// state.
+    fn lex_float_literal(
+        &mut self,
+        start: usize,
+        mut offset: usize,
+        mut float_literal: String,
+        mut float_lex_state: FloatLexState,
+    ) -> Option<<Self as Iterator>::Item> {
+        loop {
+            match float_lex_state {
+                FloatLexState::BeforeDecimalPoint => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset)
+                    }
+                    Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                        self.push_next_char(&mut float_literal, 'e', &mut offset);
+                        float_lex_state = FloatLexState::ImmediatelyAfterExponentBase;
+                    }
+                    Some(&(_, '.')) => {
+                        self.push_next_char(&mut float_literal, '.', &mut offset);
+                        float_lex_state = FloatLexState::ImmediatelyAfterDecimalPoint;
+                    }
+                    _ => panic!(
+                        "Integer literals should not be\
+                         able to be lexed as float literals"
+                    ),
+                },
+                FloatLexState::ImmediatelyAfterDecimalPoint => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                        float_lex_state = FloatLexState::AfterDecimalPoint;
+                    }
+                    Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                        if float_literal.chars().count() == 1 {
+                            panic!(
+                                "A leading decimal point followed by\
+                                 an exponent should not be possible"
+                            );
+                        }
+
+                        self.push_next_char(&mut float_literal, 'e', &mut offset);
+                        float_lex_state = FloatLexState::ImmediatelyAfterExponentBase;
+                    }
+                    _ if float_literal.starts_with("-.") => {
+                        return Some(Err(create_error(
+                            LexicalErrorCode::ExpectedDecimalDigit,
+                            offset,
+                        )))
+                    }
+                    _ => {
+                        return Some(Ok((
+                            start,
+                            Token::FloatLiteral(float_literal.parse().unwrap()),
+                            offset,
+                        )));
+                    }
+                },
+                FloatLexState::AfterDecimalPoint => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                    }
+                    Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                        self.push_next_char(&mut float_literal, 'e', &mut offset);
+                        float_lex_state = FloatLexState::ImmediatelyAfterExponentBase;
+                    }
+                    _ => {
+                        return Some(Ok((
+                            start,
+                            Token::FloatLiteral(float_literal.parse().unwrap()),
+                            offset,
+                        )));
+                    }
+                },
+                FloatLexState::ImmediatelyAfterExponentBase => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                        float_lex_state = FloatLexState::AfterExponentBase;
+                    }
+                    Some(&(_, c @ '+')) | Some(&(_, c @ '-')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                        float_lex_state = FloatLexState::ImmediatelyAfterExponentSign;
+                    }
+                    _ => {
+                        return Some(Err(create_error(
+                            LexicalErrorCode::ExpectedFloatExponent,
+                            offset,
+                        )))
+                    }
+                },
+                FloatLexState::ImmediatelyAfterExponentSign => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                        float_lex_state = FloatLexState::AfterExponentBase;
+                    }
+                    _ => {
+                        return Some(Err(create_error(
+                            LexicalErrorCode::ExpectedFloatExponent,
+                            offset,
+                        )))
+                    }
+                },
+                FloatLexState::AfterExponentBase => match self.chars.peek() {
+                    Some(&(_, c @ '0'...'9')) => {
+                        self.push_next_char(&mut float_literal, c, &mut offset);
+                    }
+                    _ => {
+                        return Some(Ok((
+                            start,
+                            Token::FloatLiteral(float_literal.parse().unwrap()),
+                            offset,
+                        )));
+                    }
+                },
+            }
+        }
+    }
+
+    /// Continues lexing a hexadecimal literal. The call assumption is that `0x` has already been
+    /// lexed.
+    fn lex_hexadecimal_literal(
+        &mut self,
+        start: usize,
+        mut offset: usize,
+        mut hexadecimal_literal: String,
+    ) -> Option<<Self as Iterator>::Item> {
+        offset += 2;
+        self.chars.next();
+
+        match self.chars.peek() {
+            Some(&(_, c)) if c.is_digit(16) => loop {
+                match self.chars.peek() {
+                    Some(&(_, c)) if c.is_digit(16) => {
+                        self.push_next_char(&mut hexadecimal_literal, c, &mut offset);
+                    }
+                    _ => {
+                        let hexadecimal_literal =
+                            i64::from_str_radix(&*hexadecimal_literal, 16).unwrap();
+                        return Some(Ok((
+                            start,
+                            Token::IntegerLiteral(hexadecimal_literal),
+                            offset,
+                        )));
+                    }
+                }
+            },
+            _ => Some(Err(create_error(
+                LexicalErrorCode::ExpectedHexadecimalDigit,
+                offset,
+            ))),
+        }
+    }
+
+    /// Continues lexing an identifier. The call assumption is that the first letter or the first
+    /// letter preceded by a `_` have already been lexed.
+    fn lex_identifier(&mut self, offset: &mut usize, mut identifier: &mut String) {
+        loop {
+            match self.chars.peek() {
+                Some(&(_, c @ 'A'...'Z'))
+                | Some(&(_, c @ 'a'...'z'))
+                | Some(&(_, c @ '0'...'9'))
+                | Some(&(_, c @ '_'))
+                | Some(&(_, c @ '-')) => {
+                    self.push_next_char(&mut identifier, c, offset);
+                }
+                _ => break,
+            }
+        }
+    }
+
+    /// Continues lexing an identifier with the potential that it is a keyword. The call assumption
+    /// is that the first letter or the first letter preceded by a `_` have already been lexed.
+    fn lex_identifier_or_keyword(
+        &mut self,
+        start: usize,
+        mut offset: usize,
+        mut identifier: String,
+    ) -> Option<<Self as Iterator>::Item> {
+        self.lex_identifier(&mut offset, &mut identifier);
+
+        let token = match &*identifier {
+            "ArrayBuffer" => Token::ArrayBuffer,
+            "ByteString" => Token::ByteString,
+            "DataView" => Token::DataView,
+            "DOMString" => Token::DOMString,
+            "Error" => Token::Error,
+            "Float32Array" => Token::Float32Array,
+            "Float64Array" => Token::Float64Array,
+            "FrozenArray" => Token::FrozenArray,
+            "Infinity" => Token::PositiveInfinity,
+            "Int16Array" => Token::Int16Array,
+            "Int32Array" => Token::Int32Array,
+            "Int8Array" => Token::Int8Array,
+            "NaN" => Token::NaN,
+            "Promise" => Token::Promise,
+            "USVString" => Token::USVString,
+            "Uint16Array" => Token::Uint16Array,
+            "Uint32Array" => Token::Uint32Array,
+            "Uint8Array" => Token::Uint8Array,
+            "Uint8ClampedArray" => Token::Uint8ClampedArray,
+            "any" => Token::Any,
+            "attribute" => Token::Attribute,
+            "boolean" => Token::Boolean,
+            "byte" => Token::Byte,
+            "callback" => Token::Callback,
+            "const" => Token::Const,
+            "deleter" => Token::Deleter,
+            "dictionary" => Token::Dictionary,
+            "double" => Token::Double,
+            "enum" => Token::Enum,
+            "false" => Token::False,
+            "float" => Token::Float,
+            "getter" => Token::Getter,
+            "implements" => Token::Implements,
+            "includes" => Token::Includes,
+            "inherit" => Token::Inherit,
+            "interface" => Token::Interface,
+            "iterable" => Token::Iterable,
+            "legacycaller" => Token::LegacyCaller,
+            "long" => Token::Long,
+            "maplike" => Token::Maplike,
+            "mixin" => Token::Mixin,
+            "namespace" => Token::Namespace,
+            "null" => Token::Null,
+            "object" => Token::Object,
+            "octet" => Token::Octet,
+            "optional" => Token::Optional,
+            "or" => Token::Or,
+            "partial" => Token::Partial,
+            "readonly" => Token::ReadOnly,
+            "record" => Token::Record,
+            "required" => Token::Required,
+            "sequence" => Token::Sequence,
+            "setlike" => Token::Setlike,
+            "setter" => Token::Setter,
+            "short" => Token::Short,
+            "static" => Token::Static,
+            "stringifier" => Token::Stringifier,
+            "symbol" => Token::Symbol,
+            "typedef" => Token::Typedef,
+            "true" => Token::True,
+            "unrestricted" => Token::Unrestricted,
+            "unsigned" => Token::Unsigned,
+            "void" => Token::Void,
+            _ => if identifier.starts_with('_') {
+                Token::Identifier(identifier.split_at(1).1.to_string())
+            } else {
+                Token::Identifier(identifier)
+            },
+        };
+
+        Some(Ok((start, token, offset)))
+    }
+
+    /// Continues lexing either an integer or float literal. The call assumption is that `c` is
+    /// a decimal digit.
+    fn lex_integer_or_float_literal(
+        &mut self,
+        start: usize,
+        mut offset: usize,
+        mut literal: String,
+        c: char,
+    ) -> Option<<Self as Iterator>::Item> {
+        match c {
+            '0' => match self.chars.peek() {
+                Some(&(_, 'x')) | Some(&(_, 'X')) => {
+                    self.lex_hexadecimal_literal(start, offset, literal)
+                }
+                Some(&(_, c @ '0'...'9')) => {
+                    offset += 2;
+                    literal.push(c);
+
+                    if c > '7' {
+                        if !self.lookahead_for_decimal_point() {
+                            return Some(Ok((start, Token::IntegerLiteral(0), offset - 1)));
+                        }
+
+                        self.chars.next();
+                        return self.lex_float_literal(
+                            start,
+                            offset,
+                            literal,
+                            FloatLexState::BeforeDecimalPoint,
+                        );
+                    }
+
+                    self.chars.next();
+
+                    loop {
+                        match self.chars.peek() {
+                            Some(&(_, c @ '0'...'9')) => {
+                                if c > '7' {
+                                    if !self.lookahead_for_decimal_point() {
+                                        let literal = i64::from_str_radix(&*literal, 8).unwrap();
+                                        return Some(Ok((
+                                            start,
+                                            Token::IntegerLiteral(literal),
+                                            offset,
+                                        )));
+                                    }
+
+                                    self.push_next_char(&mut literal, c, &mut offset);
+
+                                    return self.lex_float_literal(
+                                        start,
+                                        offset,
+                                        literal,
+                                        FloatLexState::BeforeDecimalPoint,
+                                    );
+                                }
+
+                                self.push_next_char(&mut literal, c, &mut offset);
+
+                                if c > '7' {
+                                    return self.lex_float_literal(
+                                        start,
+                                        offset,
+                                        literal,
+                                        FloatLexState::BeforeDecimalPoint,
+                                    );
+                                }
+                            }
+                            Some(&(_, '.')) => {
+                                self.push_next_char(&mut literal, '.', &mut offset);
+
+                                return self.lex_float_literal(
+                                    start,
+                                    offset,
+                                    literal,
+                                    FloatLexState::ImmediatelyAfterDecimalPoint,
+                                );
+                            }
+                            Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                                self.push_next_char(&mut literal, 'e', &mut offset);
+
+                                return self.lex_float_literal(
+                                    start,
+                                    offset,
+                                    literal,
+                                    FloatLexState::ImmediatelyAfterExponentBase,
+                                );
+                            }
+                            _ => {
+                                let literal = i64::from_str_radix(&*literal, 8).unwrap();
+                                return Some(Ok((start, Token::IntegerLiteral(literal), offset)));
+                            }
+                        }
+                    }
+                }
+                Some(&(_, '.')) => {
+                    self.chars.next();
+                    self.lex_float_literal(
+                        start,
+                        start + 2,
+                        "0.".to_string(),
+                        FloatLexState::ImmediatelyAfterDecimalPoint,
+                    )
+                }
+                Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                    self.chars.next();
+                    self.lex_float_literal(
+                        start,
+                        start + 2,
+                        "0e".to_string(),
+                        FloatLexState::ImmediatelyAfterExponentBase,
+                    )
+                }
+                _ => Some(Ok((start, Token::IntegerLiteral(0), start + 1))),
+            },
+            c => {
+                literal.push(c);
+                offset += 1;
+
+                loop {
+                    match self.chars.peek() {
+                        Some(&(_, c @ '0'...'9')) => {
+                            self.push_next_char(&mut literal, c, &mut offset)
+                        }
+                        Some(&(_, '.')) => {
+                            self.push_next_char(&mut literal, '.', &mut offset);
+
+                            return self.lex_float_literal(
+                                start,
+                                offset,
+                                literal,
+                                FloatLexState::ImmediatelyAfterDecimalPoint,
+                            );
+                        }
+                        Some(&(_, 'e')) | Some(&(_, 'E')) => {
+                            self.push_next_char(&mut literal, 'e', &mut offset);
+
+                            return self.lex_float_literal(
+                                start,
+                                offset,
+                                literal,
+                                FloatLexState::ImmediatelyAfterExponentBase,
+                            );
+                        }
+                        _ => {
+                            let literal = literal.parse::<i64>().unwrap();
+                            return Some(Ok((start, Token::IntegerLiteral(literal), offset)));
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /// Continues lexing a line comment. The call assumption is that `//` have already been lexed.
+    fn lex_line_comment(&mut self) {
+        while let Some(&(_, c)) = self.chars.peek() {
+            if c == '\n' {
+                break;
+            }
+
+            self.chars.next();
+        }
+    }
+
+    /// Continues lexing negative infinity. The call assumption is that `-` has already been
+    /// lexed with the assumption that "I" follows.
+    fn lex_negative_infinity(&mut self, start: usize) -> Option<<Self as Iterator>::Item> {
+        let infinity = self.chars
+            .clone()
+            .take(8)
+            .map(|(_, c)| c)
+            .collect::<String>();
+
+        if infinity == "Infinity" {
+            for _ in 0..8 {
+                self.chars.next();
+            }
+
+            Some(Ok((start, Token::NegativeInfinity, start + 9)))
+        } else {
+            let char_count = infinity.chars().count();
+
+            for _ in char_count..8 {
+                self.chars.next();
+            }
+
+            Some(Err(LexicalError {
+                code: LexicalErrorCode::ExpectedKeywordInfinity,
+                location: start + char_count,
+            }))
+        }
+    }
+
+    /// Continues lexing a string literal. The call assumption is that `"` has already been lexed.
+    fn lex_string(&mut self, start: usize) -> Option<<Self as Iterator>::Item> {
+        let mut previous = start;
+        let mut string = String::new();
+
+        loop {
+            previous += 1;
+
+            match self.chars.next() {
+                Some((_, '"')) => {
+                    return Some(Ok((start, Token::StringLiteral(string), previous + 1)))
+                }
+                Some((_, c)) => {
+                    string.push(c);
+                }
+                None => {
+                    return Some(Err(create_error(
+                        LexicalErrorCode::ExpectedStringLiteralEnd,
+                        previous + 1,
+                    )))
+                }
+            }
+        }
+    }
+
+    /// A helper function that will lookahead at the following characters to see if a decimal point
+    /// follows digits. This is needed particularly in the case when lexing `01238` or similar.
+    fn lookahead_for_decimal_point(&mut self) -> bool {
+        let mut chars = self.chars.clone();
+
+        loop {
+            match chars.next() {
+                Some((_, '0'...'9')) => continue,
+                Some((_, '.')) => return true,
+                _ => return false,
+            }
+        }
+    }
+
+    /// A helper function for performing the repetitive task of proceeding to the next character,
+    /// appending a character to a token, and incrementing the offset.
+    fn push_next_char(&mut self, token: &mut String, next_char: char, offset: &mut usize) {
+        self.chars.next();
+        token.push(next_char);
+        *offset += 1;
+    }
+}
+
+impl<'input> Iterator for Lexer<'input> {
+    type Item = Spanned<Token, usize, LexicalError>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.get_next_token()
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    fn assert_lex(input: &str, expected: Vec<Spanned<Token, usize, LexicalError>>) {
+        let lexer = Lexer::new(input);
+        assert_eq!(lexer.collect::<Vec<_>>(), expected);
+    }
+
+    #[test]
+    fn lex_colon() {
+        assert_lex(":", vec![Ok((0, Token::Colon, 1))]);
+    }
+
+    #[test]
+    fn lex_comma() {
+        assert_lex(",", vec![Ok((0, Token::Comma, 1))]);
+    }
+
+    #[test]
+    fn lex_comment() {
+        assert_lex("// this is a comment", vec![]);
+        assert_lex("/* this is a comment */", vec![]);
+        assert_lex(
+            "/* this is a comment",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedCommentBlockEnd, 20)),
+            ],
+        );
+        assert_lex(
+            "/* this is a comment*",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedCommentBlockEnd, 21)),
+            ],
+        );
+    }
+
+    #[test]
+    fn lex_ellipsis() {
+        assert_lex("...", vec![Ok((0, Token::Ellipsis, 3))]);
+        assert_lex(
+            "..",
+            vec![Err(create_error(LexicalErrorCode::ExpectedEllipsis, 2))],
+        );
+    }
+
+    #[test]
+    fn lex_equals() {
+        assert_lex("=", vec![Ok((0, Token::Equals, 1))]);
+    }
+
+    #[test]
+    fn lex_float_literal() {
+        // With leading 0
+        assert_lex("0.", vec![Ok((0, Token::FloatLiteral(0.0), 2))]);
+        assert_lex("000051.", vec![Ok((0, Token::FloatLiteral(51.0), 7))]);
+        assert_lex("05162.", vec![Ok((0, Token::FloatLiteral(5162.0), 6))]);
+        assert_lex("099.", vec![Ok((0, Token::FloatLiteral(99.0), 4))]);
+        assert_lex(
+            "04624.51235",
+            vec![Ok((0, Token::FloatLiteral(4624.51235), 11))],
+        );
+        assert_lex("0.987", vec![Ok((0, Token::FloatLiteral(0.987), 5))]);
+        assert_lex("0.55e10", vec![Ok((0, Token::FloatLiteral(0.55e10), 7))]);
+        assert_lex("0612e61", vec![Ok((0, Token::FloatLiteral(612e61), 7))]);
+        assert_lex("0e-1", vec![Ok((0, Token::FloatLiteral(0e-1), 4))]);
+        assert_lex("041e+9", vec![Ok((0, Token::FloatLiteral(41e+9), 6))]);
+        assert_lex(
+            "021e",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 4)),
+            ],
+        );
+        assert_lex(
+            "01e+",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 4)),
+            ],
+        );
+        assert_lex(
+            "01e-",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 4)),
+            ],
+        );
+
+        // Without leading 0
+        assert_lex("5162.", vec![Ok((0, Token::FloatLiteral(5162.0), 5))]);
+        assert_lex("99.", vec![Ok((0, Token::FloatLiteral(99.0), 3))]);
+        assert_lex(
+            "4624.51235",
+            vec![Ok((0, Token::FloatLiteral(4624.51235), 10))],
+        );
+        assert_lex("612e61", vec![Ok((0, Token::FloatLiteral(612e61), 6))]);
+        assert_lex("41e+9", vec![Ok((0, Token::FloatLiteral(41e+9), 5))]);
+        assert_lex(
+            "21e",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 3)),
+            ],
+        );
+        assert_lex(
+            "1e+",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 3)),
+            ],
+        );
+        assert_lex(
+            "1e-",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedFloatExponent, 3)),
+            ],
+        );
+
+        // With leading decimal point
+        assert_lex(".5", vec![Ok((0, Token::FloatLiteral(0.5), 2))]);
+        assert_lex(".612e-10", vec![Ok((0, Token::FloatLiteral(0.612e-10), 8))]);
+
+        // With leading negative sign
+        assert_lex("-700.5", vec![Ok((0, Token::FloatLiteral(-700.5), 6))]);
+        assert_lex("-9.e2", vec![Ok((0, Token::FloatLiteral(-9.0e2), 5))]);
+        assert_lex("-.5e1", vec![Ok((0, Token::FloatLiteral(-0.5e1), 5))]);
+        assert_lex("-.0", vec![Ok((0, Token::FloatLiteral(0.0), 3))]);
+        assert_lex(
+            "-.",
+            vec![Err(create_error(LexicalErrorCode::ExpectedDecimalDigit, 2))],
+        );
+    }
+
+    #[test]
+    fn lex_greater_than() {
+        assert_lex(">", vec![Ok((0, Token::GreaterThan, 1))]);
+    }
+
+    #[test]
+    fn lex_hyphen() {
+        assert_lex("-", vec![Ok((0, Token::Hyphen, 1))]);
+    }
+
+    #[test]
+    fn lex_identifier() {
+        assert_lex(
+            "_identifier",
+            vec![Ok((0, Token::Identifier("identifier".to_string()), 11))],
+        );
+        assert_lex(
+            "_Identifier",
+            vec![Ok((0, Token::Identifier("Identifier".to_string()), 11))],
+        );
+        assert_lex(
+            "identifier",
+            vec![Ok((0, Token::Identifier("identifier".to_string()), 10))],
+        );
+        assert_lex(
+            "Identifier",
+            vec![Ok((0, Token::Identifier("Identifier".to_string()), 10))],
+        );
+        assert_lex(
+            "z0123",
+            vec![Ok((0, Token::Identifier("z0123".to_string()), 5))],
+        );
+        assert_lex(
+            "i-d-e_t0123",
+            vec![Ok((0, Token::Identifier("i-d-e_t0123".to_string()), 11))],
+        );
+    }
+
+    #[test]
+    fn lex_integer_literal() {
+        // Decimal
+        assert_lex("1", vec![Ok((0, Token::IntegerLiteral(1), 1))]);
+        assert_lex("9624", vec![Ok((0, Token::IntegerLiteral(9624), 4))]);
+        assert_lex("-1", vec![Ok((0, Token::IntegerLiteral(-1), 2))]);
+        assert_lex("-9624", vec![Ok((0, Token::IntegerLiteral(-9624), 5))]);
+
+        // Hexadecimal
+        assert_lex("0x0", vec![Ok((0, Token::IntegerLiteral(0x0), 3))]);
+        assert_lex(
+            "0x1234FF",
+            vec![Ok((0, Token::IntegerLiteral(0x1234FF), 8))],
+        );
+        assert_lex(
+            "0x",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedHexadecimalDigit, 2)),
+            ],
+        );
+        assert_lex("-0x0", vec![Ok((0, Token::IntegerLiteral(0x0), 4))]);
+        assert_lex(
+            "-0x1234FF",
+            vec![Ok((0, Token::IntegerLiteral(-0x1234FF), 9))],
+        );
+        assert_lex(
+            "-0x",
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedHexadecimalDigit, 3)),
+            ],
+        );
+
+        // Octal
+        assert_lex("0", vec![Ok((0, Token::IntegerLiteral(0), 1))]);
+        assert_lex("0624", vec![Ok((0, Token::IntegerLiteral(0o624), 4))]);
+        assert_lex("-0624", vec![Ok((0, Token::IntegerLiteral(-0o624), 5))]);
+
+        // Octal integer literal followed by non-octal digits.
+        assert_lex(
+            "08",
+            vec![
+                Ok((0, Token::IntegerLiteral(0), 1)),
+                Ok((1, Token::IntegerLiteral(8), 2)),
+            ],
+        );
+        assert_lex(
+            "01238",
+            vec![
+                Ok((0, Token::IntegerLiteral(0o123), 4)),
+                Ok((4, Token::IntegerLiteral(8), 5)),
+            ],
+        );
+    }
+
+    #[test]
+    fn lex_keyword() {
+        assert_lex("ArrayBuffer", vec![Ok((0, Token::ArrayBuffer, 11))]);
+        assert_lex("ByteString", vec![Ok((0, Token::ByteString, 10))]);
+        assert_lex("DataView", vec![Ok((0, Token::DataView, 8))]);
+        assert_lex("DOMString", vec![Ok((0, Token::DOMString, 9))]);
+        assert_lex("Error", vec![Ok((0, Token::Error, 5))]);
+        assert_lex("Float32Array", vec![Ok((0, Token::Float32Array, 12))]);
+        assert_lex("Float64Array", vec![Ok((0, Token::Float64Array, 12))]);
+        assert_lex("FrozenArray", vec![Ok((0, Token::FrozenArray, 11))]);
+        assert_lex("Infinity", vec![Ok((0, Token::PositiveInfinity, 8))]);
+        assert_lex("Int16Array", vec![Ok((0, Token::Int16Array, 10))]);
+        assert_lex("Int32Array", vec![Ok((0, Token::Int32Array, 10))]);
+        assert_lex("Int8Array", vec![Ok((0, Token::Int8Array, 9))]);
+        assert_lex("NaN", vec![Ok((0, Token::NaN, 3))]);
+        assert_lex("Promise", vec![Ok((0, Token::Promise, 7))]);
+        assert_lex("USVString", vec![Ok((0, Token::USVString, 9))]);
+        assert_lex("Uint16Array", vec![Ok((0, Token::Uint16Array, 11))]);
+        assert_lex("Uint32Array", vec![Ok((0, Token::Uint32Array, 11))]);
+        assert_lex("Uint8Array", vec![Ok((0, Token::Uint8Array, 10))]);
+        assert_lex(
+            "Uint8ClampedArray",
+            vec![Ok((0, Token::Uint8ClampedArray, 17))],
+        );
+        assert_lex("any", vec![Ok((0, Token::Any, 3))]);
+        assert_lex("attribute", vec![Ok((0, Token::Attribute, 9))]);
+        assert_lex("boolean", vec![Ok((0, Token::Boolean, 7))]);
+        assert_lex("byte", vec![Ok((0, Token::Byte, 4))]);
+        assert_lex("callback", vec![Ok((0, Token::Callback, 8))]);
+        assert_lex("const", vec![Ok((0, Token::Const, 5))]);
+        assert_lex("deleter", vec![Ok((0, Token::Deleter, 7))]);
+        assert_lex("dictionary", vec![Ok((0, Token::Dictionary, 10))]);
+        assert_lex("double", vec![Ok((0, Token::Double, 6))]);
+        assert_lex("enum", vec![Ok((0, Token::Enum, 4))]);
+        assert_lex("false", vec![Ok((0, Token::False, 5))]);
+        assert_lex("float", vec![Ok((0, Token::Float, 5))]);
+        assert_lex("getter", vec![Ok((0, Token::Getter, 6))]);
+        assert_lex("implements", vec![Ok((0, Token::Implements, 10))]);
+        assert_lex("includes", vec![Ok((0, Token::Includes, 8))]);
+        assert_lex("inherit", vec![Ok((0, Token::Inherit, 7))]);
+        assert_lex("interface", vec![Ok((0, Token::Interface, 9))]);
+        assert_lex("iterable", vec![Ok((0, Token::Iterable, 8))]);
+        assert_lex("legacycaller", vec![Ok((0, Token::LegacyCaller, 12))]);
+        assert_lex("long", vec![Ok((0, Token::Long, 4))]);
+        assert_lex("maplike", vec![Ok((0, Token::Maplike, 7))]);
+        assert_lex("mixin", vec![Ok((0, Token::Mixin, 5))]);
+        assert_lex("namespace", vec![Ok((0, Token::Namespace, 9))]);
+        assert_lex("null", vec![Ok((0, Token::Null, 4))]);
+        assert_lex("object", vec![Ok((0, Token::Object, 6))]);
+        assert_lex("octet", vec![Ok((0, Token::Octet, 5))]);
+        assert_lex("optional", vec![Ok((0, Token::Optional, 8))]);
+        assert_lex("or", vec![Ok((0, Token::Or, 2))]);
+        assert_lex("partial", vec![Ok((0, Token::Partial, 7))]);
+        assert_lex("readonly", vec![Ok((0, Token::ReadOnly, 8))]);
+        assert_lex("record", vec![Ok((0, Token::Record, 6))]);
+        assert_lex("required", vec![Ok((0, Token::Required, 8))]);
+        assert_lex("sequence", vec![Ok((0, Token::Sequence, 8))]);
+        assert_lex("setlike", vec![Ok((0, Token::Setlike, 7))]);
+        assert_lex("setter", vec![Ok((0, Token::Setter, 6))]);
+        assert_lex("short", vec![Ok((0, Token::Short, 5))]);
+        assert_lex("static", vec![Ok((0, Token::Static, 6))]);
+        assert_lex("stringifier", vec![Ok((0, Token::Stringifier, 11))]);
+        assert_lex("symbol", vec![Ok((0, Token::Symbol, 6))]);
+        assert_lex("true", vec![Ok((0, Token::True, 4))]);
+        assert_lex("typedef", vec![Ok((0, Token::Typedef, 7))]);
+        assert_lex("unsigned", vec![Ok((0, Token::Unsigned, 8))]);
+        assert_lex("unrestricted", vec![Ok((0, Token::Unrestricted, 12))]);
+        assert_lex("void", vec![Ok((0, Token::Void, 4))]);
+    }
+
+    #[test]
+    fn lex_left_brace() {
+        assert_lex("{", vec![Ok((0, Token::LeftBrace, 1))]);
+    }
+
+    #[test]
+    fn lex_left_bracket() {
+        assert_lex("[", vec![Ok((0, Token::LeftBracket, 1))]);
+    }
+
+    #[test]
+    fn lex_left_parenthesis() {
+        assert_lex("(", vec![Ok((0, Token::LeftParenthesis, 1))]);
+    }
+
+    #[test]
+    fn lex_less_than() {
+        assert_lex("<", vec![Ok((0, Token::LessThan, 1))]);
+    }
+
+    #[test]
+    fn lex_negative_infinity() {
+        assert_lex("-Infinity", vec![Ok((0, Token::NegativeInfinity, 9))]);
+        assert_lex(
+            "-Infinity;",
+            vec![
+                Ok((0, Token::NegativeInfinity, 9)),
+                Ok((9, Token::Semicolon, 10)),
+            ],
+        );
+    }
+
+    #[test]
+    fn lex_other_literal() {
+        assert_lex("%", vec![Ok((0, Token::OtherLiteral('%'), 1))]);
+        assert_lex("/", vec![Ok((0, Token::OtherLiteral('/'), 1))]);
+        assert_lex("!", vec![Ok((0, Token::OtherLiteral('!'), 1))]);
+        assert_lex("_", vec![Ok((0, Token::OtherLiteral('_'), 1))]);
+    }
+
+    #[test]
+    fn lex_period() {
+        assert_lex(".", vec![Ok((0, Token::Period, 1))]);
+    }
+
+    #[test]
+    fn lex_question_mark() {
+        assert_lex("?", vec![Ok((0, Token::QuestionMark, 1))]);
+    }
+
+    #[test]
+    fn lex_right_brace() {
+        assert_lex("}", vec![Ok((0, Token::RightBrace, 1))]);
+    }
+
+    #[test]
+    fn lex_right_bracket() {
+        assert_lex("]", vec![Ok((0, Token::RightBracket, 1))]);
+    }
+
+    #[test]
+    fn lex_right_parenthesis() {
+        assert_lex(")", vec![Ok((0, Token::RightParenthesis, 1))]);
+    }
+
+    #[test]
+    fn lex_semicolon() {
+        assert_lex(";", vec![Ok((0, Token::Semicolon, 1))]);
+    }
+
+    #[test]
+    fn lex_string() {
+        assert_lex(
+            r#""this is a string""#,
+            vec![
+                Ok((0, Token::StringLiteral("this is a string".to_string()), 18)),
+            ],
+        );
+        assert_lex(
+            r#""this is a string"#,
+            vec![
+                Err(create_error(LexicalErrorCode::ExpectedStringLiteralEnd, 18)),
+            ],
+        );
+    }
+
+    #[test]
+    fn lex_whitespace() {
+        assert_lex("      \n \t", vec![]);
+        assert_lex("\r\n", vec![]);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/lexer/token.rs
@@ -0,0 +1,107 @@
+use std::fmt;
+
+/// An enum of all possible tokens allowed by the
+/// [WebIDL grammar](https://heycam.github.io/webidl/#idl-grammar) A token in this case is a
+/// terminal, either a static string or regular expression based token. Note that not all possible
+/// simplifications are made such as converting the `True` and `False` tokens to actual booleans.
+/// This choice was made to be as consistent as possible with the WebIDL grammar.
+#[allow(missing_docs)]
+#[derive(Clone, Debug, PartialEq)]
+pub enum Token {
+    // Keywords
+    Any,
+    ArrayBuffer,
+    Attribute,
+    Boolean,
+    Byte,
+    ByteString,
+    Callback,
+    Const,
+    DataView,
+    Deleter,
+    Dictionary,
+    DOMString,
+    Double,
+    Enum,
+    Error,
+    False,
+    Float,
+    Float32Array,
+    Float64Array,
+    FrozenArray,
+    Getter,
+    Implements,
+    Includes,
+    Inherit,
+    Int16Array,
+    Int32Array,
+    Int8Array,
+    Interface,
+    Iterable,
+    LegacyCaller,
+    Long,
+    Maplike,
+    Mixin,
+    Namespace,
+    NaN,
+    NegativeInfinity,
+    Null,
+    Object,
+    Octet,
+    Optional,
+    Or,
+    Partial,
+    PositiveInfinity,
+    Promise,
+    ReadOnly,
+    Record,
+    Required,
+    Sequence,
+    Setlike,
+    Setter,
+    Short,
+    Static,
+    Stringifier,
+    Symbol,
+    True,
+    Typedef,
+    USVString,
+    Uint16Array,
+    Uint32Array,
+    Uint8Array,
+    Uint8ClampedArray,
+    Unrestricted,
+    Unsigned,
+    Void,
+
+    // Regular expressions
+    FloatLiteral(f64),
+    Identifier(String),
+    IntegerLiteral(i64),
+    OtherLiteral(char),
+    StringLiteral(String),
+
+    // Symbols
+    Colon,
+    Comma,
+    Ellipsis,
+    Equals,
+    GreaterThan,
+    Hyphen,
+    LeftBrace,
+    LeftBracket,
+    LeftParenthesis,
+    LessThan,
+    Period,
+    QuestionMark,
+    RightBrace,
+    RightBracket,
+    RightParenthesis,
+    Semicolon,
+}
+
+impl fmt::Display for Token {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:?}", self)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/lib.rs
@@ -0,0 +1,18 @@
+#![cfg_attr(feature = "clippy", feature(plugin))]
+#![cfg_attr(feature = "clippy", plugin(clippy))]
+#![deny(missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts,
+        trivial_numeric_casts, unsafe_code, unused_import_braces, unused_qualifications,
+        variant_size_differences)]
+
+//! Contains a lexer and parser for the WebIDL grammar.
+
+extern crate lalrpop_util;
+
+/// Contains lexer related structures and functions for lexing the WebIDL grammar.
+mod lexer;
+
+/// Contains parser related structures and functions for parsing the WebIDL grammar.
+mod parser;
+
+pub use lexer::*;
+pub use parser::*;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/parser/ast.rs
@@ -0,0 +1,639 @@
+#![allow(missing_docs)]
+
+pub type AST = Vec<Definition>;
+pub type Identifier = String;
+
+// The following structures are used to help simplify building the AST in the grammar. Ideally
+// these would not be exposed outside the crate, but the compiler seems to think they are exposed
+// as private types when `pub(super)` is used. This is not the case since all of their variants are
+// matched into other structures, but I suppose it is not a big deal.
+
+/// Do not use - for grammar use only.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum BufferRelatedType {
+    ArrayBuffer,
+    DataView,
+    Float32Array,
+    Float64Array,
+    Int16Array,
+    Int32Array,
+    Int8Array,
+    Uint16Array,
+    Uint32Array,
+    Uint8Array,
+    Uint8ClampedArray,
+}
+
+/// Do not use - for grammar use only.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum PrimitiveType {
+    Boolean,
+    Byte,
+    Octet,
+    UnrestrictedFloat(UnrestrictedFloatType),
+    UnsignedInteger(UnsignedIntegerType),
+}
+
+/// Do not use - for grammar use only.
+#[derive(Clone, Debug, PartialEq)]
+pub enum Stringifier {
+    Attribute(Attribute),
+    Operation(Operation),
+}
+
+/// Do not use - for grammar use only.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum UnrestrictedFloatType {
+    RestrictedDouble,
+    RestrictedFloat,
+    UnrestrictedDouble,
+    UnrestrictedFloat,
+}
+
+/// Do not use - for grammar use only.
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum UnsignedIntegerType {
+    SignedLong,
+    SignedLongLong,
+    SignedShort,
+    UnsignedLong,
+    UnsignedLongLong,
+    UnsignedShort,
+}
+
+// Publically available AST structures
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Argument {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub default: Option<DefaultValue>,
+    pub name: Identifier,
+    pub optional: bool,
+    pub type_: Box<Type>,
+    pub variadic: bool,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct ArgumentListExtendedAttribute {
+    pub arguments: Vec<Argument>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Attribute {
+    Regular(RegularAttribute),
+    Static(StaticAttribute),
+    Stringifier(StringifierAttribute),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Callback {
+    pub arguments: Vec<Argument>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub return_type: ReturnType,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct CallbackInterface {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub inherits: Option<Identifier>,
+    pub members: Vec<InterfaceMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Const {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub nullable: bool,
+    pub type_: ConstType,
+    pub value: ConstValue,
+}
+
+#[allow(variant_size_differences)]
+#[derive(Clone, Debug, Eq, Hash, PartialEq)]
+pub enum ConstType {
+    Boolean,
+    Byte,
+    Identifier(Identifier),
+    Octet,
+    RestrictedDouble,
+    RestrictedFloat,
+    SignedLong,
+    SignedLongLong,
+    SignedShort,
+    UnrestrictedDouble,
+    UnrestrictedFloat,
+    UnsignedLong,
+    UnsignedLongLong,
+    UnsignedShort,
+}
+
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum ConstValue {
+    BooleanLiteral(bool),
+    FloatLiteral(f64),
+    IntegerLiteral(i64),
+    Null,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum DefaultValue {
+    ConstValue(ConstValue),
+    EmptySequence,
+    StringLiteral(String),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Definition {
+    Callback(Callback),
+    Dictionary(Dictionary),
+    Enum(Enum),
+    Implements(Implements),
+    Includes(Includes),
+    Interface(Interface),
+    Mixin(Mixin),
+    Namespace(Namespace),
+    Typedef(Typedef),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Dictionary {
+    NonPartial(NonPartialDictionary),
+    Partial(PartialDictionary),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct DictionaryMember {
+    pub default: Option<DefaultValue>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub required: bool,
+    pub type_: Box<Type>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Enum {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: String,
+    pub variants: Vec<String>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct ExplicitStringifierOperation {
+    pub arguments: Vec<Argument>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Option<Identifier>,
+    pub return_type: ReturnType,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum ExtendedAttribute {
+    ArgumentList(ArgumentListExtendedAttribute),
+    Identifier(IdentifierExtendedAttribute),
+    IdentifierList(IdentifierListExtendedAttribute),
+    NamedArgumentList(NamedArgumentListExtendedAttribute),
+    NoArguments(Other),
+    // Other(OtherExtendedAttribute),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct IdentifierExtendedAttribute {
+    pub lhs: Identifier,
+    pub rhs: Other,
+}
+
+#[derive(Clone, Debug, Eq, Hash, PartialEq)]
+pub struct IdentifierListExtendedAttribute {
+    pub lhs: Identifier,
+    pub rhs: Vec<Identifier>,
+}
+
+/// Note that this is no longer a part of the WebIDL specification, but exists for backwards
+/// compatibility of older WebIDLs.
+#[derive(Clone, Debug, PartialEq)]
+pub struct Implements {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub implementer: Identifier,
+    pub implementee: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct ImplicitStringifierOperation {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Includes {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub includee: Identifier,
+    pub includer: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Interface {
+    Callback(CallbackInterface),
+    NonPartial(NonPartialInterface),
+    Partial(PartialInterface),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum InterfaceMember {
+    Attribute(Attribute),
+    Const(Const),
+    Iterable(Iterable),
+    Maplike(Maplike),
+    Operation(Operation),
+    Setlike(Setlike),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Iterable {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub key_type: Option<Box<Type>>,
+    pub value_type: Box<Type>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Maplike {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub key_type: Box<Type>,
+    pub read_only: bool,
+    pub value_type: Box<Type>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Mixin {
+    NonPartial(NonPartialMixin),
+    Partial(PartialMixin),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum MixinMember {
+    Attribute(Attribute),
+    Const(Const),
+    Operation(Operation),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct NamedArgumentListExtendedAttribute {
+    pub lhs_name: Identifier,
+    pub rhs_arguments: Vec<Argument>,
+    pub rhs_name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Namespace {
+    NonPartial(NonPartialNamespace),
+    Partial(PartialNamespace),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum NamespaceMember {
+    Attribute(Attribute),
+    Operation(Operation),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct NonPartialDictionary {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub inherits: Option<Identifier>,
+    pub members: Vec<DictionaryMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct NonPartialInterface {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub inherits: Option<Identifier>,
+    pub members: Vec<InterfaceMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct NonPartialMixin {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<MixinMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct NonPartialNamespace {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<NamespaceMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Operation {
+    Regular(RegularOperation),
+    Special(SpecialOperation),
+    Static(StaticOperation),
+    Stringifier(StringifierOperation),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum Other {
+    Any,
+    ArrayBuffer,
+    Attribute,
+    Boolean,
+    Byte,
+    ByteString,
+    Callback,
+    Const,
+    DOMString,
+    DataView,
+    Deleter,
+    Dictionary,
+    Double,
+    Enum,
+    False,
+    Float,
+    Float32Array,
+    Float64Array,
+    FrozenArray,
+    Getter,
+    Implements,
+    Includes,
+    Inherit,
+    Int16Array,
+    Int32Array,
+    Int8Array,
+    Interface,
+    Iterable,
+    LegacyCaller,
+    Long,
+    Maplike,
+    Namespace,
+    NegativeInfinity,
+    NaN,
+    Null,
+    Object,
+    Octet,
+    Optional,
+    Or,
+    Partial,
+    PositiveInfinity,
+    Required,
+    Sequence,
+    Setlike,
+    Setter,
+    Short,
+    Static,
+    Stringifier,
+    True,
+    Typedef,
+    USVString,
+    Uint16Array,
+    Uint32Array,
+    Uint8Array,
+    Uint8ClampedArray,
+    Unrestricted,
+    Unsigned,
+    Void,
+
+    FloatLiteral(f64),
+    Identifier(Identifier),
+    IntegerLiteral(i64),
+    OtherLiteral(char),
+    StringLiteral(String),
+
+    Colon,
+    Ellipsis,
+    Equals,
+    GreaterThan,
+    Hyphen,
+    LessThan,
+    Period,
+    QuestionMark,
+    Semicolon,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum OtherExtendedAttribute {
+    Nested {
+        group_type: OtherExtendedAttributeGroupType,
+        inner: Option<Box<ExtendedAttribute>>,
+        rest: Option<Box<ExtendedAttribute>>,
+    },
+    Other {
+        other: Option<Other>,
+        rest: Option<Box<ExtendedAttribute>>,
+    },
+}
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum OtherExtendedAttributeGroupType {
+    Brace,
+    Bracket,
+    Parenthesis,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct PartialDictionary {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<DictionaryMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct PartialInterface {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<InterfaceMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct PartialMixin {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<MixinMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct PartialNamespace {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub members: Vec<NamespaceMember>,
+    pub name: Identifier,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct RegularAttribute {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub inherits: bool,
+    pub name: Identifier,
+    pub read_only: bool,
+    pub type_: Box<Type>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct RegularOperation {
+    pub arguments: Vec<Argument>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Option<Identifier>,
+    pub return_type: ReturnType,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum ReturnType {
+    NonVoid(Box<Type>),
+    Void,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Setlike {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub read_only: bool,
+    pub type_: Box<Type>,
+}
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum Special {
+    Deleter,
+    Getter,
+    LegacyCaller,
+    Setter,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct SpecialOperation {
+    pub arguments: Vec<Argument>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Option<Identifier>,
+    pub return_type: ReturnType,
+    pub special_keywords: Vec<Special>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct StaticAttribute {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub read_only: bool,
+    pub type_: Box<Type>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct StaticOperation {
+    pub arguments: Vec<Argument>,
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Option<Identifier>,
+    pub return_type: ReturnType,
+}
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub enum StringType {
+    ByteString,
+    DOMString,
+    USVString,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct StringifierAttribute {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub read_only: bool,
+    pub type_: Box<Type>,
+}
+
+#[allow(variant_size_differences)]
+#[derive(Clone, Debug, PartialEq)]
+pub enum StringifierOperation {
+    Explicit(ExplicitStringifierOperation),
+    Implicit(ImplicitStringifierOperation),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Type {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub kind: TypeKind,
+    pub nullable: bool,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub enum TypeKind {
+    Any,
+    ArrayBuffer,
+    Boolean,
+    Byte,
+    ByteString,
+    DOMString,
+    DataView,
+    Error,
+    Float32Array,
+    Float64Array,
+    FrozenArray(Box<Type>),
+    Identifier(Identifier),
+    Int16Array,
+    Int32Array,
+    Int8Array,
+    Octet,
+    Object,
+    Promise(ReturnType),
+    Record(StringType, Box<Type>),
+    RestrictedDouble,
+    RestrictedFloat,
+    Sequence(Box<Type>),
+    SignedLong,
+    SignedLongLong,
+    SignedShort,
+    Symbol,
+    USVString,
+    Uint16Array,
+    Uint32Array,
+    Uint8Array,
+    Uint8ClampedArray,
+    Union(Vec<Box<Type>>),
+    UnrestrictedDouble,
+    UnrestrictedFloat,
+    UnsignedLong,
+    UnsignedLongLong,
+    UnsignedShort,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Typedef {
+    pub extended_attributes: Vec<Box<ExtendedAttribute>>,
+    pub name: Identifier,
+    pub type_: Box<Type>,
+}
+
+/// Consumes a vector of ASTs that are flattened into a single AST. This is helpful if you want to
+/// merge ASTs from multiple files and be able to use the visitor pattern across all of them.
+pub fn flatten_asts(asts: Vec<AST>) -> AST {
+    asts.into_iter().flat_map(|ast| ast).collect()
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn test_flatten_asts() {
+        let ast1 = vec![
+            Definition::Interface(Interface::NonPartial(NonPartialInterface {
+                extended_attributes: vec![],
+                inherits: None,
+                members: vec![],
+                name: "Node".to_string(),
+            })),
+        ];
+        let ast2 = vec![
+            Definition::Typedef(Typedef {
+                extended_attributes: vec![],
+                name: "Typedef".to_string(),
+                type_: Box::new(Type {
+                    extended_attributes: vec![],
+                    kind: TypeKind::Any,
+                    nullable: false,
+                }),
+            }),
+        ];
+
+        assert_eq!(
+            flatten_asts(vec![ast1.clone(), ast2.clone()]),
+            vec![ast1[0].clone(), ast2[0].clone()]
+        );
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/parser/grammar.lalrpop
@@ -0,0 +1,1583 @@
+use std::f64;
+
+use super::ast;
+use lexer::*;
+
+grammar;
+
+Argument: ast::Argument = {
+    <extended_attributes: ExtendedAttributeList> <argument_rest: ArgumentRest> => {
+        let mut argument_rest = argument_rest;
+        argument_rest.extended_attributes = extended_attributes;
+        argument_rest
+    }
+};
+
+ArgumentList: Vec<ast::Argument> = {
+    (<Argument> <Arguments>)? => {
+        match <> {
+            Some((argument, arguments)) => {
+                let mut arguments = arguments;
+                arguments.insert(0, argument);
+                arguments
+            }
+            None => vec![]
+        }
+    }
+};
+
+ArgumentName: ast::Identifier = {
+    ArgumentNameKeyword,
+    "Identifier"
+};
+
+ArgumentRest: ast::Argument = {
+    "optional" <type_: TypeWithExtendedAttributes> <name: ArgumentName> <default: Default> => {
+        ast::Argument {
+            extended_attributes: vec![],
+            default,
+            name,
+            optional: true,
+            type_,
+            variadic: false
+        }
+    },
+    <type_: Type> <variadic: Ellipsis> <name: ArgumentName> => {
+        ast::Argument {
+            extended_attributes: vec![],
+            default: None,
+            name,
+            optional: variadic,
+            type_,
+            variadic
+        }
+    }
+};
+
+Arguments: Vec<ast::Argument> = {
+    ("," <Argument> <Arguments>)? => {
+        match <> {
+            Some((argument, arguments)) => {
+                let mut arguments = arguments;
+                arguments.insert(0, argument);
+                arguments
+            }
+            None => vec![]
+        }
+    }
+};
+
+ArgumentNameKeyword: ast::Identifier = {
+    "attribute" => "attribute".to_string(),
+    "callback" => "callback".to_string(),
+    "const" => "const".to_string(),
+    "deleter" => "deleter".to_string(),
+    "dictionary" => "dictionary".to_string(),
+    "enum" => "enum".to_string(),
+    "getter" => "getter".to_string(),
+    "implements" => "implements".to_string(),
+    "includes" => "includes".to_string(),
+    "inherit" => "inherit".to_string(),
+    "interface" => "interface".to_string(),
+    "iterable" => "iterable".to_string(),
+    "legacycaller" => "legacycaller".to_string(),
+    "maplike" => "maplike".to_string(),
+    "namespace" => "namespace".to_string(),
+    "partial" => "partial".to_string(),
+    "required" => "required".to_string(),
+    "setlike" => "setlike".to_string(),
+    "setter" => "setter".to_string(),
+    "static" => "static".to_string(),
+    "stringifier" => "stringifier".to_string(),
+    "typedef" => "typedef".to_string(),
+    "unrestricted" => "unrestricted".to_string()
+};
+
+AttributeName: ast::Identifier = {
+    AttributeNameKeyword,
+    "Identifier"
+};
+
+AttributeNameKeyword: ast::Identifier = {
+    "required" => "required".to_string()
+};
+
+AttributeRest: (Box<ast::Type>, ast::Identifier) = {
+    "attribute" <type_: TypeWithExtendedAttributes> <name: AttributeName> ";" => (type_, name)
+};
+
+BooleanLiteral: bool = {
+    "true" => true,
+    "false" => false
+};
+
+BufferRelatedType: ast::BufferRelatedType = {
+    "ArrayBuffer" => ast::BufferRelatedType::ArrayBuffer,
+    "DataView" => ast::BufferRelatedType::DataView,
+    "Int8Array" => ast::BufferRelatedType::Int8Array,
+    "Int16Array" => ast::BufferRelatedType::Int16Array,
+    "Int32Array" => ast::BufferRelatedType::Int32Array,
+    "Uint8Array" => ast::BufferRelatedType::Uint8Array,
+    "Uint16Array" => ast::BufferRelatedType::Uint16Array,
+    "Uint32Array" => ast::BufferRelatedType::Uint32Array,
+    "Uint8ClampedArray" => ast::BufferRelatedType::Uint8ClampedArray,
+    "Float32Array" => ast::BufferRelatedType::Float32Array,
+    "Float64Array" => ast::BufferRelatedType::Float64Array,
+};
+
+CallbackOrInterfaceOrMixin: ast::Definition = {
+    "callback" <CallbackRestOrInterface>,
+    "interface" <InterfaceOrMixin>,
+};
+
+CallbackRest: ast::Callback = {
+    <name: "Identifier"> "=" <return_type: ReturnType> "(" <arguments: ArgumentList> ")" ";" => {
+        ast::Callback {
+            arguments,
+            extended_attributes: vec![],
+            name,
+            return_type
+        }
+    }
+};
+
+CallbackRestOrInterface: ast::Definition = {
+    CallbackRest => ast::Definition::Callback(<>),
+    "interface" <InterfaceRest> => {
+        ast::Definition::Interface(ast::Interface::Callback(ast::CallbackInterface {
+            extended_attributes: vec![],
+            inherits: <>.1,
+            members: <>.2,
+            name: <>.0
+        }))
+    }
+};
+
+Const: ast::Const = {
+    "const" <type_: ConstType> <name: "Identifier"> "=" <value: ConstValue> ";" => {
+        ast::Const {
+            extended_attributes: vec![],
+            name,
+            nullable: type_.1,
+            type_: type_.0,
+            value
+        }
+    }
+};
+
+ConstType: (ast::ConstType, bool) = {
+    <type_: PrimitiveType> <nullable: Null> => {
+        let type_ = match type_ {
+            ast::PrimitiveType::Boolean => ast::ConstType::Boolean,
+            ast::PrimitiveType::Byte => ast::ConstType::Byte,
+            ast::PrimitiveType::Octet => ast::ConstType::Octet,
+            ast::PrimitiveType::UnrestrictedFloat(unrestricted_float_type) => {
+                match unrestricted_float_type {
+                    ast::UnrestrictedFloatType::RestrictedDouble => {
+                        ast::ConstType::RestrictedDouble
+                    }
+                    ast::UnrestrictedFloatType::RestrictedFloat => ast::ConstType::RestrictedFloat,
+                    ast::UnrestrictedFloatType::UnrestrictedDouble => {
+                        ast::ConstType::UnrestrictedDouble
+                    }
+                    ast::UnrestrictedFloatType::UnrestrictedFloat => {
+                        ast::ConstType::UnrestrictedFloat
+                    }
+                }
+            }
+            ast::PrimitiveType::UnsignedInteger(unsigned_integer_type) => {
+                match unsigned_integer_type {
+                    ast::UnsignedIntegerType::SignedLong => ast::ConstType::SignedLong,
+                    ast::UnsignedIntegerType::SignedLongLong => ast::ConstType::SignedLongLong,
+                    ast::UnsignedIntegerType::SignedShort => ast::ConstType::SignedShort,
+                    ast::UnsignedIntegerType::UnsignedLong => ast::ConstType::UnsignedLong,
+                    ast::UnsignedIntegerType::UnsignedLongLong => ast::ConstType::UnsignedLongLong,
+                    ast::UnsignedIntegerType::UnsignedShort => ast::ConstType::UnsignedShort
+                }
+            }
+        };
+
+        (type_, nullable)
+    },
+    <type_: "Identifier"> <nullable: Null> => {
+        (ast::ConstType::Identifier(type_), nullable)
+    }
+};
+
+ConstValue: ast::ConstValue = {
+    BooleanLiteral => ast::ConstValue::BooleanLiteral(<>),
+    FloatLiteral => ast::ConstValue::FloatLiteral(<>),
+    "IntegerLiteral" => ast::ConstValue::IntegerLiteral(<>),
+    "null" => ast::ConstValue::Null
+};
+
+Default: Option<ast::DefaultValue> = {
+    ("=" <DefaultValue>)?
+};
+
+DefaultValue: ast::DefaultValue = {
+    ConstValue => ast::DefaultValue::ConstValue(<>),
+    "StringLiteral" => ast::DefaultValue::StringLiteral(<>),
+    "[" "]" => ast::DefaultValue::EmptySequence
+};
+
+Definition: ast::Definition = {
+    CallbackOrInterfaceOrMixin,
+    Namespace => {
+        ast::Definition::Namespace(ast::Namespace::NonPartial(ast::NonPartialNamespace {
+            extended_attributes: vec![],
+            members: <>.1,
+            name: <>.0
+        }))
+    },
+    Partial,
+    Dictionary => ast::Definition::Dictionary(<>),
+    Enum => ast::Definition::Enum(<>),
+    Typedef => ast::Definition::Typedef(<>),
+    IncludesStatement => ast::Definition::Includes(<>),
+    ImplementsStatement => ast::Definition::Implements(<>)
+};
+
+pub Definitions: Vec<ast::Definition> = {
+    (<ExtendedAttributeList> <Definition> <Definitions>)? => {
+        match <> {
+            Some((extended_attributes, definition, definitions)) => {
+                let mut definition = definition;
+
+                match definition {
+                    ast::Definition::Callback(ref mut callback) => {
+                        callback.extended_attributes = extended_attributes;
+                    }
+                    ast::Definition::Dictionary(ref mut dictionary) => {
+                        match *dictionary {
+                            ast::Dictionary::NonPartial(ref mut non_partial_dictionary) => {
+                                non_partial_dictionary.extended_attributes = extended_attributes;
+                            }
+                            ast::Dictionary::Partial(ref mut partial_dictionary) => {
+                                partial_dictionary.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::Definition::Enum(ref mut enum_definition) => {
+                        enum_definition.extended_attributes = extended_attributes;
+                    }
+                    ast::Definition::Implements(ref mut implements) => {
+                        implements.extended_attributes = extended_attributes;
+                    }
+                    ast::Definition::Includes(ref mut includes) => {
+                        includes.extended_attributes = extended_attributes;
+                    }
+                    ast::Definition::Interface(ref mut interface) => {
+                        match *interface {
+                            ast::Interface::Callback(ref mut callback_interface) => {
+                                callback_interface.extended_attributes = extended_attributes;
+                            }
+                            ast::Interface::NonPartial(ref mut non_partial_interface) => {
+                                non_partial_interface.extended_attributes = extended_attributes;
+                            }
+                            ast::Interface::Partial(ref mut partial_interface) => {
+                                partial_interface.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::Definition::Mixin(ref mut mixin) => {
+                        match *mixin {
+                            ast::Mixin::NonPartial(ref mut non_partial_mixin) => {
+                                non_partial_mixin.extended_attributes = extended_attributes;
+                            }
+                            ast::Mixin::Partial(ref mut partial_mixin) => {
+                                partial_mixin.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::Definition::Namespace(ref mut namespace) => {
+                        match *namespace {
+                            ast::Namespace::NonPartial(ref mut non_partial_namespace) => {
+                                non_partial_namespace.extended_attributes = extended_attributes;
+                            }
+                            ast::Namespace::Partial(ref mut partial_namespace) => {
+                                partial_namespace.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::Definition::Typedef(ref mut typedef) => {
+                        typedef.extended_attributes = extended_attributes;
+                    }
+                }
+
+                let mut definitions = definitions;
+                definitions.insert(0, definition);
+                definitions
+            }
+            None => vec![]
+        }
+    }
+};
+
+Dictionary: ast::Dictionary = {
+    "dictionary" <name: "Identifier"> <inherits: Inheritance>
+    "{" <members: DictionaryMembers> "}" ";" => {
+        ast::Dictionary::NonPartial(ast::NonPartialDictionary {
+            extended_attributes: vec![],
+            inherits,
+            members,
+            name
+        })
+    }
+};
+
+DictionaryMember: ast::DictionaryMember = {
+    <extended_attributes: ExtendedAttributeList> <dictionary_member_rest: DictionaryMemberRest> => {
+        let mut dictionary_member_rest = dictionary_member_rest;
+        dictionary_member_rest.extended_attributes = extended_attributes;
+        dictionary_member_rest
+    }
+};
+
+DictionaryMemberRest: ast::DictionaryMember = {
+    "required" <type_: TypeWithExtendedAttributes> <name: "Identifier"> <default: Default> ";" => {
+        ast::DictionaryMember {
+            default,
+            extended_attributes: vec![],
+            name,
+            required: true,
+            type_
+        }
+    },
+    <type_: Type> <name: "Identifier"> <default: Default> ";" => {
+        ast::DictionaryMember {
+            default,
+            extended_attributes: vec![],
+            name,
+            required: false,
+            type_
+        }
+    }
+};
+
+DictionaryMembers: Vec<ast::DictionaryMember> = {
+    (<DictionaryMember> <DictionaryMembers>)? => {
+        match <> {
+            Some((member, members)) => {
+                let mut members = members;
+                members.insert(0, member);
+                members
+            }
+            None => vec![]
+        }
+    }
+};
+
+Ellipsis: bool = {
+    "..."? => <>.is_some()
+};
+
+Enum: ast::Enum = {
+    "enum" <name: "Identifier"> "{" <variants: EnumValueList> "}" ";" => {
+        ast::Enum {
+            extended_attributes: vec![],
+            name,
+            variants
+        }
+    }
+};
+
+EnumValueList: Vec<String> = {
+    <variant: "StringLiteral"> <variants: EnumValueListComma> => {
+        let mut variants = variants;
+        variants.insert(0, variant);
+        variants
+    }
+};
+
+EnumValueListComma: Vec<String> = {
+    ("," <EnumValueListString>)? => {
+        match <> {
+            Some(variants) => variants,
+            None => vec![]
+        }
+    }
+};
+
+EnumValueListString: Vec<String> = {
+    (<"StringLiteral"> <EnumValueListComma>)? => {
+        match <> {
+            Some((variant, variants)) => {
+                let mut variants = variants;
+                variants.insert(0, variant);
+                variants
+            }
+            None => vec![]
+        }
+    }
+};
+
+ExtendedAttribute: Box<ast::ExtendedAttribute> = {
+    ExtendedAttributeArgList,
+    ExtendedAttributeIdent,
+    ExtendedAttributeIdentList,
+    ExtendedAttributeNamedArgList,
+    ExtendedAttributeNoArgs,
+    // ExtendedAttributeOther
+};
+
+ExtendedAttributeInner: Box<ast::ExtendedAttribute> = {
+    ExtendedAttributeArgList,
+    ExtendedAttributeIdent,
+    ExtendedAttributeIdentList,
+    ExtendedAttributeNamedArgList,
+    ExtendedAttributeNoArgs,
+    // ExtendedAttributeOtherInner
+};
+
+ExtendedAttributeArgList: Box<ast::ExtendedAttribute> = {
+    <name: "Identifier"> "(" <arguments: ArgumentList> ")" => {
+        Box::new(ast::ExtendedAttribute::ArgumentList(ast::ArgumentListExtendedAttribute {
+            arguments,
+            name
+        }))
+    }
+};
+
+ExtendedAttributeIdent: Box<ast::ExtendedAttribute> = {
+    <lhs: "Identifier"> "=" <rhs: Other> => {
+        Box::new(ast::ExtendedAttribute::Identifier(ast::IdentifierExtendedAttribute {
+            lhs,
+            rhs
+        }))
+    }
+};
+
+ExtendedAttributeIdentList: Box<ast::ExtendedAttribute> = {
+    <lhs: "Identifier"> "=" "(" <rhs: IdentifierList> ")" => {
+        Box::new(ast::ExtendedAttribute::IdentifierList(ast::IdentifierListExtendedAttribute {
+            lhs,
+            rhs
+        }))
+    }
+};
+
+ExtendedAttributeList: Vec<Box<ast::ExtendedAttribute>> = {
+    ("[" <ExtendedAttribute> <ExtendedAttributes> "]")? => {
+        match <> {
+            Some((extended_attribute, extended_attributes)) => {
+                let mut extended_attributes = extended_attributes;
+                extended_attributes.insert(0, extended_attribute);
+                extended_attributes
+            }
+            None => vec![]
+        }
+    }
+};
+
+ExtendedAttributeNamedArgList: Box<ast::ExtendedAttribute> = {
+    <lhs_name: "Identifier"> "=" <rhs_name: "Identifier">
+    "(" <rhs_arguments: ArgumentList> ")" => {
+        Box::new(ast::ExtendedAttribute::NamedArgumentList(ast::NamedArgumentListExtendedAttribute {
+            lhs_name,
+            rhs_name,
+            rhs_arguments
+        }))
+    }
+};
+
+ExtendedAttributeNoArgs: Box<ast::ExtendedAttribute> = {
+    Other => Box::new(ast::ExtendedAttribute::NoArguments(<>))
+};
+
+// ExtendedAttributeOther: Box<ast::ExtendedAttribute> = {
+//     "(" <inner: ExtendedAttributeInner?> ")" <rest: ExtendedAttribute?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Parenthesis,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     "[" <inner: ExtendedAttributeInner?> "]" <rest: ExtendedAttribute?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Bracket,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     "{" <inner: ExtendedAttributeInner?> "}" <rest: ExtendedAttribute?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Brace,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     <other: Other> <rest: ExtendedAttribute?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Other {
+//             other: Some(other),
+//             rest: rest
+//         }))
+//     }
+// };
+//
+// ExtendedAttributeOtherInner: Box<ast::ExtendedAttribute> = {
+//     "(" <inner: ExtendedAttributeInner?> ")" <rest: ExtendedAttributeInner?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Parenthesis,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     "[" <inner: ExtendedAttributeInner?> "]" <rest: ExtendedAttributeInner?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Bracket,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     "{" <inner: ExtendedAttributeInner?> "}" <rest: ExtendedAttributeInner?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Nested {
+//             group_type: ast::OtherExtendedAttributeGroupType::Brace,
+//             inner: inner,
+//             rest: rest
+//         }))
+//     },
+//     <other: OtherOrComma> <rest: ExtendedAttributeInner?> => {
+//         Box::new(ast::ExtendedAttribute::Other(ast::OtherExtendedAttribute::Other {
+//             other: other,
+//             rest: rest
+//         }))
+//     }
+// };
+
+ExtendedAttributes: Vec<Box<ast::ExtendedAttribute>> = {
+    ("," <ExtendedAttribute> <ExtendedAttributes>)? => {
+        match <> {
+            Some((extended_attribute, extended_attributes)) => {
+                let mut extended_attributes = extended_attributes;
+                extended_attributes.insert(0, extended_attribute);
+                extended_attributes
+            }
+            None => vec![]
+        }
+    }
+};
+
+FloatLiteral: f64 = {
+    "FloatLiteral",
+    "-Infinity" => f64::NEG_INFINITY,
+    "Infinity" => f64::INFINITY,
+    "NaN" => f64::NAN
+};
+
+IdentifierList: Vec<ast::Identifier> = {
+    <identifier: "Identifier"> <identifiers: Identifiers> => {
+        let mut identifiers = identifiers;
+        identifiers.insert(0, identifier);
+        identifiers
+    }
+};
+
+Identifiers: Vec<ast::Identifier> = {
+    ("," <"Identifier"> <Identifiers>)? => {
+        match <> {
+            Some((identifier, identifiers)) => {
+                let mut identifiers = identifiers;
+                identifiers.insert(0, identifier);
+                identifiers
+            }
+            None => vec![]
+        }
+    }
+};
+
+ImplementsStatement: ast::Implements = {
+    <implementer: "Identifier"> "implements" <implementee: "Identifier"> ";" => {
+        ast::Implements {
+            extended_attributes: vec![],
+            implementee,
+            implementer
+        }
+    }
+};
+
+IncludesStatement: ast::Includes = {
+    <includer: "Identifier"> "includes" <includee: "Identifier"> ";" => {
+        ast::Includes {
+            extended_attributes: vec![],
+            includee,
+            includer
+        }
+    }
+};
+
+Inherit: bool = {
+    "inherit"? => <>.is_some()
+};
+
+Inheritance: Option<ast::Identifier> = {
+    (":" <"Identifier">)?
+};
+
+InterfaceOrMixin: ast::Definition = {
+    InterfaceRest => {
+        ast::Definition::Interface(ast::Interface::NonPartial(ast::NonPartialInterface {
+            extended_attributes: vec![],
+            inherits: <>.1,
+            members: <>.2,
+            name: <>.0
+        }))
+    },
+    MixinRest => {
+        ast::Definition::Mixin(ast::Mixin::NonPartial(ast::NonPartialMixin {
+            extended_attributes: vec![],
+            members: <>.1,
+            name: <>.0
+        }))
+    }
+};
+
+InterfaceMember: ast::InterfaceMember = {
+    Const => ast::InterfaceMember::Const(<>),
+    Operation => ast::InterfaceMember::Operation(<>),
+    Stringifier => {
+        match <> {
+            ast::Stringifier::Attribute(attribute) => ast::InterfaceMember::Attribute(attribute),
+            ast::Stringifier::Operation(operation) => ast::InterfaceMember::Operation(operation)
+        }
+    },
+    StaticMember,
+    Iterable => ast::InterfaceMember::Iterable(<>),
+    ReadOnlyMember,
+    ReadWriteAttribute => ast::InterfaceMember::Attribute(<>),
+    ReadWriteMaplike => {
+        ast::InterfaceMember::Maplike(ast::Maplike {
+            extended_attributes: vec![],
+            key_type: <>.0,
+            read_only: false,
+            value_type: <>.1
+        })
+    },
+    ReadWriteSetlike => {
+        ast::InterfaceMember::Setlike(ast::Setlike {
+            extended_attributes: vec![],
+            read_only: false,
+            type_: <>
+        })
+    }
+};
+
+InterfaceMembers: Vec<ast::InterfaceMember> = {
+    (<ExtendedAttributeList> <InterfaceMember> <InterfaceMembers>)? => {
+        match <> {
+            Some((extended_attributes, member, members)) => {
+                let mut member = member;
+
+                match member {
+                    ast::InterfaceMember::Attribute(ref mut attribute) => {
+                        match *attribute {
+                            ast::Attribute::Regular(ref mut regular_attribute) => {
+                                regular_attribute.extended_attributes = extended_attributes;
+                            }
+                            ast::Attribute::Static(ref mut static_attribute) => {
+                                static_attribute.extended_attributes = extended_attributes;
+                            }
+                            ast::Attribute::Stringifier(ref mut stringifier_attribute) => {
+                                stringifier_attribute.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::InterfaceMember::Const(ref mut const_) => {
+                        const_.extended_attributes = extended_attributes;
+                    }
+                    ast::InterfaceMember::Iterable(ref mut iterable) => {
+                        iterable.extended_attributes = extended_attributes;
+                    }
+                    ast::InterfaceMember::Maplike(ref mut maplike) => {
+                        maplike.extended_attributes = extended_attributes;
+                    }
+                    ast::InterfaceMember::Operation(ref mut operation) => {
+                        match *operation {
+                            ast::Operation::Regular(ref mut regular_operation) => {
+                                regular_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Special(ref mut special_operation) => {
+                                special_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Static(ref mut static_operation) => {
+                                static_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Stringifier(ref mut stringifier_operation) => {
+                                match *stringifier_operation {
+                                    ast::StringifierOperation::Explicit(ref mut explicit_stringifer_operation) => {
+                                        explicit_stringifer_operation.extended_attributes = extended_attributes;
+                                    }
+                                    ast::StringifierOperation::Implicit(ref mut implicit_stringifier_operation) => {
+                                        implicit_stringifier_operation.extended_attributes = extended_attributes;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    ast::InterfaceMember::Setlike(ref mut setlike) => {
+                        setlike.extended_attributes = extended_attributes;
+                    }
+                }
+
+                let mut members = members;
+                members.insert(0, member);
+                members
+            }
+            None => vec![]
+        }
+    }
+};
+
+InterfaceRest: (ast::Identifier, Option<ast::Identifier>, Vec<ast::InterfaceMember>) = {
+    <name: "Identifier"> <inherits: Inheritance> "{" <members: InterfaceMembers> "}" ";" => {
+        (name, inherits, members)
+    }
+};
+
+Iterable: ast::Iterable = {
+    "iterable" "<" <key_type: TypeWithExtendedAttributes> <value_type: OptionalType> ">" ";" => {
+        match value_type {
+            Some(value_type) => {
+                ast::Iterable {
+                    extended_attributes: vec![],
+                    key_type: Some(key_type),
+                    value_type
+                }
+            }
+            None => {
+                ast::Iterable {
+                    extended_attributes: vec![],
+                    key_type: None,
+                    value_type: key_type
+                }
+            }
+        }
+    }
+};
+
+MaplikeRest: (Box<ast::Type>, Box<ast::Type>) = {
+    "maplike" "<" <key_type: TypeWithExtendedAttributes> ","
+    <value_type: TypeWithExtendedAttributes> ">" ";" => {
+        (key_type, value_type)
+    }
+};
+
+MixinMember: ast::MixinMember = {
+    Const => ast::MixinMember::Const(<>),
+    RegularOperation => {
+        ast::MixinMember::Operation(ast::Operation::Regular(ast::RegularOperation {
+            arguments: <>.2,
+            extended_attributes: vec![],
+            name: <>.1,
+            return_type: <>.0
+        }))
+    },
+    Stringifier => {
+        match <> {
+            ast::Stringifier::Attribute(attribute) => ast::MixinMember::Attribute(attribute),
+            ast::Stringifier::Operation(operation) => ast::MixinMember::Operation(operation)
+        }
+    },
+    <read_only: ReadOnly> <attribute: AttributeRest> => {
+        ast::MixinMember::Attribute(ast::Attribute::Regular(ast::RegularAttribute {
+            extended_attributes: vec![],
+            inherits: false,
+            name: attribute.1,
+            read_only: read_only,
+            type_: attribute.0
+        }))
+    }
+};
+
+MixinMembers: Vec<ast::MixinMember> = {
+    (<ExtendedAttributeList> <MixinMember> <MixinMembers>)? => {
+        match <> {
+            Some((extended_attributes, member, members)) => {
+                let mut member = member;
+
+                match member {
+                    ast::MixinMember::Attribute(ref mut attribute) => {
+                        match *attribute {
+                            ast::Attribute::Regular(ref mut regular_attribute) => {
+                                regular_attribute.extended_attributes = extended_attributes;
+                            }
+                            ast::Attribute::Static(ref mut static_attribute) => {
+                                static_attribute.extended_attributes = extended_attributes;
+                            }
+                            ast::Attribute::Stringifier(ref mut stringifier_attribute) => {
+                                stringifier_attribute.extended_attributes = extended_attributes;
+                            }
+                        }
+                    }
+                    ast::MixinMember::Const(ref mut const_) => {
+                        const_.extended_attributes = extended_attributes;
+                    }
+                    ast::MixinMember::Operation(ref mut operation) => {
+                        match *operation {
+                            ast::Operation::Regular(ref mut regular_operation) => {
+                                regular_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Special(ref mut special_operation) => {
+                                special_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Static(ref mut static_operation) => {
+                                static_operation.extended_attributes = extended_attributes;
+                            }
+                            ast::Operation::Stringifier(ref mut stringifier_operation) => {
+                                match *stringifier_operation {
+                                    ast::StringifierOperation::Explicit(ref mut explicit_stringifer_operation) => {
+                                        explicit_stringifer_operation.extended_attributes = extended_attributes;
+                                    }
+                                    ast::StringifierOperation::Implicit(ref mut implicit_stringifier_operation) => {
+                                        implicit_stringifier_operation.extended_attributes = extended_attributes;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                let mut members = members;
+                members.insert(0, member);
+                members
+            }
+            None => vec![]
+        }
+    }
+};
+
+MixinRest: (ast::Identifier, Vec<ast::MixinMember>) = {
+    "mixin" <name: "Identifier"> "{" <members: MixinMembers> "}" ";" => {
+        (name, members)
+    }
+};
+
+Namespace: (ast::Identifier, Vec<ast::NamespaceMember>) = {
+    "namespace" <name: "Identifier"> "{" <members: NamespaceMembers> "}" ";" => {
+        (name, members)
+    }
+};
+
+NamespaceMember: ast::NamespaceMember = {
+    RegularOperation => {
+        ast::NamespaceMember::Operation(ast::Operation::Regular(ast::RegularOperation {
+            arguments: <>.2,
+            extended_attributes: vec![],
+            name: <>.1,
+            return_type: <>.0
+        }))
+    },
+    "readonly" <AttributeRest> => {
+        ast::NamespaceMember::Attribute(ast::Attribute::Regular(ast::RegularAttribute {
+            extended_attributes: vec![],
+            inherits: false,
+            name: <>.1,
+            read_only: true,
+            type_: <>.0
+        }))
+    }
+};
+
+NamespaceMembers: Vec<ast::NamespaceMember> = {
+    (<ExtendedAttributeList> <NamespaceMember> <NamespaceMembers>)? => {
+        match <> {
+            Some((extended_attributes, member, members)) => {
+                let mut member = member;
+
+                match member {
+                    ast::NamespaceMember::Attribute(ref mut attribute) => {
+                        match *attribute {
+                            ast::Attribute::Regular(ref mut regular_attribute) => {
+                                regular_attribute.extended_attributes = extended_attributes;
+                            }
+                            _ => panic!("Namespaces can only have regular attributes")
+                        }
+                    }
+                    ast::NamespaceMember::Operation(ref mut operation) => {
+                        match *operation {
+                            ast::Operation::Regular(ref mut regular_operation) => {
+                                regular_operation.extended_attributes = extended_attributes;
+                            }
+                            _ => panic!("Namespaces can only have regular operations")
+                        }
+                    }
+                }
+
+                let mut members = members;
+                members.insert(0, member);
+                members
+            }
+            None => vec![]
+        }
+    }
+};
+
+NonAnyType: Box<ast::Type> = {
+    PromiseType => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable: false,
+            kind: ast::TypeKind::Promise(<>)
+        })
+    },
+    <type_: PrimitiveType> <nullable: Null> => {
+        let type_ = match type_ {
+            ast::PrimitiveType::Boolean => ast::TypeKind::Boolean,
+            ast::PrimitiveType::Byte => ast::TypeKind::Byte,
+            ast::PrimitiveType::Octet => ast::TypeKind::Octet,
+            ast::PrimitiveType::UnrestrictedFloat(unrestricted_float_type) => {
+                match unrestricted_float_type {
+                    ast::UnrestrictedFloatType::RestrictedDouble => {
+                        ast::TypeKind::RestrictedDouble
+                    }
+                    ast::UnrestrictedFloatType::RestrictedFloat => ast::TypeKind::RestrictedFloat,
+                    ast::UnrestrictedFloatType::UnrestrictedDouble => {
+                        ast::TypeKind::UnrestrictedDouble
+                    }
+                    ast::UnrestrictedFloatType::UnrestrictedFloat => {
+                        ast::TypeKind::UnrestrictedFloat
+                    }
+                }
+            }
+            ast::PrimitiveType::UnsignedInteger(unsigned_integer_type) => {
+                match unsigned_integer_type {
+                    ast::UnsignedIntegerType::SignedLong => ast::TypeKind::SignedLong,
+                    ast::UnsignedIntegerType::SignedLongLong => ast::TypeKind::SignedLongLong,
+                    ast::UnsignedIntegerType::SignedShort => ast::TypeKind::SignedShort,
+                    ast::UnsignedIntegerType::UnsignedLong => ast::TypeKind::UnsignedLong,
+                    ast::UnsignedIntegerType::UnsignedLongLong => ast::TypeKind::UnsignedLongLong,
+                    ast::UnsignedIntegerType::UnsignedShort => ast::TypeKind::UnsignedShort
+                }
+            }
+        };
+
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: type_
+        })
+    },
+    <type_: StringType> <nullable: Null> => {
+        let type_ = match type_ {
+            ast::StringType::ByteString => ast::TypeKind::ByteString,
+            ast::StringType::DOMString => ast::TypeKind::DOMString,
+            ast::StringType::USVString => ast::TypeKind::USVString
+        };
+
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: type_
+        })
+    },
+    <type_: "Identifier"> <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable: nullable,
+            kind: ast::TypeKind::Identifier(type_)
+        })
+    },
+    "sequence" "<" <type_: TypeWithExtendedAttributes> ">" <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Sequence(type_)
+        })
+    },
+    "object" <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Object
+        })
+    },
+    "symbol" <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Symbol
+        })
+    },
+    "Error" <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Error
+        })
+    },
+    <type_: BufferRelatedType> <nullable: Null> => {
+        let type_ = match type_ {
+            ast::BufferRelatedType::ArrayBuffer => ast::TypeKind::ArrayBuffer,
+            ast::BufferRelatedType::DataView => ast::TypeKind::DataView,
+            ast::BufferRelatedType::Float32Array => ast::TypeKind::Float32Array,
+            ast::BufferRelatedType::Float64Array => ast::TypeKind::Float64Array,
+            ast::BufferRelatedType::Int16Array => ast::TypeKind::Int16Array,
+            ast::BufferRelatedType::Int32Array => ast::TypeKind::Int32Array,
+            ast::BufferRelatedType::Int8Array => ast::TypeKind::Int8Array,
+            ast::BufferRelatedType::Uint16Array => ast::TypeKind::Uint16Array,
+            ast::BufferRelatedType::Uint32Array => ast::TypeKind::Uint32Array,
+            ast::BufferRelatedType::Uint8Array => ast::TypeKind::Uint8Array,
+            ast::BufferRelatedType::Uint8ClampedArray => ast::TypeKind::Uint8ClampedArray
+        };
+
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: type_
+        })
+    },
+    "FrozenArray" "<" <type_: TypeWithExtendedAttributes> ">" <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::FrozenArray(type_)
+        })
+    },
+    <type_: RecordType> <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Record(type_.0, type_.1)
+        })
+    }
+};
+
+Null: bool = {
+    "?"? => <>.is_some()
+};
+
+Operation: ast::Operation = {
+    <return_type: ReturnType> <operation_rest: OperationRest> => {
+        ast::Operation::Regular(ast::RegularOperation {
+            arguments: operation_rest.1,
+            extended_attributes: vec![],
+            name: operation_rest.0,
+            return_type
+        })
+    },
+    SpecialOperation
+};
+
+OptionalIdentifier: Option<ast::Identifier> = {
+    "Identifier"?
+};
+
+OptionalType: Option<Box<ast::Type>> = {
+    ("," <TypeWithExtendedAttributes>)?
+};
+
+OperationRest: (Option<ast::Identifier>, Vec<ast::Argument>) = {
+    <name: OptionalIdentifier> "(" <arguments: ArgumentList> ")" ";" => {
+        (name, arguments)
+    }
+};
+
+Other: ast::Other = {
+    "any" => ast::Other::Any,
+    "ArrayBuffer" => ast::Other::ArrayBuffer,
+    "attribute" => ast::Other::Attribute,
+    "boolean" => ast::Other::Boolean,
+    "byte" => ast::Other::Byte,
+    "ByteString" => ast::Other::ByteString,
+    "callback" => ast::Other::Callback,
+    "const" => ast::Other::Const,
+    "DOMString" => ast::Other::DOMString,
+    "DataView" => ast::Other::DataView,
+    "deleter" => ast::Other::Deleter,
+    "dictionary" => ast::Other::Dictionary,
+    "double" => ast::Other::Double,
+    "enum" => ast::Other::Enum,
+    "false" => ast::Other::False,
+    "float" => ast::Other::Float,
+    "Float32Array" => ast::Other::Float32Array,
+    "Float64Array" => ast::Other::Float64Array,
+    "FrozenArray" => ast::Other::FrozenArray,
+    "getter" => ast::Other::Getter,
+    "implements" => ast::Other::Implements,
+    "includes" => ast::Other::Includes,
+    "inherit" => ast::Other::Inherit,
+    "Int16Array" => ast::Other::Int16Array,
+    "Int32Array" => ast::Other::Int32Array,
+    "Int8Array" => ast::Other::Int8Array,
+    "interface" => ast::Other::Interface,
+    "iterable" => ast::Other::Iterable,
+    "legacycaller" => ast::Other::LegacyCaller,
+    "long" => ast::Other::Long,
+    "maplike" => ast::Other::Maplike,
+    "namespace" => ast::Other::Namespace,
+    "-Infinity" => ast::Other::NegativeInfinity,
+    "NaN" => ast::Other::NaN,
+    "null" => ast::Other::Null,
+    "object" => ast::Other::Object,
+    "octet" => ast::Other::Octet,
+    "optional" => ast::Other::Optional,
+    "or" => ast::Other::Or,
+    "partial" => ast::Other::Partial,
+    "Infinity" => ast::Other::PositiveInfinity,
+    "required" => ast::Other::Required,
+    "sequence" => ast::Other::Sequence,
+    "setlike" => ast::Other::Setlike,
+    "setter" => ast::Other::Setter,
+    "short" => ast::Other::Short,
+    "static" => ast::Other::Static,
+    "stringifier" => ast::Other::Stringifier,
+    "true" => ast::Other::True,
+    "typedef" => ast::Other::Typedef,
+    "USVString" => ast::Other::USVString,
+    "Uint16Array" => ast::Other::Uint16Array,
+    "Uint32Array" => ast::Other::Uint32Array,
+    "Uint8Array" => ast::Other::Uint8Array,
+    "Uint8ClampedArray" => ast::Other::Uint8ClampedArray,
+    "unrestricted" => ast::Other::Unrestricted,
+    "unsigned" => ast::Other::Unsigned,
+    "void" => ast::Other::Void,
+
+    "FloatLiteral" => ast::Other::FloatLiteral(<>),
+    "Identifier" => ast::Other::Identifier(<>),
+    "IntegerLiteral" => ast::Other::IntegerLiteral(<>),
+    "OtherLiteral" => ast::Other::OtherLiteral(<>),
+    "StringLiteral" => ast::Other::StringLiteral(<>),
+
+    ":" => ast::Other::Colon,
+    "..." => ast::Other::Ellipsis,
+    "=" => ast::Other::Equals,
+    ">" => ast::Other::GreaterThan,
+    "-" => ast::Other::Hyphen,
+    "<" => ast::Other::LessThan,
+    "." => ast::Other::Period,
+    "?" => ast::Other::QuestionMark,
+    ";" => ast::Other::Semicolon
+};
+
+OtherOrComma: Option<ast::Other> = {
+    Other => Some(<>),
+    "," => None
+};
+
+Partial: ast::Definition = {
+    "partial" <PartialDefinition>
+};
+
+PartialDefinition: ast::Definition = {
+    "interface" <PartialInterfaceOrPartialMixin>,
+    PartialDictionary => ast::Definition::Dictionary(<>),
+    Namespace => {
+        ast::Definition::Namespace(ast::Namespace::Partial(ast::PartialNamespace {
+            extended_attributes: vec![],
+            members: <>.1,
+            name: <>.0
+        }))
+    }
+};
+
+PartialDictionary: ast::Dictionary = {
+    "dictionary" <name: "Identifier"> "{" <members: DictionaryMembers> "}" ";" => {
+        ast::Dictionary::Partial(ast::PartialDictionary {
+            extended_attributes: vec![],
+            members,
+            name
+        })
+    }
+};
+
+PartialInterfaceOrPartialMixin: ast::Definition = {
+    PartialInterfaceRest => ast::Definition::Interface(<>),
+    MixinRest => {
+        ast::Definition::Mixin(ast::Mixin::Partial(ast::PartialMixin {
+            extended_attributes: vec![],
+            members: <>.1,
+            name: <>.0
+        }))
+    }
+};
+
+PartialInterfaceRest: ast::Interface = {
+    <name: "Identifier"> "{" <members: InterfaceMembers> "}" ";" => {
+        ast::Interface::Partial(ast::PartialInterface {
+            extended_attributes: vec![],
+            members,
+            name
+        })
+    }
+};
+
+PrimitiveType: ast::PrimitiveType = {
+    UnsignedIntegerType => ast::PrimitiveType::UnsignedInteger(<>),
+    UnrestrictedFloatType => ast::PrimitiveType::UnrestrictedFloat(<>),
+    "boolean" => ast::PrimitiveType::Boolean,
+    "byte" => ast::PrimitiveType::Byte,
+    "octet" => ast::PrimitiveType::Octet
+};
+
+PromiseType: ast::ReturnType = {
+    "Promise" "<" <ReturnType> ">"
+};
+
+ReadOnly: bool = {
+    "readonly"? => <>.is_some()
+};
+
+ReadOnlyMember: ast::InterfaceMember = {
+    "readonly" <ReadOnlyMemberRest>
+};
+
+ReadOnlyMemberRest: ast::InterfaceMember = {
+    AttributeRest => {
+        ast::InterfaceMember::Attribute(ast::Attribute::Regular(ast::RegularAttribute {
+            extended_attributes: vec![],
+            inherits: false,
+            name: <>.1,
+            read_only: true,
+            type_: <>.0
+        }))
+    },
+    ReadWriteMaplike => {
+        ast::InterfaceMember::Maplike(ast::Maplike {
+            extended_attributes: vec![],
+            key_type: <>.0,
+            read_only: true,
+            value_type: <>.1
+        })
+    },
+    ReadWriteSetlike => {
+        ast::InterfaceMember::Setlike(ast::Setlike {
+            extended_attributes: vec![],
+            read_only: true,
+            type_: <>
+        })
+    }
+};
+
+ReadWriteAttribute: ast::Attribute = {
+    "inherit" <read_only: ReadOnly> <attribute_rest: AttributeRest> => {
+        ast::Attribute::Regular(ast::RegularAttribute {
+            extended_attributes: vec![],
+            inherits: true,
+            name: attribute_rest.1,
+            read_only,
+            type_: attribute_rest.0
+        })
+    },
+    AttributeRest => {
+        ast::Attribute::Regular(ast::RegularAttribute {
+            extended_attributes: vec![],
+            inherits: false,
+            name: <>.1,
+            read_only: false,
+            type_: <>.0
+        })
+    }
+};
+
+ReadWriteMaplike: (Box<ast::Type>, Box<ast::Type>) = {
+    MaplikeRest
+};
+
+ReadWriteSetlike: Box<ast::Type> = {
+    SetlikeRest
+};
+
+RecordType: (ast::StringType, Box<ast::Type>) = {
+    "record" "<" <key_type: StringType> "," <value_type: TypeWithExtendedAttributes> ">" => {
+        (key_type, value_type)
+    }
+};
+
+RegularOperation: (ast::ReturnType, Option<ast::Identifier>, Vec<ast::Argument>) = {
+    <return_type: ReturnType> <operation_rest: OperationRest> => {
+        (return_type, operation_rest.0, operation_rest.1)
+    }
+};
+
+ReturnType: ast::ReturnType = {
+    Type => ast::ReturnType::NonVoid(<>),
+    "void" => ast::ReturnType::Void
+};
+
+SetlikeRest: Box<ast::Type> = {
+    "setlike" "<" <TypeWithExtendedAttributes> ">" ";"
+};
+
+SingleType: Box<ast::Type> = {
+    NonAnyType,
+    "any" => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            kind: ast::TypeKind::Any,
+            nullable: false
+        })
+    }
+};
+
+SpecialOperation: ast::Operation = {
+    <special: Special> <specials: Specials> <operation: RegularOperation> => {
+        let mut specials = specials;
+        specials.insert(0, special);
+
+        ast::Operation::Special(ast::SpecialOperation {
+            arguments: operation.2,
+            extended_attributes: vec![],
+            name: operation.1,
+            return_type: operation.0,
+            special_keywords: specials
+        })
+    }
+};
+
+Special: ast::Special = {
+    "deleter" => ast::Special::Deleter,
+    "getter" => ast::Special::Getter,
+    "legacycaller" => ast::Special::LegacyCaller,
+    "setter" => ast::Special::Setter
+};
+
+Specials: Vec<ast::Special> = {
+    (<Special> <Specials>)? => {
+        match <> {
+            Some((special, specials)) => {
+                let mut specials = specials;
+                specials.insert(0, special);
+                specials
+            }
+            None => vec![]
+        }
+    }
+};
+
+StaticMember: ast::InterfaceMember = {
+    "static" <StaticMemberRest>
+};
+
+StaticMemberRest: ast::InterfaceMember = {
+    <read_only: ReadOnly> <attribute_rest: AttributeRest> => {
+        ast::InterfaceMember::Attribute(ast::Attribute::Static(ast::StaticAttribute {
+            extended_attributes: vec![],
+            name: attribute_rest.1,
+            read_only,
+            type_: attribute_rest.0
+        }))
+    },
+    RegularOperation => {
+        ast::InterfaceMember::Operation(ast::Operation::Static(ast::StaticOperation {
+            arguments: <>.2,
+            extended_attributes: vec![],
+            name: <>.1,
+            return_type: <>.0
+        }))
+    }
+};
+
+StringType: ast::StringType = {
+    "ByteString" => ast::StringType::ByteString,
+    "DOMString" => ast::StringType::DOMString,
+    "USVString" => ast::StringType::USVString
+};
+
+Stringifier: ast::Stringifier = {
+    "stringifier" <StringifierRest>
+};
+
+StringifierRest: ast::Stringifier = {
+    <read_only: ReadOnly> <attribute_rest: AttributeRest> => {
+        ast::Stringifier::Attribute(ast::Attribute::Stringifier(ast::StringifierAttribute {
+            extended_attributes: vec![],
+            name: attribute_rest.1,
+            read_only,
+            type_: attribute_rest.0
+        }))
+    },
+    RegularOperation => {
+        ast::Stringifier::Operation(ast::Operation::Stringifier(ast::StringifierOperation::Explicit(ast::ExplicitStringifierOperation {
+            arguments: <>.2,
+            extended_attributes: vec![],
+            name: <>.1,
+            return_type: <>.0
+        })))
+    },
+    ";" => {
+        ast::Stringifier::Operation(ast::Operation::Stringifier(ast::StringifierOperation::Implicit(ast::ImplicitStringifierOperation {
+            extended_attributes: vec![]
+        })))
+    }
+};
+
+Type: Box<ast::Type> = {
+    SingleType,
+    <type_: UnionType> <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            nullable,
+            kind: ast::TypeKind::Union(type_)
+        })
+    }
+};
+
+TypeWithExtendedAttributes: Box<ast::Type> = {
+    <extended_attributes: ExtendedAttributeList> <type_: Type> => {
+        let mut type_ = type_;
+        type_.extended_attributes = extended_attributes;
+        type_
+    }
+};
+
+Typedef: ast::Typedef = {
+    "typedef" <type_: TypeWithExtendedAttributes> <name: "Identifier"> ";" => {
+        ast::Typedef {
+            extended_attributes: vec![],
+            name: name,
+            type_: type_
+        }
+    }
+};
+
+UnionMemberType: Box<ast::Type> = {
+    <extended_attributes: ExtendedAttributeList> <type_: NonAnyType> => {
+        let mut type_ = type_;
+        type_.extended_attributes = extended_attributes;
+        type_
+    },
+    <type_: UnionType> <nullable: Null> => {
+        Box::new(ast::Type {
+            extended_attributes: vec![],
+            kind: ast::TypeKind::Union(type_),
+            nullable
+        })
+    }
+};
+
+UnionMemberTypes: Vec<Box<ast::Type>> = {
+    ("or" <UnionMemberType> <UnionMemberTypes>)? => {
+        match <> {
+            Some((member, members)) => {
+                let mut members = members;
+                members.insert(0, member);
+                members
+            }
+            None => vec![]
+        }
+    }
+};
+
+UnionType: Vec<Box<ast::Type>> = {
+    "(" <first_member: UnionMemberType> "or"
+    <second_member: UnionMemberType> <members: UnionMemberTypes> ")" => {
+        let mut members = members;
+        members.insert(0, second_member);
+        members.insert(0, first_member);
+        members
+    }
+};
+
+UnrestrictedFloatType: ast::UnrestrictedFloatType = {
+    "double" => ast::UnrestrictedFloatType::RestrictedDouble,
+    "float" => ast::UnrestrictedFloatType::RestrictedFloat,
+    "unrestricted" "double" => ast::UnrestrictedFloatType::UnrestrictedDouble,
+    "unrestricted" "float" => ast::UnrestrictedFloatType::UnrestrictedFloat,
+};
+
+UnsignedIntegerType: ast::UnsignedIntegerType = {
+    "short" => ast::UnsignedIntegerType::SignedShort,
+    "long" => ast::UnsignedIntegerType::SignedLong,
+    "long" "long" => ast::UnsignedIntegerType::SignedLongLong,
+    "unsigned" "short" => ast::UnsignedIntegerType::UnsignedShort,
+    "unsigned" "long" => ast::UnsignedIntegerType::UnsignedLong,
+    "unsigned" "long" "long" => ast::UnsignedIntegerType::UnsignedLongLong,
+};
+
+extern {
+    type Error = LexicalError;
+    type Location = usize;
+
+    enum Token {
+        // Keywords
+        "any" => Token::Any,
+        "ArrayBuffer" => Token::ArrayBuffer,
+        "attribute" => Token::Attribute,
+        "boolean" => Token::Boolean,
+        "byte" => Token::Byte,
+        "ByteString" => Token::ByteString,
+        "callback" => Token::Callback,
+        "const" => Token::Const,
+        "DataView" => Token::DataView,
+        "deleter" => Token::Deleter,
+        "dictionary" => Token::Dictionary,
+        "DOMString" => Token::DOMString,
+        "double" => Token::Double,
+        "enum" => Token::Enum,
+        "Error" => Token::Error,
+        "false" => Token::False,
+        "float" => Token::Float,
+        "Float32Array" => Token::Float32Array,
+        "Float64Array" => Token::Float64Array,
+        "FrozenArray" => Token::FrozenArray,
+        "getter" => Token::Getter,
+        "implements" => Token::Implements,
+        "includes" => Token::Includes,
+        "inherit" => Token::Inherit,
+        "Int16Array" => Token::Int16Array,
+        "Int32Array" => Token::Int32Array,
+        "Int8Array" => Token::Int8Array,
+        "interface" => Token::Interface,
+        "iterable" => Token::Iterable,
+        "legacycaller" => Token::LegacyCaller,
+        "long" => Token::Long,
+        "maplike" => Token::Maplike,
+        "mixin" => Token::Mixin,
+        "namespace" => Token::Namespace,
+        "NaN" => Token::NaN,
+        "-Infinity" => Token::NegativeInfinity,
+        "null" => Token::Null,
+        "object" => Token::Object,
+        "octet" => Token::Octet,
+        "optional" => Token::Optional,
+        "or" => Token::Or,
+        "partial" => Token::Partial,
+        "Infinity" => Token::PositiveInfinity,
+        "Promise" => Token::Promise,
+        "readonly" => Token::ReadOnly,
+        "record" => Token::Record,
+        "required" => Token::Required,
+        "sequence" => Token::Sequence,
+        "setlike" => Token::Setlike,
+        "setter" => Token::Setter,
+        "short" => Token::Short,
+        "static" => Token::Static,
+        "stringifier" => Token::Stringifier,
+        "symbol" => Token::Symbol,
+        "true" => Token::True,
+        "typedef" => Token::Typedef,
+        "USVString" => Token::USVString,
+        "Uint16Array" => Token::Uint16Array,
+        "Uint32Array" => Token::Uint32Array,
+        "Uint8Array" => Token::Uint8Array,
+        "Uint8ClampedArray" => Token::Uint8ClampedArray,
+        "unrestricted" => Token::Unrestricted,
+        "unsigned" => Token::Unsigned,
+        "void" => Token::Void,
+
+        // Regular expressions
+        "FloatLiteral" => Token::FloatLiteral(<f64>),
+        "Identifier" => Token::Identifier(<ast::Identifier>),
+        "IntegerLiteral" => Token::IntegerLiteral(<i64>),
+        "OtherLiteral" => Token::OtherLiteral(<char>),
+        "StringLiteral" => Token::StringLiteral(<String>),
+
+        // Symbols
+        ":" => Token::Colon,
+        "," => Token::Comma,
+        "..." => Token::Ellipsis,
+        "=" => Token::Equals,
+        ">" => Token::GreaterThan,
+        "-" => Token::Hyphen,
+        "{" => Token::LeftBrace,
+        "[" => Token::LeftBracket,
+        "(" => Token::LeftParenthesis,
+        "<" => Token::LessThan,
+        "." => Token::Period,
+        "?" => Token::QuestionMark,
+        "}" => Token::RightBrace,
+        "]" => Token::RightBracket,
+        ")" => Token::RightParenthesis,
+        ";" => Token::Semicolon,
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/parser/mod.rs
@@ -0,0 +1,54 @@
+#[cfg_attr(rustfmt, rustfmt_skip)]
+#[allow(unknown_lints)]
+#[allow(clippy)]
+mod grammar {
+    // During the build step, `build.rs` will output the generated parser to `OUT_DIR` to avoid
+    // adding it to the source directory, so we just directly include the generated parser here.
+    //
+    // Even with `.gitignore` and the `exclude` in the `Cargo.toml`, the generated parser can still
+    // end up in the source directory. This could happen when `cargo build` builds the file out of
+    // the Cargo cache (`$HOME/.cargo/registrysrc`), and the build script would then put its output
+    // in that cached source directory because of https://github.com/lalrpop/lalrpop/issues/280.
+    // Later runs of `cargo vendor` then copy the source from that directory, including the 
+    // generated file.
+    include!(concat!(env!("OUT_DIR"), "/parser/grammar.rs"));
+}
+
+/// Contains all structures related to the AST for the WebIDL grammar.
+pub mod ast;
+
+/// Contains the visitor trait needed to traverse the AST and helper walk functions.
+pub mod visitor;
+
+pub use lalrpop_util::ParseError;
+
+use lexer::{LexicalError, Token};
+
+/// The result that is returned when an input string is parsed. If the parse succeeds, the `Ok`
+/// result will be a vector of definitions representing the AST. If the parse fails, the `Err` will
+/// be either an error from the lexer or the parser.
+pub type ParseResult = Result<ast::AST, ParseError<usize, Token, LexicalError>>;
+
+/// Parses a given input string and returns an AST.
+///
+/// # Example
+///
+/// ```
+/// use webidl::*;
+/// use webidl::ast::*;
+///
+/// let result = parse_string("[Attribute] interface Node { };");
+///
+/// assert_eq!(result,
+///            Ok(vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
+///                 extended_attributes: vec![
+///                     Box::new(ExtendedAttribute::NoArguments(
+///                         Other::Identifier("Attribute".to_string())))],
+///                 inherits: None,
+///                 members: vec![],
+///                 name: "Node".to_string()
+///            }))]));
+/// ```
+pub fn parse_string(input: &str) -> ParseResult {
+    grammar::DefinitionsParser::new().parse(::Lexer::new(input))
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/parser/visitor/mod.rs
@@ -0,0 +1,990 @@
+#![allow(missing_docs)]
+
+/// Converts AST to a pretty printed source string.
+pub mod pretty_print;
+
+use super::ast::*;
+
+pub use self::pretty_print::PrettyPrintVisitor;
+
+macro_rules! make_visitor {
+    ($visitor_trait_name:ident, $($mutability:ident)*) => {
+        #[cfg_attr(rustfmt, rustfmt_skip)]
+        pub trait $visitor_trait_name<'ast> {
+            // Override the following functions. The `walk` functions are the default behavior.
+
+            /// This is the initial function used to start traversing the AST. By default, this
+            /// will simply recursively walk down the AST without performing any meaningful action.
+            fn visit(&mut self, definitions: &'ast $($mutability)* [Definition]) {
+                for definition in definitions {
+                    self.visit_definition(definition);
+                }
+            }
+
+            fn visit_argument(&mut self, argument: &'ast $($mutability)* Argument) {
+                self.walk_argument(argument);
+            }
+
+            fn visit_argument_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* ArgumentListExtendedAttribute)
+            {
+                self.walk_argument_list_extended_attribute(ex);
+            }
+
+            fn visit_attribute(&mut self, attribute: &'ast $($mutability)* Attribute) {
+                self.walk_attribute(attribute);
+            }
+
+            fn visit_callback(&mut self, callback: &'ast $($mutability)* Callback) {
+                self.walk_callback(callback);
+            }
+
+            fn visit_callback_interface(
+                &mut self,
+                callback_interface: &'ast $($mutability)* CallbackInterface)
+            {
+                self.walk_callback_interface(callback_interface);
+            }
+
+            fn visit_const(&mut self, const_: &'ast $($mutability)* Const) {
+                self.walk_const(const_);
+            }
+
+            fn visit_const_type(&mut self, const_type: &'ast $($mutability)* ConstType) {
+                self.walk_const_type(const_type);
+            }
+
+            fn visit_const_value(&mut self, _const_value: &'ast $($mutability)* ConstValue) {}
+
+            fn visit_default_value(&mut self, default_value: &'ast $($mutability)* DefaultValue) {
+                self.walk_default_value(default_value);
+            }
+
+            fn visit_definition(&mut self, definition: &'ast $($mutability)* Definition) {
+                self.walk_definition(definition);
+            }
+
+            fn visit_dictionary(&mut self, dictionary: &'ast $($mutability)* Dictionary) {
+                self.walk_dictionary(dictionary);
+            }
+
+            fn visit_dictionary_member(&mut self,
+                                       dictionary_member: &'ast $($mutability)* DictionaryMember) {
+                self.walk_dictionary_member(dictionary_member);
+            }
+
+            fn visit_enum(&mut self, enum_: &'ast $($mutability)* Enum) {
+                self.walk_enum(enum_);
+            }
+
+            fn visit_explicit_stringifier_operation(
+                &mut self,
+                op: &'ast $($mutability)* ExplicitStringifierOperation)
+            {
+                self.walk_explicit_stringifier_operation(op);
+            }
+
+            fn visit_extended_attribute(&mut self,
+                                        ex: &'ast $($mutability)* ExtendedAttribute) {
+                self.walk_extended_attribute(ex);
+            }
+
+            fn visit_identifier(&mut self, _identifier: &'ast $($mutability)* str) {}
+
+            fn visit_identifier_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* IdentifierExtendedAttribute)
+            {
+                self.walk_identifier_extended_attribute(ex);
+            }
+
+            fn visit_identifier_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* IdentifierListExtendedAttribute)
+            {
+                self.walk_identifier_list_extended_attribute(ex);
+            }
+
+            fn visit_implicit_stringifier_operation(
+                &mut self,
+                op: &'ast $($mutability)* ImplicitStringifierOperation)
+            {
+                self.walk_implicit_stringifier_operation(op);
+            }
+
+            fn visit_implements(&mut self, implements: &'ast $($mutability)* Implements) {
+                self.walk_implements(implements);
+            }
+
+            fn visit_includes(&mut self, includes: &'ast $($mutability)* Includes) {
+                self.walk_includes(includes);
+            }
+
+            fn visit_interface(&mut self, interface: &'ast $($mutability)* Interface) {
+                self.walk_interface(interface);
+            }
+
+            fn visit_interface_member(&mut self,
+                                      interface_member: &'ast $($mutability)* InterfaceMember) {
+                self.walk_interface_member(interface_member);
+            }
+
+            fn visit_iterable(&mut self, iterable: &'ast $($mutability)* Iterable) {
+                self.walk_iterable(iterable);
+            }
+
+            fn visit_maplike(&mut self, maplike: &'ast $($mutability)* Maplike) {
+                self.walk_maplike(maplike);
+            }
+
+            fn visit_mixin(&mut self, mixin: &'ast $($mutability)* Mixin) {
+                self.walk_mixin(mixin);
+            }
+
+            fn visit_mixin_member(&mut self, mixin_member: &'ast $($mutability)* MixinMember) {
+                self.walk_mixin_member(mixin_member);
+            }
+
+            fn visit_named_argument_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* NamedArgumentListExtendedAttribute)
+            {
+                self.walk_named_argument_list_extended_attribute(ex);
+            }
+
+            fn visit_namespace(&mut self, namespace: &'ast $($mutability)* Namespace) {
+                self.walk_namespace(namespace);
+            }
+
+            fn visit_namespace_member(&mut self,
+                                      namespace_member: &'ast $($mutability)* NamespaceMember) {
+                self.walk_namespace_member(namespace_member);
+            }
+
+            fn visit_non_partial_dictionary(
+                &mut self,
+                dictionary: &'ast $($mutability)* NonPartialDictionary)
+            {
+                self.walk_non_partial_dictionary(dictionary);
+            }
+
+            fn visit_non_partial_interface(&mut self,
+                                           interface: &'ast $($mutability)* NonPartialInterface) {
+                self.walk_non_partial_interface(interface);
+            }
+
+            fn visit_non_partial_mixin(&mut self,
+                                       mixin: &'ast $($mutability)* NonPartialMixin) {
+                self.walk_non_partial_mixin(mixin);
+            }
+
+            fn visit_non_partial_namespace(&mut self,
+                                           namespace: &'ast $($mutability)* NonPartialNamespace) {
+                self.walk_non_partial_namespace(namespace);
+            }
+
+            fn visit_operation(&mut self, operation: &'ast $($mutability)* Operation) {
+                self.walk_operation(operation);
+            }
+
+            fn visit_other(&mut self, other: &'ast $($mutability)* Other) {
+                self.walk_other(other);
+            }
+
+            fn visit_other_extended_attribute(&mut self,
+                                              ex: &'ast $($mutability)* OtherExtendedAttribute) {
+                self.walk_other_extended_attribute(ex);
+            }
+
+            fn visit_partial_dictionary(&mut self,
+                                        dictionary: &'ast $($mutability)* PartialDictionary) {
+                self.walk_partial_dictionary(dictionary);
+            }
+
+            fn visit_partial_interface(&mut self,
+                                       interface: &'ast $($mutability)* PartialInterface) {
+                self.walk_partial_interface(interface);
+            }
+
+            fn visit_partial_mixin(&mut self,
+                                   mixin: &'ast $($mutability)* PartialMixin) {
+                self.walk_partial_mixin(mixin);
+            }
+
+            fn visit_partial_namespace(&mut self,
+                                       namespace: &'ast $($mutability)* PartialNamespace) {
+                self.walk_partial_namespace(namespace);
+            }
+
+            fn visit_regular_attribute(&mut self,
+                                       regular_attribute: &'ast $($mutability)* RegularAttribute) {
+                self.walk_regular_attribute(regular_attribute);
+            }
+
+            fn visit_regular_operation(&mut self,
+                                       regular_operation: &'ast $($mutability)* RegularOperation) {
+                self.walk_regular_operation(regular_operation);
+            }
+
+            fn visit_return_type(&mut self, return_type: &'ast $($mutability)* ReturnType) {
+                self.walk_return_type(return_type);
+            }
+
+            fn visit_setlike(&mut self, setlike: &'ast $($mutability)* Setlike) {
+                self.walk_setlike(setlike);
+            }
+
+            fn visit_special(&mut self, _special: &'ast $($mutability)* Special) {}
+
+            fn visit_special_operation(&mut self,
+                                       special_operation: &'ast $($mutability)* SpecialOperation) {
+                self.walk_special_operation(special_operation);
+            }
+
+            fn visit_static_attribute(&mut self,
+                                      static_attribute: &'ast $($mutability)* StaticAttribute) {
+                self.walk_static_attribute(static_attribute);
+            }
+
+            fn visit_static_operation(&mut self,
+                                      static_operation: &'ast $($mutability)* StaticOperation) {
+                self.walk_static_operation(static_operation);
+            }
+
+            fn visit_string_type(&mut self, _string_type: &'ast $($mutability)* StringType) {}
+
+            fn visit_stringifier_attribute(&mut self,
+                                           attribute: &'ast $($mutability)* StringifierAttribute) {
+                self.walk_stringifier_attribute(attribute);
+            }
+
+            fn visit_stringifier_operation(&mut self,
+                                           operation: &'ast $($mutability)* StringifierOperation) {
+                self.walk_stringifier_operation(operation);
+            }
+
+            fn visit_type(&mut self, type_: &'ast $($mutability)* Type) {
+                self.walk_type(type_);
+            }
+
+            fn visit_type_kind(&mut self, type_kind: &'ast $($mutability)* TypeKind) {
+                self.walk_type_kind(type_kind);
+            }
+
+            fn visit_typedef(&mut self, typedef: &'ast $($mutability)* Typedef) {
+                self.walk_typedef(typedef);
+            }
+
+            // The `walk` functions are not meant to be overridden.
+
+            fn walk_argument(&mut self, argument: &'ast $($mutability)* Argument) {
+                for extended_attribute in &$($mutability)* argument.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* argument.type_);
+                self.visit_identifier(&$($mutability)* argument.name);
+
+                if let Some(ref $($mutability)* default_value) = argument.default {
+                    self.visit_default_value(default_value);
+                }
+            }
+
+            fn walk_argument_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* ArgumentListExtendedAttribute)
+            {
+                self.visit_identifier(&$($mutability)* ex.name);
+
+                for argument in &$($mutability)* ex.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_attribute(&mut self, attribute: &'ast $($mutability)* Attribute) {
+                match *attribute {
+                    Attribute::Regular(ref $($mutability)* attribute) => {
+                        self.visit_regular_attribute(attribute);
+                    }
+                    Attribute::Static(ref $($mutability)* attribute) => {
+                        self.visit_static_attribute(attribute);
+                    }
+                    Attribute::Stringifier(ref $($mutability)* attribute) => {
+                        self.visit_stringifier_attribute(attribute);
+                    }
+                }
+            }
+
+            fn walk_callback(&mut self, callback: &'ast $($mutability)* Callback) {
+                for extended_attribute in &$($mutability)* callback.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* callback.name);
+                self.visit_return_type(&$($mutability)* callback.return_type);
+
+                for argument in &$($mutability)* callback.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_callback_interface(&mut self,
+                                       callback_interface: &'ast $($mutability)* CallbackInterface)
+            {
+                for extended_attribute in &$($mutability)* callback_interface.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* callback_interface.name);
+
+                if let Some(ref $($mutability)* inherits) = callback_interface.inherits {
+                    self.visit_identifier(inherits);
+                }
+
+                for member in &$($mutability)* callback_interface.members {
+                    self.visit_interface_member(member);
+                }
+            }
+
+            fn walk_const(&mut self, const_: &'ast $($mutability)* Const) {
+                for extended_attribute in &$($mutability)* const_.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_const_type(&$($mutability)* const_.type_);
+                self.visit_identifier(&$($mutability)* const_.name);
+                self.visit_const_value(&$($mutability)* const_.value);
+            }
+
+            fn walk_const_type(&mut self, const_type: &'ast $($mutability)* ConstType) {
+                if let ConstType::Identifier(ref $($mutability)* identifier) = *const_type {
+                    self.visit_identifier(identifier);
+                }
+            }
+
+            fn walk_default_value(&mut self, default_value: &'ast $($mutability)* DefaultValue) {
+                if let DefaultValue::ConstValue(ref $($mutability)* const_value) = *default_value {
+                    self.visit_const_value(const_value);
+                }
+            }
+
+            fn walk_definition(&mut self, definition: &'ast $($mutability)* Definition) {
+                match *definition {
+                    Definition::Callback(ref $($mutability)* callback) => {
+                        self.visit_callback(callback);
+                    }
+                    Definition::Dictionary(ref $($mutability)* dictionary) => {
+                        self.visit_dictionary(dictionary);
+                    }
+                    Definition::Enum(ref $($mutability)* enum_) => {
+                        self.visit_enum(enum_);
+                    }
+                    Definition::Implements(ref $($mutability)* implements) => {
+                        self.visit_implements(implements);
+                    }
+                    Definition::Includes(ref $($mutability)* includes) => {
+                        self.visit_includes(includes);
+                    }
+                    Definition::Interface(ref $($mutability)* interface) => {
+                        self.visit_interface(interface);
+                    }
+                    Definition::Mixin(ref $($mutability)* mixin) => {
+                        self.visit_mixin(mixin);
+                    }
+                    Definition::Namespace(ref $($mutability)* namespace) => {
+                        self.visit_namespace(namespace);
+                    }
+                    Definition::Typedef(ref $($mutability)* typedef) => {
+                        self.visit_typedef(typedef);
+                    }
+                }
+            }
+
+            fn walk_dictionary(&mut self, dictionary: &'ast $($mutability)* Dictionary) {
+                match *dictionary {
+                    Dictionary::NonPartial(ref $($mutability)* dictionary) => {
+                        self.visit_non_partial_dictionary(dictionary);
+                    }
+                    Dictionary::Partial(ref $($mutability)* dictionary) => {
+                        self.visit_partial_dictionary(dictionary);
+                    }
+                }
+            }
+
+            fn walk_dictionary_member(&mut self,
+                                      dictionary_member: &'ast $($mutability)* DictionaryMember)
+            {
+                for extended_attribute in &$($mutability)* dictionary_member.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* dictionary_member.type_);
+                self.visit_identifier(&$($mutability)* dictionary_member.name);
+
+                if let Some(ref $($mutability)* default_value) = dictionary_member.default {
+                    self.visit_default_value(default_value);
+                }
+            }
+
+            fn walk_enum(&mut self, enum_: &'ast $($mutability)* Enum) {
+                for extended_attribute in &$($mutability)* enum_.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* enum_.name);
+            }
+
+            fn walk_explicit_stringifier_operation(
+                &mut self,
+                op: &'ast $($mutability)* ExplicitStringifierOperation)
+            {
+                for extended_attribute in &$($mutability)* op.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_return_type(&$($mutability)* op.return_type);
+
+                if let Some(ref $($mutability)* name) = op.name {
+                    self.visit_identifier(name);
+                }
+
+                for argument in &$($mutability)* op.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_extended_attribute(&mut self,
+                                       ex: &'ast $($mutability)* ExtendedAttribute)
+            {
+                use ast::ExtendedAttribute::*;
+
+                match *ex {
+                    ArgumentList(ref $($mutability)* extended_attribute) => {
+                        self.visit_argument_list_extended_attribute(extended_attribute);
+                    }
+                    Identifier(ref $($mutability)* extended_attribute) => {
+                        self.visit_identifier_extended_attribute(extended_attribute);
+                    }
+                    IdentifierList(ref $($mutability)* extended_attribute) => {
+                        self.visit_identifier_list_extended_attribute(extended_attribute);
+                    }
+                    NamedArgumentList(ref $($mutability)* extended_attribute) => {
+                        self.visit_named_argument_list_extended_attribute(extended_attribute);
+                    }
+                    NoArguments(ref $($mutability)* extended_attribute) => {
+                        self.visit_other(extended_attribute);
+                    }
+                }
+            }
+
+            fn walk_identifier_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* IdentifierExtendedAttribute)
+            {
+                self.visit_identifier(&$($mutability)* ex.lhs);
+                self.visit_other(&$($mutability)* ex.rhs);
+            }
+
+            fn walk_identifier_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* IdentifierListExtendedAttribute)
+            {
+                self.visit_identifier(&$($mutability)* ex.lhs);
+
+                for identifier in &$($mutability)* ex.rhs {
+                    self.visit_identifier(identifier);
+                }
+            }
+
+            fn walk_implicit_stringifier_operation(
+                &mut self,
+                op: &'ast $($mutability)* ImplicitStringifierOperation)
+            {
+                for extended_attribute in &$($mutability)* op.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+            }
+
+            fn walk_implements(&mut self, implements: &'ast $($mutability)* Implements) {
+                for extended_attribute in &$($mutability)* implements.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* implements.implementer);
+                self.visit_identifier(&$($mutability)* implements.implementee);
+            }
+
+            fn walk_includes(&mut self, includes: &'ast $($mutability)* Includes) {
+                for extended_attribute in &$($mutability)* includes.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* includes.includer);
+                self.visit_identifier(&$($mutability)* includes.includee);
+            }
+
+            fn walk_interface(&mut self, interface: &'ast $($mutability)* Interface) {
+                match *interface {
+                    Interface::Callback(ref $($mutability)* interface) => {
+                        self.visit_callback_interface(interface);
+                    }
+                    Interface::NonPartial(ref $($mutability)* interface) => {
+                        self.visit_non_partial_interface(interface);
+                    }
+                    Interface::Partial(ref $($mutability)* interface) => {
+                        self.visit_partial_interface(interface);
+                    }
+                }
+            }
+
+            fn walk_interface_member(&mut self,
+                                     interface_member: &'ast $($mutability)* InterfaceMember) {
+                match *interface_member {
+                    InterfaceMember::Attribute(ref $($mutability)* member) => {
+                        self.visit_attribute(member);
+                    }
+                    InterfaceMember::Const(ref $($mutability)* member) => {
+                        self.visit_const(member);
+                    }
+                    InterfaceMember::Iterable(ref $($mutability)* member) => {
+                        self.visit_iterable(member);
+                    }
+                    InterfaceMember::Maplike(ref $($mutability)* member) => {
+                        self.visit_maplike(member);
+                    }
+                    InterfaceMember::Operation(ref $($mutability)* member) => {
+                        self.visit_operation(member);
+                    }
+                    InterfaceMember::Setlike(ref $($mutability)* member) => {
+                        self.visit_setlike(member);
+                    }
+                }
+            }
+
+            fn walk_iterable(&mut self, iterable: &'ast $($mutability)* Iterable) {
+                for extended_attribute in &$($mutability)* iterable.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                if let Some(ref $($mutability)* key_type) = iterable.key_type {
+                    self.visit_type(key_type);
+                }
+
+                self.visit_type(&$($mutability)* iterable.value_type);
+            }
+
+            fn walk_maplike(&mut self, maplike: &'ast $($mutability)* Maplike) {
+                for extended_attribute in &$($mutability)* maplike.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* maplike.key_type);
+                self.visit_type(&$($mutability)* maplike.value_type);
+            }
+
+            fn walk_mixin(&mut self, mixin: &'ast $($mutability)* Mixin) {
+                match *mixin {
+                    Mixin::NonPartial(ref $($mutability)* mixin) => {
+                        self.visit_non_partial_mixin(mixin);
+                    }
+                    Mixin::Partial(ref $($mutability)* mixin) => {
+                        self.visit_partial_mixin(mixin);
+                    }
+                }
+            }
+
+            fn walk_mixin_member(&mut self, mixin_member: &'ast $($mutability)* MixinMember) {
+                match *mixin_member {
+                    MixinMember::Attribute(ref $($mutability)* member) => {
+                        self.visit_attribute(member);
+                    }
+                    MixinMember::Const(ref $($mutability)* member) => {
+                        self.visit_const(member);
+                    }
+                    MixinMember::Operation(ref $($mutability)* member) => {
+                        self.visit_operation(member);
+                    }
+                }
+            }
+
+            fn walk_named_argument_list_extended_attribute(
+                &mut self,
+                ex: &'ast $($mutability)* NamedArgumentListExtendedAttribute)
+            {
+                self.visit_identifier(&$($mutability)* ex.lhs_name);
+                self.visit_identifier(&$($mutability)* ex.rhs_name);
+
+                for argument in &$($mutability)* ex.rhs_arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_namespace(&mut self, namespace: &'ast $($mutability)* Namespace) {
+                match *namespace {
+                    Namespace::NonPartial(ref $($mutability)* namespace) => {
+                        self.visit_non_partial_namespace(namespace);
+                    }
+                    Namespace::Partial(ref $($mutability)* namespace) => {
+                        self.visit_partial_namespace(namespace);
+                    }
+                }
+            }
+
+            fn walk_namespace_member(&mut self,
+                                     namespace_member: &'ast $($mutability)* NamespaceMember) {
+                match *namespace_member {
+                    NamespaceMember::Attribute(ref $($mutability)* member) => {
+                        self.visit_attribute(member);
+                    }
+                    NamespaceMember::Operation(ref $($mutability)* member) => {
+                        self.visit_operation(member);
+                    }
+                }
+            }
+
+            fn walk_non_partial_dictionary(
+                &mut self,
+                dictionary: &'ast $($mutability)* NonPartialDictionary)
+            {
+                for extended_attribute in &$($mutability)* dictionary.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* dictionary.name);
+
+                if let Some(ref $($mutability)* inherits) = dictionary.inherits {
+                    self.visit_identifier(inherits);
+                }
+
+                for member in &$($mutability)* dictionary.members {
+                    self.visit_dictionary_member(member);
+                }
+            }
+
+            fn walk_non_partial_interface(
+                &mut self,
+                interface: &'ast $($mutability)* NonPartialInterface)
+            {
+                for extended_attribute in &$($mutability)* interface.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* interface.name);
+
+                if let Some(ref $($mutability)* inherits) = interface.inherits {
+                    self.visit_identifier(inherits);
+                }
+
+                for member in &$($mutability)* interface.members {
+                    self.visit_interface_member(member);
+                }
+            }
+
+            fn walk_non_partial_mixin( &mut self, mixin: &'ast $($mutability)* NonPartialMixin)
+            {
+                for extended_attribute in &$($mutability)* mixin.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* mixin.name);
+
+                for member in &$($mutability)* mixin.members {
+                    self.visit_mixin_member(member);
+                }
+            }
+
+            fn walk_non_partial_namespace(
+                &mut self,
+                namespace: &'ast $($mutability)* NonPartialNamespace)
+            {
+                for extended_attribute in &$($mutability)* namespace.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* namespace.name);
+
+                for member in &$($mutability)* namespace.members {
+                    self.visit_namespace_member(member);
+                }
+            }
+
+            fn walk_operation(&mut self, operation: &'ast $($mutability)* Operation) {
+                match *operation {
+                    Operation::Regular(ref $($mutability)* operation) => {
+                        self.visit_regular_operation(operation);
+                    }
+                    Operation::Special(ref $($mutability)* operation) => {
+                        self.visit_special_operation(operation);
+                    }
+                    Operation::Static(ref $($mutability)* operation) => {
+                        self.visit_static_operation(operation);
+                    }
+                    Operation::Stringifier(ref $($mutability)* operation) => {
+                        self.visit_stringifier_operation(operation);
+                    }
+                }
+            }
+
+            fn walk_other(&mut self, other: &'ast $($mutability)* Other) {
+                if let Other::Identifier(ref $($mutability)* identifier) = *other {
+                    self.visit_identifier(identifier);
+                }
+            }
+
+            fn walk_other_extended_attribute(&mut self,
+                                             ex: &'ast $($mutability)* OtherExtendedAttribute)
+            {
+                match *ex {
+                    OtherExtendedAttribute::Nested {
+                        ref $($mutability)* inner,
+                        ref $($mutability)* rest,
+                        ..
+                    } => {
+                        if let Some(ref $($mutability)* inner) = *inner {
+                            self.visit_extended_attribute(inner);
+                        }
+
+                        if let Some(ref $($mutability)* rest) = *rest {
+                            self.visit_extended_attribute(rest);
+                        }
+                    }
+                    OtherExtendedAttribute::Other {
+                        ref $($mutability)* other,
+                        ref $($mutability)* rest,
+                        ..
+                    } => {
+                        if let Some(ref $($mutability)* other) = *other {
+                            self.visit_other(other);
+                        }
+
+                        if let Some(ref $($mutability)* rest) = *rest {
+                            self.visit_extended_attribute(rest);
+                        }
+                    }
+                }
+            }
+
+            fn walk_partial_dictionary(&mut self,
+                                       partial_dictionary: &'ast $($mutability)* PartialDictionary)
+            {
+                for extended_attribute in &$($mutability)* partial_dictionary.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* partial_dictionary.name);
+
+                for member in &$($mutability)* partial_dictionary.members {
+                    self.visit_dictionary_member(member);
+                }
+            }
+
+            fn walk_partial_interface(&mut self,
+                                      partial_interface: &'ast $($mutability)* PartialInterface)
+            {
+                for extended_attribute in &$($mutability)* partial_interface.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* partial_interface.name);
+
+                for member in &$($mutability)* partial_interface.members {
+                    self.visit_interface_member(member);
+                }
+            }
+
+            fn walk_partial_mixin(&mut self, partial_mixin: &'ast $($mutability)* PartialMixin)
+            {
+                for extended_attribute in &$($mutability)* partial_mixin.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* partial_mixin.name);
+
+                for member in &$($mutability)* partial_mixin.members {
+                    self.visit_mixin_member(member);
+                }
+            }
+
+            fn walk_partial_namespace(&mut self,
+                                      partial_namespace: &'ast $($mutability)* PartialNamespace)
+            {
+                for extended_attribute in &$($mutability)* partial_namespace.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_identifier(&$($mutability)* partial_namespace.name);
+
+                for member in &$($mutability)* partial_namespace.members {
+                    self.visit_namespace_member(member);
+                }
+            }
+
+            fn walk_regular_attribute(&mut self,
+                                      regular_attribute: &'ast $($mutability)* RegularAttribute)
+            {
+                for extended_attribute in &$($mutability)* regular_attribute.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* regular_attribute.type_);
+                self.visit_identifier(&$($mutability)* regular_attribute.name);
+            }
+
+            fn walk_regular_operation(&mut self,
+                                      regular_operation: &'ast $($mutability)* RegularOperation)
+            {
+                for extended_attribute in &$($mutability)* regular_operation.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_return_type(&$($mutability)* regular_operation.return_type);
+
+                if let Some(ref $($mutability)* name) = regular_operation.name {
+                    self.visit_identifier(name);
+                }
+
+                for argument in &$($mutability)* regular_operation.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_return_type(&mut self, return_type: &'ast $($mutability)* ReturnType) {
+                if let ReturnType::NonVoid(ref $($mutability)* type_) = *return_type {
+                    self.visit_type(type_);
+                }
+            }
+
+            fn walk_setlike(&mut self, setlike: &'ast $($mutability)* Setlike) {
+                for extended_attribute in &$($mutability)* setlike.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* setlike.type_);
+            }
+
+            fn walk_special_operation(&mut self,
+                                      special_operation: &'ast $($mutability)* SpecialOperation)
+            {
+                for extended_attribute in &$($mutability)* special_operation.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                for special_keyword in &$($mutability)* special_operation.special_keywords {
+                    self.visit_special(special_keyword);
+                }
+
+                self.visit_return_type(&$($mutability)* special_operation.return_type);
+
+                if let Some(ref $($mutability)* name) = special_operation.name {
+                    self.visit_identifier(name);
+                }
+
+                for argument in &$($mutability)* special_operation.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_static_attribute(&mut self,
+                                     static_attribute: &'ast $($mutability)* StaticAttribute)
+            {
+                for extended_attribute in &$($mutability)* static_attribute.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* static_attribute.type_);
+                self.visit_identifier(&$($mutability)* static_attribute.name);
+            }
+
+            fn walk_static_operation(&mut self,
+                                     static_operation: &'ast $($mutability)* StaticOperation)
+            {
+                for extended_attribute in &$($mutability)* static_operation.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_return_type(&$($mutability)* static_operation.return_type);
+
+                if let Some(ref $($mutability)* name) = static_operation.name {
+                    self.visit_identifier(name);
+                }
+
+                for argument in &$($mutability)* static_operation.arguments {
+                    self.visit_argument(argument);
+                }
+            }
+
+            fn walk_stringifier_attribute(
+                &mut self,
+                attribute: &'ast $($mutability)* StringifierAttribute)
+            {
+                for extended_attribute in &$($mutability)* attribute.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* attribute.type_);
+                self.visit_identifier(&$($mutability)* attribute.name);
+            }
+
+            fn walk_stringifier_operation(
+                &mut self,
+                stringifier_operation: &'ast $($mutability)* StringifierOperation)
+            {
+                match *stringifier_operation {
+                    StringifierOperation::Explicit(ref $($mutability)* operation) => {
+                        self.visit_explicit_stringifier_operation(operation);
+                    }
+                    StringifierOperation::Implicit(ref $($mutability)* operation) => {
+                        self.visit_implicit_stringifier_operation(operation);
+                    }
+                }
+            }
+
+            fn walk_type(&mut self, type_: &'ast $($mutability)* Type) {
+                for extended_attribute in &$($mutability)* type_.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type_kind(&$($mutability)* type_.kind);
+            }
+
+            fn walk_type_kind(&mut self, type_kind: &'ast $($mutability)* TypeKind) {
+                match *type_kind {
+                    TypeKind::FrozenArray(ref $($mutability)* type_) => {
+                        self.visit_type(type_);
+                    }
+                    TypeKind::Identifier(ref $($mutability)* identifier) => {
+                        self.visit_identifier(identifier);
+                    }
+                    TypeKind::Promise(ref $($mutability)* return_type) => {
+                        self.visit_return_type(return_type);
+                    }
+                    TypeKind::Record(_, ref $($mutability)* type_) => {
+                        self.visit_type(type_);
+                    }
+                    TypeKind::Sequence(ref $($mutability)* type_) => {
+                        self.visit_type(type_);
+                    }
+                    TypeKind::Union(ref $($mutability)* types) => {
+                        for type_ in types {
+                            self.visit_type(type_);
+                        }
+                    }
+                    _ => (),
+                }
+            }
+
+            fn walk_typedef(&mut self, typedef: &'ast $($mutability)* Typedef) {
+                for extended_attribute in &$($mutability)* typedef.extended_attributes {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.visit_type(&$($mutability)* typedef.type_);
+                self.visit_identifier(&$($mutability)* typedef.name);
+            }
+        }
+    }
+}
+
+make_visitor!(ImmutableVisitor,);
+make_visitor!(MutableVisitor, mut);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/src/parser/visitor/pretty_print.rs
@@ -0,0 +1,1130 @@
+use std::f64;
+
+use super::ImmutableVisitor;
+use parser::ast::*;
+
+/// A visitor that can be used to convert an AST back into source code.
+///
+/// # Example
+///
+/// ```
+/// use webidl::ast::*;
+/// use webidl::visitor::*;
+///
+/// let ast = vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
+///                 extended_attributes: vec![
+///                     Box::new(ExtendedAttribute::NoArguments(
+///                         Other::Identifier("Attribute".to_string())))],
+///                 inherits: None,
+///                 members: vec![InterfaceMember::Attribute(Attribute::Regular(RegularAttribute {
+///                              extended_attributes: vec![],
+///                              inherits: false,
+///                              name: "attr".to_string(),
+///                              read_only: true,
+///                              type_: Box::new(Type {
+///                                  extended_attributes: vec![],
+///                                  kind: TypeKind::SignedLong,
+///                                  nullable: true
+///                              })
+///                          }))],
+///                 name: "Node".to_string()
+///           }))];
+/// let mut visitor = PrettyPrintVisitor::new();
+/// visitor.visit(&ast);
+/// assert_eq!(visitor.get_output(),
+///            "[Attribute]\ninterface Node {\n    readonly attribute long? attr;\n};\n\n");
+/// ```
+#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
+pub struct PrettyPrintVisitor {
+    output: String,
+}
+
+impl PrettyPrintVisitor {
+    pub fn new() -> Self {
+        PrettyPrintVisitor {
+            output: String::new(),
+        }
+    }
+
+    pub fn get_output(&self) -> &String {
+        &self.output
+    }
+
+    fn stringify_arguments(&mut self, arguments: &[Argument]) {
+        self.output.push('(');
+
+        for (index, argument) in arguments.iter().enumerate() {
+            if index != 0 {
+                self.output.push_str(", ");
+            }
+
+            self.visit_argument(argument);
+        }
+
+        self.output.push(')');
+    }
+
+    fn stringify_extended_attributes(&mut self, extended_attributes: &[Box<ExtendedAttribute>]) {
+        if extended_attributes.is_empty() {
+            return;
+        }
+
+        self.output.push('[');
+
+        for (index, extended_attribute) in extended_attributes.iter().enumerate() {
+            if index != 0 {
+                self.output.push_str(", ");
+            }
+
+            self.visit_extended_attribute(extended_attribute);
+        }
+
+        self.output.push(']');
+    }
+
+    fn stringify_namespace_members(&mut self, namespace_members: &[NamespaceMember]) {
+        let mut iterator = namespace_members.iter().peekable();
+
+        while let Some(member) = iterator.next() {
+            self.visit_namespace_member(member);
+
+            if let Some(next_member) = iterator.peek() {
+                match *member {
+                    NamespaceMember::Attribute(_) => match **next_member {
+                        NamespaceMember::Attribute(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    NamespaceMember::Operation(_) => match **next_member {
+                        NamespaceMember::Operation(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                }
+            }
+        }
+    }
+
+    #[allow(unknown_lints)]
+    #[allow(float_cmp)]
+    fn stringify_float_literal(&mut self, float_literal: f64) {
+        if float_literal.is_nan() {
+            self.output.push_str("NaN");
+        } else if float_literal == f64::INFINITY {
+            self.output.push_str("Infinity");
+        } else if float_literal == f64::NEG_INFINITY {
+            self.output.push_str("-Infinity");
+        } else {
+            self.output.push_str(&*float_literal.to_string());
+
+            if float_literal.floor() == float_literal {
+                self.output.push_str(".0");
+            }
+        }
+    }
+
+    fn stringify_interface_members(&mut self, interface_members: &[InterfaceMember]) {
+        let mut iterator = interface_members.iter().peekable();
+
+        while let Some(member) = iterator.next() {
+            self.visit_interface_member(member);
+
+            if let Some(next_member) = iterator.peek() {
+                match *member {
+                    InterfaceMember::Attribute(_) => match **next_member {
+                        InterfaceMember::Attribute(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    InterfaceMember::Const(_) => match **next_member {
+                        InterfaceMember::Const(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    InterfaceMember::Iterable(_) => match **next_member {
+                        InterfaceMember::Iterable(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    InterfaceMember::Maplike(_) => match **next_member {
+                        InterfaceMember::Maplike(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    InterfaceMember::Operation(_) => match **next_member {
+                        InterfaceMember::Operation(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    InterfaceMember::Setlike(_) => match **next_member {
+                        InterfaceMember::Setlike(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                }
+            }
+        }
+    }
+
+    fn stringify_mixin_members(&mut self, mixin_members: &[MixinMember]) {
+        let mut iterator = mixin_members.iter().peekable();
+
+        while let Some(member) = iterator.next() {
+            self.visit_mixin_member(member);
+
+            if let Some(next_member) = iterator.peek() {
+                match *member {
+                    MixinMember::Attribute(_) => match **next_member {
+                        MixinMember::Attribute(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    MixinMember::Const(_) => match **next_member {
+                        MixinMember::Const(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    MixinMember::Operation(_) => match **next_member {
+                        MixinMember::Operation(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                }
+            }
+        }
+    }
+}
+
+impl<'ast> ImmutableVisitor<'ast> for PrettyPrintVisitor {
+    fn visit(&mut self, definitions: &'ast [Definition]) {
+        let mut iterator = definitions.iter().peekable();
+
+        while let Some(definition) = iterator.next() {
+            self.visit_definition(definition);
+
+            if let Some(next_definition) = iterator.peek() {
+                match *definition {
+                    Definition::Callback(_) => match **next_definition {
+                        Definition::Callback(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    Definition::Implements(_) => match **next_definition {
+                        Definition::Implements(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    Definition::Includes(_) => match **next_definition {
+                        Definition::Includes(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    Definition::Typedef(_) => match **next_definition {
+                        Definition::Typedef(_) => (),
+                        _ => self.output.push('\n'),
+                    },
+                    _ => (),
+                }
+            }
+        }
+    }
+
+    fn visit_argument(&mut self, argument: &'ast Argument) {
+        self.stringify_extended_attributes(&argument.extended_attributes);
+
+        if !argument.extended_attributes.is_empty() {
+            self.output.push(' ');
+        }
+
+        if argument.optional && !argument.variadic {
+            self.output.push_str("optional ");
+        }
+
+        self.visit_type(&argument.type_);
+
+        if argument.variadic {
+            self.output.push_str("...");
+        }
+
+        self.output.push(' ');
+        self.visit_identifier(&argument.name);
+
+        if let Some(ref default_value) = argument.default {
+            self.output.push_str(" = ");
+            self.visit_default_value(default_value);
+        }
+    }
+
+    fn visit_argument_list_extended_attribute(&mut self, ex: &'ast ArgumentListExtendedAttribute) {
+        self.visit_identifier(&ex.name);
+        self.stringify_arguments(&ex.arguments);
+    }
+
+    fn visit_callback(&mut self, callback: &'ast Callback) {
+        if !callback.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&callback.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("callback ");
+        self.visit_identifier(&callback.name);
+        self.output.push_str(" = ");
+        self.visit_return_type(&callback.return_type);
+        self.output.push(' ');
+        self.stringify_arguments(&callback.arguments);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_callback_interface(&mut self, callback_interface: &'ast CallbackInterface) {
+        if !callback_interface.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&callback_interface.extended_attributes);
+            self.output.push_str("\n");
+        }
+
+        self.output.push_str("callback interface ");
+        self.visit_identifier(&callback_interface.name);
+
+        if let Some(ref inherit) = callback_interface.inherits {
+            self.output.push_str(" : ");
+            self.output.push_str(inherit);
+        }
+
+        self.output.push_str(" {\n");
+        self.stringify_interface_members(&callback_interface.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_const(&mut self, const_: &'ast Const) {
+        if !const_.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&const_.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    const ");
+        self.visit_const_type(&const_.type_);
+
+        if const_.nullable {
+            self.output.push('?');
+        }
+
+        self.output.push(' ');
+        self.visit_identifier(&const_.name);
+        self.output.push_str(" = ");
+        self.visit_const_value(&const_.value);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_const_type(&mut self, const_type: &'ast ConstType) {
+        match *const_type {
+            ConstType::Boolean => self.output.push_str("boolean"),
+            ConstType::Byte => self.output.push_str("byte"),
+            ConstType::Identifier(ref identifier) => self.visit_identifier(identifier),
+            ConstType::Octet => self.output.push_str("octet"),
+            ConstType::RestrictedDouble => self.output.push_str("double"),
+            ConstType::RestrictedFloat => self.output.push_str("float"),
+            ConstType::SignedLong => self.output.push_str("long"),
+            ConstType::SignedLongLong => self.output.push_str("long long"),
+            ConstType::SignedShort => self.output.push_str("short"),
+            ConstType::UnrestrictedDouble => self.output.push_str("unrestricted double"),
+            ConstType::UnrestrictedFloat => self.output.push_str("unrestricted float"),
+            ConstType::UnsignedLong => self.output.push_str("unsigned long"),
+            ConstType::UnsignedLongLong => self.output.push_str("unsigned long long"),
+            ConstType::UnsignedShort => self.output.push_str("unsigned short"),
+        }
+    }
+
+    fn visit_const_value(&mut self, const_value: &'ast ConstValue) {
+        match *const_value {
+            ConstValue::BooleanLiteral(boolean_literal) => {
+                self.output.push_str(&*boolean_literal.to_string());
+            }
+            ConstValue::FloatLiteral(float_literal) => {
+                self.stringify_float_literal(float_literal);
+            }
+            ConstValue::IntegerLiteral(integer_literal) => {
+                self.output.push_str(&*integer_literal.to_string());
+            }
+            ConstValue::Null => self.output.push_str("null"),
+        }
+    }
+
+    fn visit_default_value(&mut self, default_value: &'ast DefaultValue) {
+        match *default_value {
+            DefaultValue::ConstValue(ref const_value) => self.visit_const_value(const_value),
+            DefaultValue::EmptySequence => self.output.push_str("[]"),
+            DefaultValue::StringLiteral(ref string_literal) => {
+                self.output.push('"');
+                self.output.push_str(&*string_literal);
+                self.output.push('"');
+            }
+        }
+    }
+
+    fn visit_dictionary_member(&mut self, dictionary_member: &'ast DictionaryMember) {
+        if !dictionary_member.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&dictionary_member.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+
+        if dictionary_member.required {
+            self.output.push_str("required ");
+        }
+
+        self.visit_type(&dictionary_member.type_);
+        self.output.push(' ');
+        self.visit_identifier(&dictionary_member.name);
+
+        if let Some(ref default_value) = dictionary_member.default {
+            self.output.push_str(" = ");
+            self.visit_default_value(default_value);
+        }
+
+        self.output.push_str(";\n");
+    }
+
+    fn visit_enum(&mut self, enum_: &'ast Enum) {
+        if !enum_.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&enum_.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("enum ");
+        self.visit_identifier(&enum_.name);
+        self.output.push_str(" {\n");
+
+        for (index, variant) in enum_.variants.iter().enumerate() {
+            if index != 0 {
+                self.output.push_str(",\n");
+            }
+
+            self.output.push_str("    \"");
+            self.output.push_str(&*variant);
+            self.output.push('"');
+        }
+
+        self.output.push_str("\n};\n\n");
+    }
+
+    fn visit_explicit_stringifier_operation(
+        &mut self,
+        operation: &'ast ExplicitStringifierOperation,
+    ) {
+        if !operation.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&operation.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.stringify_extended_attributes(&operation.extended_attributes);
+        self.output.push_str("    stringifier ");
+        self.visit_return_type(&operation.return_type);
+        self.output.push(' ');
+
+        if let Some(ref name) = operation.name {
+            self.visit_identifier(name);
+            self.output.push(' ');
+        }
+
+        self.stringify_arguments(&operation.arguments);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_identifier(&mut self, identifier: &'ast str) {
+        let identifier = match identifier {
+            "any" => "_any",
+            "ArrayBuffer" => "_ArrayBuffer",
+            "attribute" => "_attribute",
+            "boolean" => "_boolean",
+            "byte" => "_byte",
+            "ByteString" => "_ByteString",
+            "callback" => "_callback",
+            "const" => "_const",
+            "DataView" => "_DataView",
+            "deleter" => "_deleter",
+            "dictionary" => "_dictionary",
+            "DOMString" => "_DOMString",
+            "double" => "_double",
+            "enum" => "_enum",
+            "Error" => "_Error",
+            "false" => "_false",
+            "float" => "_float",
+            "Float32Array" => "_Float32Array",
+            "Float64Array" => "_Float64Array",
+            "FrozenArray" => "_FrozenArray",
+            "getter" => "_getter",
+            "implements" => "_implements",
+            "includes" => "_includes",
+            "inherit" => "_inherit",
+            "Int16Array" => "_Int16Array",
+            "Int32Array" => "_Int32Array",
+            "Int8Array" => "_Int8Array",
+            "interface" => "_interface",
+            "iterable" => "_iterable",
+            "legacycaller" => "_legacycaller",
+            "long" => "_long",
+            "maplike" => "_maplike",
+            "namespace" => "_namespace",
+            "NaN" => "_NaN",
+            "null" => "_null",
+            "object" => "_object",
+            "octet" => "_octet",
+            "optional" => "_optional",
+            "or" => "_or",
+            "partial" => "_partial",
+            "Infinity" => "_Infinity",
+            "Promise" => "_Promise",
+            "readonly" => "_readonly",
+            "record" => "_record",
+            "required" => "_required",
+            "sequence" => "_sequence",
+            "setlike" => "_setlike",
+            "setter" => "_setter",
+            "short" => "_short",
+            "static" => "_static",
+            "stringifier" => "_stringifier",
+            "symbol" => "_symbol",
+            "true" => "_true",
+            "typedef" => "_typedef",
+            "USVString" => "_USVString",
+            "Uint16Array" => "_Uint16Array",
+            "Uint32Array" => "_Uint32Array",
+            "Uint8Array" => "_Uint8Array",
+            "Uint8ClampedArray" => "_Uint8ClampedArray",
+            "unrestricted" => "_unrestricted",
+            "unsigned" => "_unsigned",
+            "void" => "_void",
+            identifier => identifier,
+        };
+
+        self.output.push_str(identifier);
+    }
+
+    fn visit_identifier_extended_attribute(
+        &mut self,
+        extended_attribute: &'ast IdentifierExtendedAttribute,
+    ) {
+        self.visit_identifier(&extended_attribute.lhs);
+        self.output.push('=');
+        self.visit_other(&extended_attribute.rhs);
+    }
+
+    fn visit_identifier_list_extended_attribute(
+        &mut self,
+        ex: &'ast IdentifierListExtendedAttribute,
+    ) {
+        self.visit_identifier(&ex.lhs);
+        self.output.push_str("=(");
+
+        for (index, identifier) in ex.rhs.iter().enumerate() {
+            if index != 0 {
+                self.output.push_str(", ");
+            }
+
+            self.visit_identifier(identifier);
+        }
+
+        self.output.push(')');
+    }
+
+    fn visit_implicit_stringifier_operation(
+        &mut self,
+        operation: &'ast ImplicitStringifierOperation,
+    ) {
+        if !operation.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&operation.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    stringifier;\n");
+    }
+
+    fn visit_implements(&mut self, implements: &'ast Implements) {
+        if !implements.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&implements.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.visit_identifier(&implements.implementer);
+        self.output.push_str(" implements ");
+        self.visit_identifier(&implements.implementee);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_includes(&mut self, includes: &'ast Includes) {
+        if !includes.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&includes.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.visit_identifier(&includes.includer);
+        self.output.push_str(" includes ");
+        self.visit_identifier(&includes.includee);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_iterable(&mut self, iterable: &'ast Iterable) {
+        if !iterable.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&iterable.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    iterable<");
+
+        if let Some(ref key_type) = iterable.key_type {
+            self.visit_type(key_type);
+            self.output.push_str(", ");
+        }
+
+        self.visit_type(&iterable.value_type);
+        self.output.push_str(">;\n");
+    }
+
+    fn visit_maplike(&mut self, maplike: &'ast Maplike) {
+        if !maplike.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&maplike.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+
+        if maplike.read_only {
+            self.output.push_str("readonly ");
+        }
+
+        self.output.push_str("maplike<");
+        self.visit_type(&maplike.key_type);
+        self.output.push_str(", ");
+        self.visit_type(&maplike.value_type);
+        self.output.push_str(">;\n");
+    }
+
+    fn visit_named_argument_list_extended_attribute(
+        &mut self,
+        ex: &'ast NamedArgumentListExtendedAttribute,
+    ) {
+        self.visit_identifier(&ex.lhs_name);
+        self.output.push('=');
+        self.visit_identifier(&ex.rhs_name);
+        self.stringify_arguments(&ex.rhs_arguments);
+    }
+
+    fn visit_non_partial_dictionary(&mut self, non_partial_dictionary: &'ast NonPartialDictionary) {
+        if !non_partial_dictionary.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&non_partial_dictionary.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("dictionary ");
+        self.visit_identifier(&non_partial_dictionary.name);
+
+        if let Some(ref inherit) = non_partial_dictionary.inherits {
+            self.output.push_str(" : ");
+            self.output.push_str(inherit);
+        }
+
+        self.output.push_str(" {\n");
+
+        for member in &non_partial_dictionary.members {
+            self.visit_dictionary_member(member);
+        }
+
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_non_partial_interface(&mut self, non_partial_interface: &'ast NonPartialInterface) {
+        if !non_partial_interface.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&non_partial_interface.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("interface ");
+        self.visit_identifier(&non_partial_interface.name);
+
+        if let Some(ref inherit) = non_partial_interface.inherits {
+            self.output.push_str(" : ");
+            self.output.push_str(inherit);
+        }
+
+        self.output.push_str(" {\n");
+        self.stringify_interface_members(&non_partial_interface.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_non_partial_mixin(&mut self, non_partial_mixin: &'ast NonPartialMixin) {
+        if !non_partial_mixin.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&non_partial_mixin.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("interface mixin ");
+        self.visit_identifier(&non_partial_mixin.name);
+
+        self.output.push_str(" {\n");
+        self.stringify_mixin_members(&non_partial_mixin.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_non_partial_namespace(&mut self, non_partial_namespace: &'ast NonPartialNamespace) {
+        if !non_partial_namespace.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&non_partial_namespace.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("namespace ");
+        self.visit_identifier(&non_partial_namespace.name);
+        self.output.push_str(" {\n");
+        self.stringify_namespace_members(&non_partial_namespace.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_other(&mut self, other: &'ast Other) {
+        match *other {
+            Other::Any => self.output.push_str("any"),
+            Other::ArrayBuffer => self.output.push_str("ArrayBuffer"),
+            Other::Attribute => self.output.push_str("attribute"),
+            Other::Boolean => self.output.push_str("boolean"),
+            Other::Byte => self.output.push_str("byte"),
+            Other::ByteString => self.output.push_str("ByteString"),
+            Other::Callback => self.output.push_str("callback"),
+            Other::Const => self.output.push_str("const"),
+            Other::DOMString => self.output.push_str("DOMString"),
+            Other::DataView => self.output.push_str("DataView"),
+            Other::Deleter => self.output.push_str("deleter"),
+            Other::Dictionary => self.output.push_str("dictionary"),
+            Other::Double => self.output.push_str("double"),
+            Other::Enum => self.output.push_str("enum"),
+            Other::False => self.output.push_str("false"),
+            Other::Float => self.output.push_str("float"),
+            Other::Float32Array => self.output.push_str("Float32Array"),
+            Other::Float64Array => self.output.push_str("Float64Array"),
+            Other::FrozenArray => self.output.push_str("FrozenArray"),
+            Other::Getter => self.output.push_str("getter"),
+            Other::Implements => self.output.push_str("implements"),
+            Other::Includes => self.output.push_str("includes"),
+            Other::Inherit => self.output.push_str("inherit"),
+            Other::Int16Array => self.output.push_str("Int16Array"),
+            Other::Int32Array => self.output.push_str("Int32Array"),
+            Other::Int8Array => self.output.push_str("Int8Array"),
+            Other::Interface => self.output.push_str("interface"),
+            Other::Iterable => self.output.push_str("iterable"),
+            Other::LegacyCaller => self.output.push_str("legacycaller"),
+            Other::Long => self.output.push_str("long"),
+            Other::Maplike => self.output.push_str("maplike"),
+            Other::Namespace => self.output.push_str("namespace"),
+            Other::NegativeInfinity => self.output.push_str("-Infinity"),
+            Other::NaN => self.output.push_str("NaN"),
+            Other::Null => self.output.push_str("null"),
+            Other::Object => self.output.push_str("object"),
+            Other::Octet => self.output.push_str("octet"),
+            Other::Optional => self.output.push_str("optional"),
+            Other::Or => self.output.push_str("or"),
+            Other::Partial => self.output.push_str("partial"),
+            Other::PositiveInfinity => self.output.push_str("Infinity"),
+            Other::Required => self.output.push_str("required"),
+            Other::Sequence => self.output.push_str("sequence"),
+            Other::Setlike => self.output.push_str("setlike"),
+            Other::Setter => self.output.push_str("setter"),
+            Other::Short => self.output.push_str("short"),
+            Other::Static => self.output.push_str("static"),
+            Other::Stringifier => self.output.push_str("stringifier"),
+            Other::True => self.output.push_str("true"),
+            Other::Typedef => self.output.push_str("typedef"),
+            Other::USVString => self.output.push_str("USVString"),
+            Other::Uint16Array => self.output.push_str("Uint16Array"),
+            Other::Uint32Array => self.output.push_str("Uint32Array"),
+            Other::Uint8Array => self.output.push_str("Uint8Array"),
+            Other::Uint8ClampedArray => self.output.push_str("Uint8ClampedArray"),
+            Other::Unrestricted => self.output.push_str("unrestricted"),
+            Other::Unsigned => self.output.push_str("unsigned"),
+            Other::Void => self.output.push_str("void"),
+
+            Other::FloatLiteral(float_literal) => {
+                self.stringify_float_literal(float_literal);
+            }
+            Other::Identifier(ref identifier) => self.visit_identifier(identifier),
+            Other::IntegerLiteral(integer_literal) => {
+                self.output.push_str(&*integer_literal.to_string());
+            }
+            Other::OtherLiteral(other_literal) => self.output.push(other_literal),
+            Other::StringLiteral(ref string_literal) => {
+                self.output.push('"');
+                self.output.push_str(&*string_literal);
+                self.output.push('"');
+            }
+
+            Other::Colon => self.output.push(':'),
+            Other::Ellipsis => self.output.push_str("..."),
+            Other::Equals => self.output.push('='),
+            Other::GreaterThan => self.output.push('>'),
+            Other::Hyphen => self.output.push('-'),
+            Other::LessThan => self.output.push('<'),
+            Other::Period => self.output.push('.'),
+            Other::QuestionMark => self.output.push('?'),
+            Other::Semicolon => self.output.push(';'),
+        }
+    }
+
+    fn visit_other_extended_attribute(&mut self, extended_attribute: &'ast OtherExtendedAttribute) {
+        match *extended_attribute {
+            OtherExtendedAttribute::Nested {
+                ref group_type,
+                ref inner,
+                ref rest,
+            } => {
+                let end_group_char = match *group_type {
+                    OtherExtendedAttributeGroupType::Brace => {
+                        self.output.push('{');
+                        '}'
+                    }
+                    OtherExtendedAttributeGroupType::Bracket => {
+                        self.output.push('[');
+                        ']'
+                    }
+                    OtherExtendedAttributeGroupType::Parenthesis => {
+                        self.output.push('(');
+                        ')'
+                    }
+                };
+
+                if let Some(ref extended_attribute) = *inner {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+
+                self.output.push(end_group_char);
+
+                if let Some(ref extended_attribute) = *rest {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+            }
+            OtherExtendedAttribute::Other {
+                ref other,
+                ref rest,
+            } => {
+                if let Some(ref other) = *other {
+                    self.visit_other(other);
+                }
+
+                if let Some(ref extended_attribute) = *rest {
+                    self.visit_extended_attribute(extended_attribute);
+                }
+            }
+        }
+    }
+
+    fn visit_partial_dictionary(&mut self, partial_dictionary: &'ast PartialDictionary) {
+        if !partial_dictionary.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&partial_dictionary.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("partial dictionary ");
+        self.visit_identifier(&partial_dictionary.name);
+        self.output.push_str(" {\n");
+
+        for member in &partial_dictionary.members {
+            self.visit_dictionary_member(member);
+        }
+
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_partial_interface(&mut self, partial_interface: &'ast PartialInterface) {
+        if !partial_interface.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&partial_interface.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("partial interface ");
+        self.visit_identifier(&partial_interface.name);
+        self.output.push_str(" {\n");
+        self.stringify_interface_members(&partial_interface.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_partial_mixin(&mut self, partial_mixin: &'ast PartialMixin) {
+        if !partial_mixin.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&partial_mixin.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("partial interface mixin ");
+        self.visit_identifier(&partial_mixin.name);
+        self.output.push_str(" {\n");
+        self.stringify_mixin_members(&partial_mixin.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_partial_namespace(&mut self, partial_namespace: &'ast PartialNamespace) {
+        if !partial_namespace.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&partial_namespace.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("partial namespace ");
+        self.visit_identifier(&partial_namespace.name);
+        self.output.push_str(" {\n");
+        self.stringify_namespace_members(&partial_namespace.members);
+        self.output.push_str("};\n\n");
+    }
+
+    fn visit_regular_attribute(&mut self, regular_attribute: &'ast RegularAttribute) {
+        if !regular_attribute.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&regular_attribute.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+
+        if regular_attribute.inherits {
+            self.output.push_str("inherit ");
+        }
+
+        if regular_attribute.read_only {
+            self.output.push_str("readonly ");
+        }
+
+        self.output.push_str("attribute ");
+        self.visit_type(&regular_attribute.type_);
+        self.output.push(' ');
+        self.visit_identifier(&regular_attribute.name);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_regular_operation(&mut self, regular_operation: &'ast RegularOperation) {
+        if !regular_operation.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&regular_operation.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+        self.visit_return_type(&regular_operation.return_type);
+        self.output.push(' ');
+
+        if let Some(ref name) = regular_operation.name {
+            self.visit_identifier(name);
+        }
+
+        self.stringify_arguments(&regular_operation.arguments);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_return_type(&mut self, return_type: &'ast ReturnType) {
+        match *return_type {
+            ReturnType::NonVoid(ref type_) => self.visit_type(type_),
+            ReturnType::Void => self.output.push_str("void"),
+        }
+    }
+
+    fn visit_setlike(&mut self, setlike: &'ast Setlike) {
+        if !setlike.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&setlike.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+
+        if setlike.read_only {
+            self.output.push_str("readonly ");
+        }
+
+        self.output.push_str("setlike<");
+        self.visit_type(&setlike.type_);
+        self.output.push_str(">;\n");
+    }
+
+    fn visit_special(&mut self, special: &'ast Special) {
+        match *special {
+            Special::Deleter => self.output.push_str("deleter"),
+            Special::Getter => self.output.push_str("getter"),
+            Special::LegacyCaller => self.output.push_str("legacycaller"),
+            Special::Setter => self.output.push_str("setter"),
+        }
+    }
+
+    fn visit_special_operation(&mut self, special_operation: &'ast SpecialOperation) {
+        if !special_operation.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&special_operation.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    ");
+
+        for special_keyword in &special_operation.special_keywords {
+            self.visit_special(special_keyword);
+            self.output.push(' ');
+        }
+
+        self.visit_return_type(&special_operation.return_type);
+        self.output.push(' ');
+
+        if let Some(ref name) = special_operation.name {
+            self.visit_identifier(name);
+        }
+
+        self.stringify_arguments(&special_operation.arguments);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_static_attribute(&mut self, static_attribute: &'ast StaticAttribute) {
+        if !static_attribute.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&static_attribute.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    static ");
+
+        if static_attribute.read_only {
+            self.output.push_str("readonly ");
+        }
+
+        self.output.push_str("attribute ");
+        self.visit_type(&static_attribute.type_);
+        self.output.push(' ');
+        self.visit_identifier(&static_attribute.name);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_static_operation(&mut self, static_operation: &'ast StaticOperation) {
+        if !static_operation.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&static_operation.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    static ");
+        self.visit_return_type(&static_operation.return_type);
+        self.output.push(' ');
+
+        if let Some(ref name) = static_operation.name {
+            self.visit_identifier(name);
+        }
+
+        self.stringify_arguments(&static_operation.arguments);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_string_type(&mut self, string_type: &'ast StringType) {
+        match *string_type {
+            StringType::ByteString => self.output.push_str("ByteString"),
+            StringType::DOMString => self.output.push_str("DOMString"),
+            StringType::USVString => self.output.push_str("USVString"),
+        }
+    }
+
+    fn visit_stringifier_attribute(&mut self, stringifier_attribute: &'ast StringifierAttribute) {
+        if !stringifier_attribute.extended_attributes.is_empty() {
+            self.output.push_str("    ");
+            self.stringify_extended_attributes(&stringifier_attribute.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("    stringifier ");
+
+        if stringifier_attribute.read_only {
+            self.output.push_str("readonly ");
+        }
+
+        self.output.push_str("attribute ");
+        self.visit_type(&stringifier_attribute.type_);
+        self.output.push(' ');
+        self.visit_identifier(&stringifier_attribute.name);
+        self.output.push_str(";\n");
+    }
+
+    fn visit_type(&mut self, type_: &'ast Type) {
+        self.stringify_extended_attributes(&type_.extended_attributes);
+
+        if !type_.extended_attributes.is_empty() {
+            self.output.push(' ');
+        }
+
+        self.visit_type_kind(&type_.kind);
+
+        if type_.nullable {
+            self.output.push_str("?");
+        }
+    }
+
+    fn visit_type_kind(&mut self, type_kind: &'ast TypeKind) {
+        match *type_kind {
+            TypeKind::Any => self.output.push_str("any"),
+            TypeKind::ArrayBuffer => self.output.push_str("ArrayBuffer"),
+            TypeKind::Boolean => self.output.push_str("boolean"),
+            TypeKind::Byte => self.output.push_str("byte"),
+            TypeKind::ByteString => self.output.push_str("ByteString"),
+            TypeKind::DOMString => self.output.push_str("DOMString"),
+            TypeKind::DataView => self.output.push_str("DataView"),
+            TypeKind::Error => self.output.push_str("Error"),
+            TypeKind::Float32Array => self.output.push_str("Float32Array"),
+            TypeKind::Float64Array => self.output.push_str("Float64Array"),
+            TypeKind::FrozenArray(ref type_) => {
+                self.output.push_str("FrozenArray<");
+                self.visit_type(type_);
+                self.output.push('>');
+            }
+            TypeKind::Identifier(ref identifier) => self.visit_identifier(identifier),
+            TypeKind::Int16Array => self.output.push_str("Int16Array"),
+            TypeKind::Int32Array => self.output.push_str("Int32Array"),
+            TypeKind::Int8Array => self.output.push_str("Int8Array"),
+            TypeKind::Octet => self.output.push_str("octet"),
+            TypeKind::Object => self.output.push_str("object"),
+            TypeKind::Promise(ref return_type) => {
+                self.output.push_str("Promise<");
+                self.visit_return_type(return_type);
+                self.output.push('>');
+            }
+            TypeKind::Record(ref string_type, ref value_type) => {
+                self.output.push_str("record<");
+                self.visit_string_type(string_type);
+                self.output.push_str(", ");
+                self.visit_type(value_type);
+                self.output.push('>');
+            }
+            TypeKind::RestrictedDouble => self.output.push_str("double"),
+            TypeKind::RestrictedFloat => self.output.push_str("float"),
+            TypeKind::Sequence(ref type_) => {
+                self.output.push_str("sequence<");
+                self.visit_type(type_);
+                self.output.push('>');
+            }
+            TypeKind::SignedLong => self.output.push_str("long"),
+            TypeKind::SignedLongLong => self.output.push_str("long long"),
+            TypeKind::SignedShort => self.output.push_str("short"),
+            TypeKind::Symbol => self.output.push_str("symbol"),
+            TypeKind::USVString => self.output.push_str("USVString"),
+            TypeKind::Uint16Array => self.output.push_str("Uint16Array"),
+            TypeKind::Uint32Array => self.output.push_str("Uint32Array"),
+            TypeKind::Uint8Array => self.output.push_str("Uint8Array"),
+            TypeKind::Uint8ClampedArray => self.output.push_str("Uint8ClampedArray"),
+            TypeKind::Union(ref types) => {
+                self.output.push('(');
+
+                for (index, type_) in types.iter().enumerate() {
+                    if index != 0 {
+                        self.output.push_str(" or ");
+                    }
+
+                    self.visit_type(type_);
+                }
+
+                self.output.push(')');
+            }
+            TypeKind::UnrestrictedDouble => self.output.push_str("unrestricted double"),
+            TypeKind::UnrestrictedFloat => self.output.push_str("unrestricted float"),
+            TypeKind::UnsignedLong => self.output.push_str("unsigned long"),
+            TypeKind::UnsignedLongLong => self.output.push_str("unsigned long long"),
+            TypeKind::UnsignedShort => self.output.push_str("unsigned short"),
+        }
+    }
+
+    fn visit_typedef(&mut self, typedef: &'ast Typedef) {
+        if !typedef.extended_attributes.is_empty() {
+            self.stringify_extended_attributes(&typedef.extended_attributes);
+            self.output.push('\n');
+        }
+
+        self.output.push_str("typedef ");
+        self.visit_type(&typedef.type_);
+        self.output.push(' ');
+        self.visit_identifier(&typedef.name);
+        self.output.push_str(";\n");
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/tests/parse_test.rs
@@ -0,0 +1,85 @@
+extern crate webidl;
+extern crate zip;
+
+use std::fs;
+use std::io::Read;
+
+use webidl::*;
+
+#[test]
+fn parse_servo_webidls() {
+    let file = fs::File::open("tests/mozilla_webidls.zip").unwrap();
+    let mut archive = zip::ZipArchive::new(file).unwrap();
+
+    for i in 0..archive.len() {
+        let mut file = archive.by_index(i).unwrap();
+        let mut webidl = String::new();
+        file.read_to_string(&mut webidl).unwrap();
+        parse_string(&*webidl).expect("parsing failed");
+    }
+}
+
+// A test case using the "includes" definition does not appear in the Mozilla WebIDLs, so it needs
+// to be tested separately.
+#[test]
+fn parse_includes() {
+    use ast::*;
+
+    let ast = parse_string("[test] A includes B;").unwrap();
+
+    assert_eq!(
+        ast,
+        vec![
+            Definition::Includes(Includes {
+                extended_attributes: vec![
+                    Box::new(ExtendedAttribute::NoArguments(Other::Identifier(
+                        "test".to_string(),
+                    ))),
+                ],
+                includee: "B".to_string(),
+                includer: "A".to_string(),
+            }),
+        ]
+    );
+}
+
+// A test case using the "mixin" definition does not appear in the Mozilla WebIDLs, so it needs to
+// be tested separately.
+#[test]
+fn parse_mixin() {
+    use ast::*;
+
+    let ast = parse_string(
+        "[test]
+            partial interface mixin Name {
+                readonly attribute unsigned short entry;
+            };",
+    ).unwrap();
+
+    assert_eq!(
+        ast,
+        vec![
+            Definition::Mixin(Mixin::Partial(PartialMixin {
+                extended_attributes: vec![
+                    Box::new(ExtendedAttribute::NoArguments(Other::Identifier(
+                        "test".to_string(),
+                    ))),
+                ],
+                members: vec![
+                    MixinMember::Attribute(Attribute::Regular(RegularAttribute {
+                        extended_attributes: vec![],
+                        inherits: false,
+                        name: "entry".to_string(),
+                        read_only: true,
+                        type_: Box::new(Type {
+                            extended_attributes: vec![],
+                            kind: TypeKind::UnsignedShort,
+                            nullable: false,
+                        }),
+                    })),
+                ],
+                name: "Name".to_string(),
+            })),
+        ]
+    );
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/webidl/tests/pretty_print_test.rs
@@ -0,0 +1,124 @@
+extern crate webidl;
+extern crate zip;
+
+use std::f64;
+use std::fs;
+use std::io::Read;
+
+use webidl::ast::*;
+use webidl::visitor::*;
+use webidl::*;
+
+// Test to make sure that Infinity/-Infinity/NaN are correctly pretty printed since they do not
+// appear in the Servo WebIDLs.
+#[test]
+fn pretty_print_float_literals() {
+    let ast = vec![
+        Definition::Interface(Interface::NonPartial(NonPartialInterface {
+            extended_attributes: vec![],
+            inherits: None,
+            members: vec![
+                InterfaceMember::Const(Const {
+                    extended_attributes: vec![],
+                    name: "const_1".to_string(),
+                    nullable: false,
+                    type_: ConstType::UnrestrictedDouble,
+                    value: ConstValue::FloatLiteral(f64::INFINITY),
+                }),
+                InterfaceMember::Const(Const {
+                    extended_attributes: vec![],
+                    name: "const_2".to_string(),
+                    nullable: false,
+                    type_: ConstType::UnrestrictedDouble,
+                    value: ConstValue::FloatLiteral(f64::NEG_INFINITY),
+                }),
+                InterfaceMember::Const(Const {
+                    extended_attributes: vec![],
+                    name: "const_3".to_string(),
+                    nullable: false,
+                    type_: ConstType::UnrestrictedDouble,
+                    value: ConstValue::FloatLiteral(f64::NAN),
+                }),
+            ],
+            name: "Test".to_string(),
+        })),
+    ];
+    let mut visitor = PrettyPrintVisitor::new();
+    visitor.visit(&ast);
+    assert_eq!(
+        visitor.get_output(),
+        "interface Test {
+    const unrestricted double const_1 = Infinity;
+    const unrestricted double const_2 = -Infinity;
+    const unrestricted double const_3 = NaN;
+};\n\n"
+    );
+}
+
+#[test]
+fn pretty_print_servo_webidls() {
+    let file = fs::File::open("tests/mozilla_webidls.zip").unwrap();
+    let mut archive = zip::ZipArchive::new(file).unwrap();
+
+    for i in 0..archive.len() {
+        let mut file = archive.by_index(i).unwrap();
+        let mut webidl = String::new();
+        file.read_to_string(&mut webidl).unwrap();
+
+        // With the new update to the specification, the "implements" definition has been replaced
+        // with "includes", but the Mozilla WebIDLs have not been updated.
+
+        let original_ast = match parse_string(&*webidl) {
+            Ok(ast) => ast,
+            Err(err) => match err {
+                ParseError::UnrecognizedToken {
+                    token: Some((_, ref token, _)),
+                    ..
+                } if *token == Token::Identifier("implements".to_string()) =>
+                {
+                    continue;
+                }
+                _ => panic!("parse error: {:?}", err),
+            },
+        };
+
+        let mut visitor = PrettyPrintVisitor::new();
+        visitor.visit(&original_ast);
+
+        // Compare original AST with AST obtained from pretty print visitor.
+
+        let pretty_print_ast = parse_string(&*visitor.get_output()).expect("parsing failed");
+        assert_eq!(pretty_print_ast, original_ast);
+    }
+}
+
+// A test case using the "includes" definition does not appear in the Mozilla WebIDLs, so it needs
+// to be tested separately.
+#[test]
+fn pretty_print_includes() {
+    let original_ast = parse_string("[test] A includes B;").unwrap();
+
+    let mut visitor = PrettyPrintVisitor::new();
+    visitor.visit(&original_ast);
+
+    let pretty_print_ast = parse_string(&*visitor.get_output()).unwrap();
+    assert_eq!(pretty_print_ast, original_ast);
+}
+
+// A test case using the "mixin" definition does not appear in the Mozilla WebIDLs, so it needs to
+// be tested separately.
+#[test]
+fn pretty_print_mixin() {
+    let original_ast = parse_string(
+        "[test]
+            partial interface mixin Name {
+                readonly attribute unsigned short entry;
+            };",
+    ).unwrap();
+
+    let mut visitor = PrettyPrintVisitor::new();
+    visitor.visit(&original_ast);
+
+    let pretty_print_ast = parse_string(&*visitor.get_output()).unwrap();
+    assert_eq!(pretty_print_ast, original_ast);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"6731d5b79471ebd6c4f0a4eea78433fe8c62a83e4a4d0a3a1dddf2d5b68718f6","Cargo.toml":"d70c63ea1067f03ea076eb765ac1dc872ef310404266f970c251f2506f43d27d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"70480dc70c2fe1d9bbb64dab9a0abce266332905ffef9cabeae26dd027716ecb","README.md":"3984e447e7c57329054e2f6deb0a4c506f2d5834874d302e8eb1b0f021292db0","appveyor.yml":"a1e941db4a90c6b0e330cd439b49b3316888be28fd3268e69bf9cd88309232cd","examples/dump_yaml.rs":"c2dd4d2db49939b418e8091ad4e9d973540f4ea9acb95e256b6eb780c3816c56","src/emitter.rs":"fc735c05dfcfd5211ac503c4a6adfb4b368a2829e245f2e8e46aa9095d3360fb","src/lib.rs":"f94f1f11d37bffd80a545b3ccba24d1bebc8684c149676a7543fbce639d92076","src/parser.rs":"5f47469edecae8005462d1a80b14fc3e59ae0e947524fb60b1eabb75eb9543f3","src/scanner.rs":"a0b017545dd830d8b97481c3b156685040895ac557b2fc4879b0c4517f2e3723","src/yaml.rs":"6b7409625c1ed7765430e95b181f86fe20e0a52f9ee95f868f09d00cb28dc8b9","tests/quickcheck.rs":"f84169488174b93470df4db0b0e1a5af4f2c1daca397d0f14f02eaaa55da9991","tests/spec_test.rs":"59008e0845bd9ae3a01da5902160f21acbaa4287cf8ae4e26e44b553f0feebc6","tests/spec_test.rs.inc":"544c4d483bbde2401d869c6bf3f2246d3b79fbd13686186acf008f1e19cc86f6","tests/specexamples.rs.inc":"9fa45b9ab96063371878f13f4c3560c560a9c3ba0d71b678265c54523148651c","tests/specs/cpp2rust.rb":"054eca3596adfa59aeec65a15467e41eed472fdcab94900705779cb3376b1c7b","tests/specs/handler_spec_test.cpp":"da8bd253c852ede98e77e8f9196bfaccdae48b77409c3c481b80b6ef56fa40df","tests/specs/libyaml_fail-01.yaml":"c71bced67468f970c195caf605c65fd94009a3be692287a0ad119d9b8e976788","tests/specs/libyaml_fail-02.yaml":"c2e77dd417a474b257651f73f685009d267388be62235d11f195a350a7751ec5","tests/specs/libyaml_fail-03.yaml":"6b0db56f8ce8b2e0ba0a361b86067718a67839b2ce62eb91165ea93f22a9a4a7"},"package":"57ab38ee1a4a266ed033496cf9af1828d8d6e6c1cfa5f643a2809effcae4d628"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/.travis.yml
@@ -0,0 +1,20 @@
+language: rust
+rust:
+  - 1.11.0
+  - 1.16.0
+  - beta
+  - nightly
+matrix:
+  allow_failures:
+    - rust: nightly
+env:
+  global:
+    - secure: ZUcdcbS8xbpdII9FSPx7VtoVhEkJhWL2Hb75tDlKDHNhfXqmt1NyB9q/2qXJ5Ulp4MnYXwsI8LsDloR6gvdB4xElay3smuF/neGvMjrqcB15/2p0MSQ+kZjMsNB6mlb5kAlm8ahduXIscppmw/V+m5hn3Vo+RQz/Ng+pzv0nc8KEXPMYrfRFg+a7FaeIbRbb8ir9EfflUSqArLq2hbi2WdhM3hFMcCIAUt6DD4x5ubjEg60OnIof5FDu0mXMXzQvUfHWOeYnsNcD/DLyDnm6FuQEzk37M4EB8op2SdBUeQMQ5abR3i2rd//DZpbTTEjud0PseWohGAwTwL2aoFrqs7uYQMx+vcGlOzAyDUm4VemVUa3F2BECdzU5BiujcKOITJEVUYWongld93arQq34FuXG/TO/T1XrerxfG6LTkTkKS5Vz7W8z6Rloa99WrQLJg1ZJP6itEU7G7KsDFVgRhsg7rz4/dV/2+cV4UvIwd4HlGXKCFlH0SClqvM3/7i/qqCD0689SJW6Zip+ly38MXlGy2s/AmReEasXvFer9JkOEIuPa8QTBNAjDlw7bWXi6neQWBIZU1VhZcSssnrVmEFN8fNklShzpw5DyKCv8jPTx2O6Dw8B/LgIK8uo+eaTXiO6zz/T1c/qEdsYslvxPA2D3F+ONpPU7238ykT4eRog=
+script:
+  - cargo build --verbose
+  - |
+      if [ "$TRAVIS_RUST_VERSION" = nightly ]; then
+          cargo install clippy --debug
+          cargo clippy -- -Dclippy
+      fi
+  - cargo test --verbose
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "yaml-rust"
+version = "0.4.0"
+authors = ["Yuheng Chen <yuhengchen@sensetime.com>"]
+homepage = "http://chyh1990.github.io/yaml-rust/"
+documentation = "http://chyh1990.github.io/yaml-rust/doc/yaml_rust/"
+license = "MIT/Apache-2.0"
+description = "The missing YAML 1.2 parser for rust"
+repository = "https://github.com/chyh1990/yaml-rust"
+# publish = false # this branch contains breaking changes
+
+[dependencies]
+linked-hash-map = ">=0.0.9, <0.6"
+
+[dev-dependencies]
+quickcheck = "0.4"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/LICENSE-MIT
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Chen Yuheng
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/README.md
@@ -0,0 +1,138 @@
+# yaml-rust
+
+The missing YAML 1.2 implementation for Rust.
+
+[![Build Status](https://travis-ci.org/chyh1990/yaml-rust.svg?branch=master)](https://travis-ci.org/chyh1990/yaml-rust)
+[![Build status](https://ci.appveyor.com/api/projects/status/scf47535ckp4ylg4?svg=true)](https://ci.appveyor.com/project/chyh1990/yaml-rust)
+[![license](https://img.shields.io/crates/l/yaml-rust.svg)](https://crates.io/crates/yaml-rust/)
+[![version](https://img.shields.io/crates/v/yaml-rust.svg)](https://crates.io/crates/yaml-rust/)
+
+`yaml-rust` is a pure Rust YAML 1.2 implementation,
+which enjoys the memory safety
+property and other benefits from the Rust language.
+The parser is heavily influenced by `libyaml` and `yaml-cpp`.
+
+This crate works on all Rust-supported platforms. It also works on
+Rust 1.0.0 and nightly!
+
+See [Document](http://chyh1990.github.io/yaml-rust/doc/yaml_rust/)
+
+> NOTE: This library is still under heavy development.
+
+> WARNING: This library needs more tests and it is NOT ready for
+> parsing arbitrary user input from *untrusted source*.
+
+## Quick Start
+
+Add the following to the Cargo.toml of your project:
+
+```toml
+[dependencies]
+yaml-rust = "0.3"
+```
+
+or
+
+```toml
+[dependencies.yaml-rust]
+git = "https://github.com/chyh1990/yaml-rust.git"
+```
+
+and import:
+
+```rust
+extern crate yaml_rust;
+```
+
+Use `yaml::YamlLoader` to load the YAML documents and access it
+as Vec/HashMap:
+
+```rust
+extern crate yaml_rust;
+use yaml_rust::{YamlLoader, YamlEmitter};
+
+fn main() {
+    let s =
+"
+foo:
+    - list1
+    - list2
+bar:
+    - 1
+    - 2.0
+";
+    let docs = YamlLoader::load_from_str(s).unwrap();
+
+    // Multi document support, doc is a yaml::Yaml
+    let doc = &docs[0];
+
+    // Debug support
+    println!("{:?}", doc);
+
+    // Index access for map & array
+    assert_eq!(doc["foo"][0].as_str().unwrap(), "list1");
+    assert_eq!(doc["bar"][1].as_f64().unwrap(), 2.0);
+
+    // Chained key/array access is checked and won't panic,
+    // return BadValue if they are not exist.
+    assert!(doc["INVALID_KEY"][100].is_badvalue());
+
+    // Dump the YAML object
+    let mut out_str = String::new();
+    {
+        let mut emitter = YamlEmitter::new(&mut out_str);
+        emitter.dump(doc).unwrap(); // dump the YAML object to a String
+    }
+    println!("{}", out_str);
+}
+```
+
+Note that `yaml_rust::Yaml` implements `Index<&'a str>` & `Index<usize>`:
+
+* `Index<usize>` assumes the container is an Array
+* `Index<&'a str>` assumes the container is a string to value Map
+* otherwise, `Yaml::BadValue` is returned
+
+If your document does not conform to this convention (e.g. map with
+complex type key), you can use the `Yaml::as_XXX` family API to access your
+documents.
+
+## Features
+
+* Pure Rust
+* Ruby-like Array/Hash access API
+* Low-level YAML events emission
+
+## Specification Compliance
+
+This implementation aims to provide YAML parser fully compatible with
+the YAML 1.2 specification. The parser can correctly parse almost all
+examples in the specification, except for the following known bugs:
+
+* Empty plain scalar in certain contexts
+
+However, the widely used library `libyaml` also fails to parse these examples,
+so it may not be a huge problem for most users.
+
+## Goals
+
+* Encoder
+* Tag directive
+* Alias while desearilization
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+## Contribution
+
+Fork & PR on Github.
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
+additional terms or conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/appveyor.yml
@@ -0,0 +1,13 @@
+install:
+  - ps: Start-FileDownload 'https://static.rust-lang.org/dist/rust-1.16.0-i686-pc-windows-gnu.exe'
+  - rust-1.16.0-i686-pc-windows-gnu.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
+  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
+  - SET PATH=%PATH%;C:\MinGW\bin
+  - rustc -V
+  - cargo -V
+  - git submodule update --init --recursive
+
+build: false
+
+test_script:
+  - cargo test --verbose
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/examples/dump_yaml.rs
@@ -0,0 +1,46 @@
+extern crate yaml_rust;
+
+use std::env;
+use std::fs::File;
+use std::io::prelude::*;
+use yaml_rust::yaml;
+
+fn print_indent(indent: usize) {
+    for _ in 0..indent {
+        print!("    ");
+    }
+}
+
+fn dump_node(doc: &yaml::Yaml, indent: usize) {
+    match *doc {
+        yaml::Yaml::Array(ref v) => {
+            for x in v {
+                dump_node(x, indent + 1);
+            }
+        },
+        yaml::Yaml::Hash(ref h) => {
+            for (k, v) in h {
+                print_indent(indent);
+                println!("{:?}:", k);
+                dump_node(v, indent + 1);
+            }
+        },
+        _ => {
+            print_indent(indent);
+            println!("{:?}", doc);
+        }
+    }
+}
+
+fn main() {
+    let args: Vec<_> = env::args().collect();
+    let mut f = File::open(&args[1]).unwrap();
+    let mut s = String::new();
+    f.read_to_string(&mut s).unwrap();
+
+    let docs = yaml::YamlLoader::load_from_str(&s).unwrap();
+    for doc in &docs {
+        println!("---");
+        dump_node(doc, 0);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/src/emitter.rs
@@ -0,0 +1,611 @@
+use std::fmt::{self, Display};
+use std::convert::From;
+use std::error::Error;
+use yaml::{Hash, Yaml};
+
+
+#[derive(Copy, Clone, Debug)]
+pub enum EmitError {
+        FmtError(fmt::Error),
+        BadHashmapKey,
+}
+
+impl Error for EmitError {
+    fn description(&self) -> &str {
+        match *self {
+            EmitError::FmtError(ref err) => err.description(),
+            EmitError::BadHashmapKey => "bad hashmap key",
+        }
+    }
+
+    fn cause(&self) -> Option<&Error> {
+        None
+    }
+}
+
+impl Display for EmitError {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            EmitError::FmtError(ref err) => Display::fmt(err, formatter),
+            EmitError::BadHashmapKey => formatter.write_str("bad hashmap key"),
+        }
+    }
+}
+
+impl From<fmt::Error> for EmitError {
+    fn from(f: fmt::Error) -> Self {
+        EmitError::FmtError(f)
+    }
+}
+
+pub struct YamlEmitter<'a> {
+    writer: &'a mut fmt::Write,
+    best_indent: usize,
+    compact: bool,
+
+    level: isize,
+}
+
+pub type EmitResult = Result<(), EmitError>;
+
+// from serialize::json
+fn escape_str(wr: &mut fmt::Write, v: &str) -> Result<(), fmt::Error> {
+    try!(wr.write_str("\""));
+
+    let mut start = 0;
+
+    for (i, byte) in v.bytes().enumerate() {
+        let escaped = match byte {
+            b'"' => "\\\"",
+            b'\\' => "\\\\",
+            b'\x00' => "\\u0000",
+            b'\x01' => "\\u0001",
+            b'\x02' => "\\u0002",
+            b'\x03' => "\\u0003",
+            b'\x04' => "\\u0004",
+            b'\x05' => "\\u0005",
+            b'\x06' => "\\u0006",
+            b'\x07' => "\\u0007",
+            b'\x08' => "\\b",
+            b'\t' => "\\t",
+            b'\n' => "\\n",
+            b'\x0b' => "\\u000b",
+            b'\x0c' => "\\f",
+            b'\r' => "\\r",
+            b'\x0e' => "\\u000e",
+            b'\x0f' => "\\u000f",
+            b'\x10' => "\\u0010",
+            b'\x11' => "\\u0011",
+            b'\x12' => "\\u0012",
+            b'\x13' => "\\u0013",
+            b'\x14' => "\\u0014",
+            b'\x15' => "\\u0015",
+            b'\x16' => "\\u0016",
+            b'\x17' => "\\u0017",
+            b'\x18' => "\\u0018",
+            b'\x19' => "\\u0019",
+            b'\x1a' => "\\u001a",
+            b'\x1b' => "\\u001b",
+            b'\x1c' => "\\u001c",
+            b'\x1d' => "\\u001d",
+            b'\x1e' => "\\u001e",
+            b'\x1f' => "\\u001f",
+            b'\x7f' => "\\u007f",
+            _ => { continue; }
+        };
+
+        if start < i {
+            try!(wr.write_str(&v[start..i]));
+        }
+
+        try!(wr.write_str(escaped));
+
+        start = i + 1;
+    }
+
+    if start != v.len() {
+        try!(wr.write_str(&v[start..]));
+    }
+
+    try!(wr.write_str("\""));
+    Ok(())
+}
+
+impl<'a> YamlEmitter<'a> {
+    pub fn new(writer: &'a mut fmt::Write) -> YamlEmitter {
+        YamlEmitter {
+            writer: writer,
+            best_indent: 2,
+            compact: true,
+
+            level: -1
+        }
+    }
+
+    /// Set 'compact inline notation' on or off, as described for block
+    /// [sequences](http://www.yaml.org/spec/1.2/spec.html#id2797382)
+    /// and
+    /// [mappings](http://www.yaml.org/spec/1.2/spec.html#id2798057).
+    ///
+    /// In this form, blocks cannot have any properties (such as anchors
+    /// or tags), which should be OK, because this emitter doesn't
+    /// (currently) emit those anyways.
+    pub fn compact(&mut self, compact: bool) {
+      self.compact = compact;
+    }
+
+    /// Determine if this emitter is using 'compact inline notation'.
+    pub fn is_compact(&self) -> bool {
+      self.compact
+    }
+
+    pub fn dump(&mut self, doc: &Yaml) -> EmitResult {
+        // write DocumentStart
+        try!(write!(self.writer, "---\n"));
+        self.level = -1;
+        self.emit_node(doc)
+    }
+
+    fn write_indent(&mut self) -> EmitResult {
+        if self.level <= 0 { return Ok(()); }
+        for _ in 0..self.level {
+            for _ in 0..self.best_indent {
+                try!(write!(self.writer, " "));
+            }
+        }
+        Ok(())
+    }
+
+    fn emit_node(&mut self, node: &Yaml) -> EmitResult {
+        match *node {
+            Yaml::Array(ref v) => self.emit_array(v),
+            Yaml::Hash(ref h) => self.emit_hash(h),
+            Yaml::String(ref v) => {
+                if need_quotes(v) {
+                    try!(escape_str(self.writer, v));
+                }
+                else {
+                    try!(write!(self.writer, "{}", v));
+                }
+                Ok(())
+            },
+            Yaml::Boolean(v) => {
+                if v {
+                    try!(self.writer.write_str("true"));
+                } else {
+                    try!(self.writer.write_str("false"));
+                }
+                Ok(())
+            },
+            Yaml::Integer(v) => {
+                try!(write!(self.writer, "{}", v));
+                Ok(())
+            },
+            Yaml::Real(ref v) => {
+                try!(write!(self.writer, "{}", v));
+                Ok(())
+            },
+            Yaml::Null | Yaml::BadValue => {
+                try!(write!(self.writer, "~"));
+                Ok(())
+            },
+            // XXX(chenyh) Alias
+            _ => { Ok(()) }
+        }
+    }
+
+    fn emit_array(&mut self, v: &[Yaml]) -> EmitResult {
+        if v.is_empty() {
+            try!(write!(self.writer, "[]"));
+        } else {
+            self.level += 1;
+            for (cnt, x) in v.iter().enumerate() {
+                if cnt > 0 {
+                    try!(write!(self.writer, "\n"));
+                    try!(self.write_indent());
+                }
+                try!(write!(self.writer, "-"));
+                try!(self.emit_val(true, x));
+            }
+            self.level -= 1;
+        }
+        Ok(())
+    }
+
+    fn emit_hash(&mut self, h: &Hash) -> EmitResult {
+        if h.is_empty() {
+            try!(self.writer.write_str("{}"));
+        } else {
+            self.level += 1;
+            for (cnt, (k, v)) in h.iter().enumerate() {
+                let complex_key = match *k {
+                  Yaml::Hash(_) | Yaml::Array(_) => true,
+                  _ => false,
+                };
+                if cnt > 0 {
+                    try!(write!(self.writer, "\n"));
+                    try!(self.write_indent());
+                }
+                if complex_key {
+                  try!(write!(self.writer, "?"));
+                  try!(self.emit_val(true, k));
+                  try!(write!(self.writer, "\n"));
+                  try!(self.write_indent());
+                  try!(write!(self.writer, ":"));
+                  try!(self.emit_val(true, v));
+                } else {
+                  try!(self.emit_node(k));
+                  try!(write!(self.writer, ":"));
+                  try!(self.emit_val(false, v));
+                }
+            }
+            self.level -= 1;
+        }
+        Ok(())
+    }
+
+    /// Emit a yaml as a hash or array value: i.e., which should appear
+    /// following a ":" or "-", either after a space, or on a new line.
+    /// If `inline` is true, then the preceeding characters are distinct
+    /// and short enough to respect the compact flag.
+    fn emit_val(&mut self, inline: bool, val: &Yaml) -> EmitResult {
+        match *val {
+            Yaml::Array(ref v) => {
+                if (inline && self.compact) || v.is_empty() {
+                    try!(write!(self.writer, " "));
+                } else {
+                    try!(write!(self.writer, "\n"));
+                    self.level += 1;
+                    try!(self.write_indent());
+                    self.level -= 1;
+                }
+                self.emit_array(v)
+            },
+            Yaml::Hash(ref h) => {
+                if (inline && self.compact) || h.is_empty() {
+                    try!(write!(self.writer, " "));
+                } else {
+                    try!(write!(self.writer, "\n"));
+                    self.level += 1;
+                    try!(self.write_indent());
+                    self.level -= 1;
+                }
+                self.emit_hash(h)
+            },
+            _ => {
+                try!(write!(self.writer, " "));
+                self.emit_node(val)
+            }
+        }
+    }
+}
+
+/// Check if the string requires quoting.
+/// Strings containing any of the following characters must be quoted.
+/// :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `
+///
+/// If the string contains any of the following control characters, it must be escaped with double quotes:
+/// \0, \x01, \x02, \x03, \x04, \x05, \x06, \a, \b, \t, \n, \v, \f, \r, \x0e, \x0f, \x10, \x11, \x12, \x13, \x14, \x15, \x16, \x17, \x18, \x19, \x1a, \e, \x1c, \x1d, \x1e, \x1f, \N, \_, \L, \P
+///
+/// Finally, there are other cases when the strings must be quoted, no matter if you're using single or double quotes:
+/// * When the string is true or false (otherwise, it would be treated as a boolean value);
+/// * When the string is null or ~ (otherwise, it would be considered as a null value);
+/// * When the string looks like a number, such as integers (e.g. 2, 14, etc.), floats (e.g. 2.6, 14.9) and exponential numbers (e.g. 12e7, etc.) (otherwise, it would be treated as a numeric value);
+/// * When the string looks like a date (e.g. 2014-12-31) (otherwise it would be automatically converted into a Unix timestamp).
+fn need_quotes(string: &str) -> bool {
+    fn need_quotes_spaces(string: &str) -> bool {
+        string.starts_with(' ')
+            || string.ends_with(' ')
+    }
+
+    string == ""
+    || need_quotes_spaces(string)
+    || string.contains(|character: char| {
+        match character {
+            ':' | '{' | '}' | '[' | ']' | ',' | '&' | '*' | '#' | '?' | '|' | '-' | '<' | '>' | '=' | '!' | '%' | '@' | '`' | '\"' | '\'' | '\\' | '\0' ... '\x06' | '\t' | '\n' | '\r' | '\x0e' ... '\x1a' | '\x1c' ... '\x1f' => true,
+            _ => false,
+        }
+    })
+    || [// http://yaml.org/type/bool.html
+        "y","Y","yes","Yes","YES","n","N","no","No","NO",
+        "True", "TRUE", "true", "False", "FALSE", "false",
+        "on","On","ON","off","Off","OFF",
+        // http://yaml.org/type/null.html
+        "null","Null","NULL", "~"
+    ].contains(&string)
+    || string.starts_with('.')
+    || string.parse::<i64>().is_ok()
+    || string.parse::<f64>().is_ok()
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use YamlLoader;
+
+    #[test]
+    fn test_emit_simple() {
+        let s = "
+# comment
+a0 bb: val
+a1:
+    b1: 4
+    b2: d
+a2: 4 # i'm comment
+a3: [1, 2, 3]
+a4:
+    - [a1, a2]
+    - 2
+";
+
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+        println!("original:\n{}", s);
+        println!("emitted:\n{}", writer);
+        let docs_new = match YamlLoader::load_from_str(&writer) {
+            Ok(y) => y,
+            Err(e) => panic!(format!("{}", e))
+        };
+        let doc_new = &docs_new[0];
+
+        assert_eq!(doc, doc_new);
+    }
+
+    #[test]
+    fn test_emit_complex() {
+        let s = r#"
+cataloge:
+  product: &coffee   { name: Coffee,    price: 2.5  ,  unit: 1l  }
+  product: &cookies  { name: Cookies!,  price: 3.40 ,  unit: 400g}
+
+products:
+  *coffee:
+    amount: 4
+  *cookies:
+    amount: 4
+  [1,2,3,4]:
+    array key
+  2.4:
+    real key
+  true:
+    bool key
+  {}:
+    empty hash key
+            "#;
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+        let docs_new = match YamlLoader::load_from_str(&writer) {
+            Ok(y) => y,
+            Err(e) => panic!(format!("{}", e))
+        };
+        let doc_new = &docs_new[0];
+        assert_eq!(doc, doc_new);
+    }
+
+    #[test]
+    fn test_emit_avoid_quotes() {
+        let s = r#"---
+a7: 你好
+boolean: "true"
+boolean2: "false"
+date: "2014-12-31"
+empty_string: ""
+empty_string1: " "
+empty_string2: "    a"
+empty_string3: "    a "
+exp: "12e7"
+field: ":"
+field2: "{"
+field3: "\\"
+field4: "\n"
+float: "2.6"
+int: "4"
+nullable: "null"
+nullable2: "~"
+products:
+  "*coffee":
+    amount: 4
+  "*cookies":
+    amount: 4
+  ".milk":
+    amount: 1
+  "2.4": real key
+  "[1,2,3,4]": array key
+  "true": bool key
+  "{}": empty hash key
+x: test
+"y": "can't avoid quoting here"
+z: string with spaces"#;
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+
+        assert_eq!(s, writer, "actual:\n\n{}\n", writer);
+    }
+
+    #[test]
+    fn emit_quoted_bools() {
+        let input = r#"---
+string0: yes
+string1: no
+string2: "true"
+string3: "false"
+string4: "~"
+null0: ~
+[true, false]: real_bools
+[True, TRUE, False, FALSE, y,Y,yes,Yes,YES,n,N,no,No,NO,on,On,ON,off,Off,OFF]: false_bools
+bool0: true
+bool1: false"#;
+        let expected = r#"---
+string0: "yes"
+string1: "no"
+string2: "true"
+string3: "false"
+string4: "~"
+null0: ~
+? - true
+  - false
+: real_bools
+? - "True"
+  - "TRUE"
+  - "False"
+  - "FALSE"
+  - "y"
+  - "Y"
+  - "yes"
+  - "Yes"
+  - "YES"
+  - "n"
+  - "N"
+  - "no"
+  - "No"
+  - "NO"
+  - "on"
+  - "On"
+  - "ON"
+  - "off"
+  - "Off"
+  - "OFF"
+: false_bools
+bool0: true
+bool1: false"#;
+
+        let docs = YamlLoader::load_from_str(&input).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+
+        assert_eq!(expected, writer, "actual:\n\n{}\n", writer);
+    }
+
+    #[test]
+    fn test_empty_and_nested() {
+      test_empty_and_nested_flag(false)
+    }
+
+    #[test]
+    fn test_empty_and_nested_compact() {
+      test_empty_and_nested_flag(true)
+    }
+
+    fn test_empty_and_nested_flag(compact: bool) {
+        let s = if compact { r#"---
+a:
+  b:
+    c: hello
+  d: {}
+e:
+  - f
+  - g
+  - h: []"# } else { r#"---
+a:
+  b:
+    c: hello
+  d: {}
+e:
+  - f
+  - g
+  -
+    h: []"# };
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.compact(compact);
+            emitter.dump(doc).unwrap();
+        }
+
+        assert_eq!(s, writer);
+    }
+
+    #[test]
+    fn test_nested_arrays() {
+        let s = r#"---
+a:
+  - b
+  - - c
+    - d
+    - - e
+      - f"#;
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+        println!("original:\n{}", s);
+        println!("emitted:\n{}", writer);
+
+        assert_eq!(s, writer);
+    }
+
+    #[test]
+    fn test_deeply_nested_arrays() {
+        let s = r#"---
+a:
+  - b
+  - - c
+    - d
+    - - e
+      - - f
+      - - e"#;
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+        println!("original:\n{}", s);
+        println!("emitted:\n{}", writer);
+
+        assert_eq!(s, writer);
+    }
+
+    #[test]
+    fn test_nested_hashes() {
+        let s = r#"---
+a:
+  b:
+    c:
+      d:
+        e: f"#;
+
+        let docs = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &docs[0];
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+        println!("original:\n{}", s);
+        println!("emitted:\n{}", writer);
+
+        assert_eq!(s, writer);
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/src/lib.rs
@@ -0,0 +1,118 @@
+// Copyright 2015, Yuheng Chen. See the LICENSE file at the top-level
+// directory of this distribution.
+
+//! YAML 1.2 implementation in pure Rust.
+//!
+//! # Usage
+//!
+//! This crate is [on github](https://github.com/chyh1990/yaml-rust) and can be
+//! used by adding `yaml-rust` to the dependencies in your project's `Cargo.toml`.
+//!
+//! ```toml
+//! [dependencies.yaml-rust]
+//! git = "https://github.com/chyh1990/yaml-rust.git"
+//! ```
+//!
+//! And this in your crate root:
+//!
+//! ```rust
+//! extern crate yaml_rust;
+//! ```
+//!
+//! Parse a string into `Vec<Yaml>` and then serialize it as a YAML string.
+//!
+//! # Examples
+//!
+//! ```
+//! use yaml_rust::{YamlLoader, YamlEmitter};
+//!
+//! let docs = YamlLoader::load_from_str("[1, 2, 3]").unwrap();
+//! let doc = &docs[0]; // select the first document
+//! assert_eq!(doc[0].as_i64().unwrap(), 1); // access elements by index
+//!
+//! let mut out_str = String::new();
+//! let mut emitter = YamlEmitter::new(&mut out_str);
+//! emitter.dump(doc).unwrap(); // dump the YAML object to a String
+//!
+//! ```
+
+#![cfg_attr(feature = "cargo-clippy", warn(cyclomatic_complexity))]
+#![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
+
+extern crate linked_hash_map;
+
+pub mod yaml;
+pub mod scanner;
+pub mod parser;
+pub mod emitter;
+
+// reexport key APIs
+pub use scanner::ScanError;
+pub use parser::Event;
+pub use yaml::{Yaml, YamlLoader};
+pub use emitter::{YamlEmitter, EmitError};
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_api() {
+        let s =
+"
+# from yaml-cpp example
+- name: Ogre
+  position: [0, 5, 0]
+  powers:
+    - name: Club
+      damage: 10
+    - name: Fist
+      damage: 8
+- name: Dragon
+  position: [1, 0, 10]
+  powers:
+    - name: Fire Breath
+      damage: 25
+    - name: Claws
+      damage: 15
+- name: Wizard
+  position: [5, -3, 0]
+  powers:
+    - name: Acid Rain
+      damage: 50
+    - name: Staff
+      damage: 3
+";
+        let docs = YamlLoader::load_from_str(s).unwrap();
+        let doc = &docs[0];
+
+        assert_eq!(doc[0]["name"].as_str().unwrap(), "Ogre");
+
+        let mut writer = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut writer);
+            emitter.dump(doc).unwrap();
+        }
+
+        assert!(!writer.is_empty());
+    }
+
+    fn try_fail(s: &str) -> Result<Vec<Yaml>, ScanError> {
+        let t = try!(YamlLoader::load_from_str(s));
+        Ok(t)
+    }
+
+    #[test]
+    fn test_fail() {
+        let s =
+"
+# syntax error
+scalar
+key: [1, 2]]
+key1:a2
+";
+        assert!(YamlLoader::load_from_str(s).is_err());
+        assert!(try_fail(s).is_err());
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/src/parser.rs
@@ -0,0 +1,844 @@
+use scanner::*;
+use std::collections::HashMap;
+
+#[derive(Clone, Copy, PartialEq, Debug, Eq)]
+enum State {
+    StreamStart,
+    ImplicitDocumentStart,
+    DocumentStart,
+    DocumentContent,
+    DocumentEnd,
+    BlockNode,
+    // BlockNodeOrIndentlessSequence,
+    // FlowNode,
+    BlockSequenceFirstEntry,
+    BlockSequenceEntry,
+    IndentlessSequenceEntry,
+    BlockMappingFirstKey,
+    BlockMappingKey,
+    BlockMappingValue,
+    FlowSequenceFirstEntry,
+    FlowSequenceEntry,
+    FlowSequenceEntryMappingKey,
+    FlowSequenceEntryMappingValue,
+    FlowSequenceEntryMappingEnd,
+    FlowMappingFirstKey,
+    FlowMappingKey,
+    FlowMappingValue,
+    FlowMappingEmptyValue,
+    End
+}
+
+/// `Event` is used with the low-level event base parsing API,
+/// see `EventReceiver` trait.
+#[derive(Clone, PartialEq, Debug, Eq)]
+pub enum Event {
+    /// Reserved for internal use
+    Nothing,
+    StreamStart,
+    StreamEnd,
+    DocumentStart,
+    DocumentEnd,
+    /// Refer to an anchor ID
+    Alias(usize),
+    /// Value, style, anchor_id, tag
+    Scalar(String, TScalarStyle, usize, Option<TokenType>),
+    /// Anchor ID
+    SequenceStart(usize),
+    SequenceEnd,
+    /// Anchor ID
+    MappingStart(usize),
+    MappingEnd
+}
+
+impl Event {
+    fn empty_scalar() -> Event {
+        // a null scalar
+        Event::Scalar("~".to_owned(), TScalarStyle::Plain, 0, None)
+    }
+
+    fn empty_scalar_with_anchor(anchor: usize, tag: Option<TokenType>) -> Event {
+        Event::Scalar("".to_owned(), TScalarStyle::Plain, anchor, tag)
+    }
+}
+
+#[derive(Debug)]
+pub struct Parser<T> {
+    scanner: Scanner<T>,
+    states: Vec<State>,
+    state: State,
+    marks: Vec<Marker>,
+    token: Option<Token>,
+    current: Option<(Event, Marker)>,
+    anchors: HashMap<String, usize>,
+    anchor_id: usize,
+}
+
+
+pub trait EventReceiver {
+    fn on_event(&mut self, ev: Event);
+}
+
+
+pub trait MarkedEventReceiver {
+    fn on_event(&mut self, ev: Event, _mark: Marker);
+}
+
+impl<R: EventReceiver> MarkedEventReceiver for R {
+    fn on_event(&mut self, ev: Event, _mark: Marker) {
+        self.on_event(ev)
+    }
+}
+
+pub type ParseResult = Result<(Event, Marker), ScanError>;
+
+impl<T: Iterator<Item=char>> Parser<T> {
+    pub fn new(src: T) -> Parser<T> {
+        Parser {
+            scanner: Scanner::new(src),
+            states: Vec::new(),
+            state: State::StreamStart,
+            marks: Vec::new(),
+            token: None,
+            current: None,
+
+            anchors: HashMap::new(),
+            // valid anchor_id starts from 1
+            anchor_id: 1,
+        }
+    }
+
+    pub fn peek(&mut self) -> Result<&(Event, Marker), ScanError> {
+        match self.current {
+            Some(ref x) => Ok(x),
+            None => {
+                self.current = Some(try!(self.next()));
+                self.peek()
+            }
+        }
+    }
+
+    pub fn next(&mut self) -> ParseResult {
+        match self.current {
+            None => self.parse(),
+            Some(_) => {
+                Ok(self.current.take().unwrap())
+            }
+        }
+    }
+
+    fn peek_token(&mut self) -> Result<&Token, ScanError> {
+        match self.token {
+            None =>  {
+                self.token = Some(try!(self.scan_next_token()));
+                Ok(self.token.as_ref().unwrap())
+            },
+            Some(ref tok) => Ok(tok)
+        }
+    }
+
+    fn scan_next_token(&mut self) -> Result<Token, ScanError> {
+        let token = self.scanner.next();
+        match token {
+            None =>
+                match self.scanner.get_error() {
+                    None => Err(ScanError::new(self.scanner.mark(), "unexpected eof")),
+                    Some(e) => Err(e),
+                },
+            Some(tok) => Ok(tok)
+        }
+    }
+
+    fn fetch_token(&mut self) -> Token {
+        self.token.take().expect("fetch_token needs to be preceded by peek_token")
+    }
+
+
+    fn skip(&mut self) {
+        self.token = None;
+        //self.peek_token();
+    }
+    fn pop_state(&mut self) {
+        self.state = self.states.pop().unwrap()
+    }
+    fn push_state(&mut self, state: State) {
+        self.states.push(state);
+    }
+
+    fn parse(&mut self) -> ParseResult {
+        if self.state == State::End {
+            return Ok((Event::StreamEnd, self.scanner.mark()));
+        }
+        let (ev, mark) = try!(self.state_machine());
+        // println!("EV {:?}", ev);
+        Ok((ev, mark))
+    }
+
+    pub fn load<R: MarkedEventReceiver>(&mut self, recv: &mut R, multi: bool)
+        -> Result<(), ScanError> {
+        if !self.scanner.stream_started() {
+            let (ev, mark) = try!(self.next());
+            assert_eq!(ev, Event::StreamStart);
+            recv.on_event(ev, mark);
+        }
+
+        if self.scanner.stream_ended() {
+            // XXX has parsed?
+            recv.on_event(Event::StreamEnd, self.scanner.mark());
+            return Ok(());
+        }
+        loop {
+            let (ev, mark) = try!(self.next());
+            if ev == Event::StreamEnd {
+                recv.on_event(ev, mark);
+                return Ok(());
+            }
+            // clear anchors before a new document
+            self.anchors.clear();
+            try!(self.load_document(ev, mark, recv));
+            if !multi {
+                break;
+            }
+        }
+        Ok(())
+    }
+
+    fn load_document<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
+        -> Result<(), ScanError> {
+        assert_eq!(first_ev, Event::DocumentStart);
+        recv.on_event(first_ev, mark);
+
+        let (ev, mark) = try!(self.next());
+        try!(self.load_node(ev, mark, recv));
+
+        // DOCUMENT-END is expected.
+        let (ev, mark) = try!(self.next());
+        assert_eq!(ev, Event::DocumentEnd);
+        recv.on_event(ev, mark);
+
+        Ok(())
+    }
+
+    fn load_node<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
+        -> Result<(), ScanError> {
+        match first_ev {
+            Event::Alias(..) | Event::Scalar(..) => {
+                recv.on_event(first_ev, mark);
+                Ok(())
+            },
+            Event::SequenceStart(_) => {
+                recv.on_event(first_ev, mark);
+                self.load_sequence(recv)
+            },
+            Event::MappingStart(_) => {
+                recv.on_event(first_ev, mark);
+                self.load_mapping(recv)
+            },
+            _ => { println!("UNREACHABLE EVENT: {:?}", first_ev);
+                unreachable!(); }
+        }
+    }
+
+    fn load_mapping<R: MarkedEventReceiver>(&mut self, recv: &mut R)
+        -> Result<(), ScanError> {
+        let (mut key_ev, mut key_mark) = try!(self.next());
+        while key_ev != Event::MappingEnd {
+            // key
+            try!(self.load_node(key_ev, key_mark, recv));
+
+            // value
+            let (ev, mark) = try!(self.next());
+            try!(self.load_node(ev, mark, recv));
+
+            // next event
+            let (ev, mark) = try!(self.next());
+            key_ev = ev;
+            key_mark = mark;
+
+        }
+        recv.on_event(key_ev, key_mark);
+        Ok(())
+    }
+
+    fn load_sequence<R: MarkedEventReceiver>(&mut self, recv: &mut R)
+        -> Result<(), ScanError> {
+        let (mut ev, mut mark) = try!(self.next());
+        while ev != Event::SequenceEnd {
+            try!(self.load_node(ev, mark, recv));
+
+            // next event
+            let (next_ev, next_mark) = try!(self.next());
+            ev = next_ev;
+            mark = next_mark;
+        }
+        recv.on_event(ev, mark);
+        Ok(())
+    }
+
+    fn state_machine(&mut self) -> ParseResult {
+        // let next_tok = try!(self.peek_token());
+        // println!("cur_state {:?}, next tok: {:?}", self.state, next_tok);
+        match self.state {
+            State::StreamStart => self.stream_start(),
+
+            State::ImplicitDocumentStart => self.document_start(true),
+            State::DocumentStart => self.document_start(false),
+            State::DocumentContent => self.document_content(),
+            State::DocumentEnd => self.document_end(),
+
+            State::BlockNode => self.parse_node(true, false),
+            // State::BlockNodeOrIndentlessSequence => self.parse_node(true, true),
+            // State::FlowNode => self.parse_node(false, false),
+
+            State::BlockMappingFirstKey => self.block_mapping_key(true),
+            State::BlockMappingKey => self.block_mapping_key(false),
+            State::BlockMappingValue => self.block_mapping_value(),
+
+            State::BlockSequenceFirstEntry => self.block_sequence_entry(true),
+            State::BlockSequenceEntry => self.block_sequence_entry(false),
+
+            State::FlowSequenceFirstEntry => self.flow_sequence_entry(true),
+            State::FlowSequenceEntry => self.flow_sequence_entry(false),
+
+            State::FlowMappingFirstKey => self.flow_mapping_key(true),
+            State::FlowMappingKey => self.flow_mapping_key(false),
+            State::FlowMappingValue => self.flow_mapping_value(false),
+
+            State::IndentlessSequenceEntry => self.indentless_sequence_entry(),
+
+            State::FlowSequenceEntryMappingKey => self.flow_sequence_entry_mapping_key(),
+            State::FlowSequenceEntryMappingValue => self.flow_sequence_entry_mapping_value(),
+            State::FlowSequenceEntryMappingEnd => self.flow_sequence_entry_mapping_end(),
+            State::FlowMappingEmptyValue => self.flow_mapping_value(true),
+
+            /* impossible */
+            State::End => unreachable!(),
+        }
+    }
+
+    fn stream_start(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::StreamStart(_)) => {
+                self.state = State::ImplicitDocumentStart;
+                self.skip();
+                Ok((Event::StreamStart, mark))
+            },
+            Token(mark, _) => Err(ScanError::new(mark,
+                "did not find expected <stream-start>")),
+        }
+    }
+
+    fn document_start(&mut self, implicit: bool) -> ParseResult {
+        if !implicit {
+            while let TokenType::DocumentEnd = try!(self.peek_token()).1 {
+                self.skip();
+            }
+        }
+
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::StreamEnd) => {
+                self.state = State::End;
+                self.skip();
+                Ok((Event::StreamEnd, mark))
+            },
+            Token(_, TokenType::VersionDirective(..))
+            | Token(_, TokenType::TagDirective(..))
+            | Token(_, TokenType::DocumentStart) => {
+                // explicit document
+                self._explict_document_start()
+            },
+            Token(mark, _) if implicit => {
+                try!(self.parser_process_directives());
+                self.push_state(State::DocumentEnd);
+                self.state = State::BlockNode;
+                Ok((Event::DocumentStart, mark))
+            },
+            _ => {
+                // explicit document
+                self._explict_document_start()
+            }
+        }
+    }
+
+    fn parser_process_directives(&mut self) -> Result<(), ScanError> {
+        loop {
+            match try!(self.peek_token()).1 {
+                TokenType::VersionDirective(_, _) => {
+                    // XXX parsing with warning according to spec
+                    //if major != 1 || minor > 2 {
+                    //    return Err(ScanError::new(tok.0,
+                    //        "found incompatible YAML document"));
+                    //}
+                },
+                TokenType::TagDirective(..) => {
+                    // TODO add tag directive
+                },
+                _ => break
+            }
+            self.skip();
+        }
+        // TODO tag directive
+        Ok(())
+    }
+
+    fn _explict_document_start(&mut self) -> ParseResult {
+        try!(self.parser_process_directives());
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::DocumentStart) => {
+                self.push_state(State::DocumentEnd);
+                self.state = State::DocumentContent;
+                self.skip();
+                Ok((Event::DocumentStart, mark))
+            }    
+            Token(mark, _) => Err(ScanError::new(mark, "did not find expected <document start>"))
+        }        
+    }
+
+    fn document_content(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::VersionDirective(..))
+            | Token(mark, TokenType::TagDirective(..))
+            | Token(mark, TokenType::DocumentStart)
+            | Token(mark, TokenType::DocumentEnd)
+            | Token(mark, TokenType::StreamEnd) => {
+                self.pop_state();
+                // empty scalar
+                Ok((Event::empty_scalar(), mark))
+            },
+            _ => {
+                self.parse_node(true, false)
+            }
+        }
+    }
+
+    fn document_end(&mut self) -> ParseResult {
+        let mut _implicit = true;
+        let marker: Marker = match *try!(self.peek_token()) {
+            Token(mark, TokenType::DocumentEnd) => {
+                self.skip();
+                _implicit = false;
+                mark
+            },
+            Token(mark, _) => mark
+        };
+        
+        // TODO tag handling
+        self.state = State::DocumentStart;
+        Ok((Event::DocumentEnd, marker))
+    }
+
+    fn register_anchor(&mut self, name: String, _: &Marker) -> Result<usize, ScanError> {
+        // anchors can be overrided/reused
+        // if self.anchors.contains_key(name) {
+        //     return Err(ScanError::new(*mark,
+        //         "while parsing anchor, found duplicated anchor"));
+        // }
+        let new_id = self.anchor_id;
+        self.anchor_id += 1;
+        self.anchors.insert(name, new_id);
+        Ok(new_id)
+    }
+
+    fn parse_node(&mut self, block: bool, indentless_sequence: bool) -> ParseResult {
+        let mut anchor_id = 0;
+        let mut tag = None;
+        match *try!(self.peek_token()) {
+            Token(_, TokenType::Alias(_)) => {
+                self.pop_state();
+                if let Token(mark, TokenType::Alias(name)) = self.fetch_token() {
+                    match self.anchors.get(&name) {
+                        None => return Err(ScanError::new(mark, "while parsing node, found unknown anchor")),
+                        Some(id) => return Ok((Event::Alias(*id), mark))
+                    }
+                } else {
+                    unreachable!()
+                }
+            },
+            Token(_, TokenType::Anchor(_)) => {
+                if let Token(mark, TokenType::Anchor(name)) = self.fetch_token() {
+                    anchor_id = try!(self.register_anchor(name, &mark));
+                    if let TokenType::Tag(..) = try!(self.peek_token()).1 {
+                        if let tg @ TokenType::Tag(..) = self.fetch_token().1 {
+                            tag = Some(tg);
+                        } else {
+                            unreachable!()
+                        }
+                    }
+                } else {
+                    unreachable!()
+                }
+            },
+            Token(_, TokenType::Tag(..)) => {
+                if let tg @ TokenType::Tag(..) = self.fetch_token().1 {
+                    tag = Some(tg);
+                    if let TokenType::Anchor(_) = try!(self.peek_token()).1 {
+                        if let Token(mark, TokenType::Anchor(name)) = self.fetch_token() {
+                            anchor_id = try!(self.register_anchor(name, &mark));
+                        } else {
+                            unreachable!()
+                        }
+                    }
+                } else {
+                    unreachable!()
+                }
+            },
+            _ => {}
+        }
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::BlockEntry) if indentless_sequence => {
+                self.state = State::IndentlessSequenceEntry;
+                Ok((Event::SequenceStart(anchor_id), mark))
+            },
+            Token(_, TokenType::Scalar(..)) => {
+                self.pop_state();
+                if let Token(mark, TokenType::Scalar(style, v)) = self.fetch_token() {
+                    Ok((Event::Scalar(v, style, anchor_id, tag), mark))
+                } else {
+                    unreachable!()
+                }
+            },
+            Token(mark, TokenType::FlowSequenceStart) => {
+                self.state = State::FlowSequenceFirstEntry;
+                Ok((Event::SequenceStart(anchor_id), mark))
+            },
+            Token(mark, TokenType::FlowMappingStart) => {
+                self.state = State::FlowMappingFirstKey;
+                Ok((Event::MappingStart(anchor_id), mark))
+            },
+            Token(mark, TokenType::BlockSequenceStart) if block => {
+                self.state = State::BlockSequenceFirstEntry;
+                Ok((Event::SequenceStart(anchor_id), mark))
+            },
+            Token(mark, TokenType::BlockMappingStart) if block => {
+                self.state = State::BlockMappingFirstKey;
+                Ok((Event::MappingStart(anchor_id), mark))
+            },
+            // ex 7.2, an empty scalar can follow a secondary tag
+            Token(mark, _) if tag.is_some() || anchor_id > 0 => {
+                self.pop_state();
+                Ok((Event::empty_scalar_with_anchor(anchor_id, tag), mark))
+            },
+            Token(mark, _) => { Err(ScanError::new(mark, "while parsing a node, did not find expected node content")) }
+        }
+    }
+
+    fn block_mapping_key(&mut self, first: bool) -> ParseResult {
+        // skip BlockMappingStart
+        if first {
+            let _ = try!(self.peek_token());
+            //self.marks.push(tok.0);
+            self.skip();
+        }
+        match *try!(self.peek_token()) {
+            Token(_, TokenType::Key) => {
+                self.skip();
+                match *try!(self.peek_token()) {
+                    Token(mark, TokenType::Key)
+                    | Token(mark, TokenType::Value)
+                    | Token(mark, TokenType::BlockEnd) => {
+                        self.state = State::BlockMappingValue;
+                        // empty scalar
+                        Ok((Event::empty_scalar(), mark))
+                    }
+                    _ => {
+                        self.push_state(State::BlockMappingValue);
+                        self.parse_node(true, true)
+                    }
+                }
+            },
+            // XXX(chenyh): libyaml failed to parse spec 1.2, ex8.18
+            Token(mark, TokenType::Value) => {
+                self.state = State::BlockMappingValue;
+                Ok((Event::empty_scalar(), mark))
+            },
+            Token(mark, TokenType::BlockEnd) => {
+                self.pop_state();
+                self.skip();
+                Ok((Event::MappingEnd, mark))
+            },
+            Token(mark, _) => {
+                Err(ScanError::new(mark, "while parsing a block mapping, did not find expected key"))
+            }
+        }
+    }
+
+    fn block_mapping_value(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(_, TokenType::Value) => {
+                self.skip();
+                match *try!(self.peek_token()) {
+                    Token(mark, TokenType::Key)
+                    | Token(mark, TokenType::Value)
+                    | Token(mark, TokenType::BlockEnd) => {
+                        self.state = State::BlockMappingKey;
+                        // empty scalar
+                        Ok((Event::empty_scalar(), mark))
+                    },
+                    _ => {
+                        self.push_state(State::BlockMappingKey);
+                        self.parse_node(true, true)
+                    }
+                }
+            },
+            Token(mark, _) => {
+                self.state = State::BlockMappingKey;
+                // empty scalar
+                Ok((Event::empty_scalar(), mark))
+            }
+        }
+    }
+
+    fn flow_mapping_key(&mut self, first: bool) -> ParseResult {
+        if first {
+            let _ = try!(self.peek_token());
+            self.skip();
+        }
+        let marker: Marker = {
+            match *try!(self.peek_token()) {
+                Token(mark, TokenType::FlowMappingEnd) => mark,
+                Token(mark, _) => {
+                    if !first {
+                        match *try!(self.peek_token()) {
+                            Token(_, TokenType::FlowEntry) => self.skip(),
+                            Token(mark, _) => return Err(ScanError::new(mark,
+                                "while parsing a flow mapping, did not find expected ',' or '}'"))
+                        }
+                    }
+
+                    match *try!(self.peek_token()) {
+                        Token(_, TokenType::Key) => {
+                            self.skip();
+                            match *try!(self.peek_token()) {
+                                Token(mark, TokenType::Value)
+                                | Token(mark, TokenType::FlowEntry)
+                                | Token(mark, TokenType::FlowMappingEnd) => {
+                                    self.state = State::FlowMappingValue;
+                                    return Ok((Event::empty_scalar(), mark));
+                                },
+                                _ => {
+                                    self.push_state(State::FlowMappingValue);
+                                    return self.parse_node(false, false);
+                                }
+                            }
+                        },
+                        Token(marker, TokenType::Value) => {
+                            self.state = State::FlowMappingValue;
+                            return Ok((Event::empty_scalar(), marker));
+                        },
+                        Token(_, TokenType::FlowMappingEnd) => (),
+                        _ => {
+                            self.push_state(State::FlowMappingEmptyValue);
+                            return self.parse_node(false, false);
+                        }
+                    }
+
+                    mark
+                }
+            }
+        };
+
+        self.pop_state();
+        self.skip();
+        Ok((Event::MappingEnd, marker))
+    }
+
+    fn flow_mapping_value(&mut self, empty: bool) -> ParseResult {
+        let mark: Marker = {
+            if empty {
+                let Token(mark, _) = *try!(self.peek_token());
+                self.state = State::FlowMappingKey;
+                return Ok((Event::empty_scalar(), mark));
+            } else {
+                match *try!(self.peek_token()) {
+                    Token(marker, TokenType::Value) => {
+                        self.skip();
+                        match try!(self.peek_token()).1 {
+                            TokenType::FlowEntry
+                                | TokenType::FlowMappingEnd => { },
+                            _ => {
+                                self.push_state(State::FlowMappingKey);
+                                return self.parse_node(false, false);
+                            }
+                        }
+                        marker
+                    },
+                    Token(marker, _) => marker
+                }
+            }
+        };
+        
+        self.state = State::FlowMappingKey;
+        Ok((Event::empty_scalar(), mark))
+    }
+
+    fn flow_sequence_entry(&mut self, first: bool) -> ParseResult {
+        // skip FlowMappingStart
+        if first {
+            let _ = try!(self.peek_token());
+            //self.marks.push(tok.0);
+            self.skip();
+        }
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::FlowSequenceEnd) => {
+                self.pop_state();
+                self.skip();
+                return Ok((Event::SequenceEnd, mark));
+            },
+            Token(_, TokenType::FlowEntry) if !first => {
+                self.skip();
+            },
+            Token(mark, _) if !first => {
+                return Err(ScanError::new(mark,
+                        "while parsing a flow sequence, expectd ',' or ']'"));
+            }
+            _ => { /* next */ }
+        }
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::FlowSequenceEnd) => {
+                self.pop_state();
+                self.skip();
+                Ok((Event::SequenceEnd, mark))
+            },
+            Token(mark, TokenType::Key) => {
+                self.state = State::FlowSequenceEntryMappingKey;
+                self.skip();
+                Ok((Event::MappingStart(0), mark))
+            }
+            _ => {
+                self.push_state(State::FlowSequenceEntry);
+                self.parse_node(false, false)
+            }
+        }
+    }
+
+    fn indentless_sequence_entry(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(_, TokenType::BlockEntry) => (),
+            Token(mark, _) => {
+                self.pop_state();
+                return Ok((Event::SequenceEnd, mark));
+            }
+        }
+        self.skip();
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::BlockEntry)
+            | Token(mark, TokenType::Key)
+            | Token(mark, TokenType::Value)
+            | Token(mark, TokenType::BlockEnd) => {
+                self.state = State::IndentlessSequenceEntry;
+                Ok((Event::empty_scalar(), mark))
+            },
+            _ => {
+                self.push_state(State::IndentlessSequenceEntry);
+                self.parse_node(true, false)
+            }
+        }
+    }
+
+    fn block_sequence_entry(&mut self, first: bool) -> ParseResult {
+        // BLOCK-SEQUENCE-START
+        if first {
+            let _ = try!(self.peek_token());
+            //self.marks.push(tok.0);
+            self.skip();
+        }
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::BlockEnd) => {
+                self.pop_state();
+                self.skip();
+                Ok((Event::SequenceEnd, mark))
+            },
+            Token(_, TokenType::BlockEntry) => {
+                self.skip();
+                match *try!(self.peek_token()) {
+                    Token(mark, TokenType::BlockEntry)
+                    | Token(mark, TokenType::BlockEnd) => {
+                        self.state = State::BlockSequenceEntry;
+                        Ok((Event::empty_scalar(), mark))
+                    },
+                    _ => {
+                        self.push_state(State::BlockSequenceEntry);
+                        self.parse_node(true, false)
+                    }
+                }
+            },
+            Token(mark, _) => {
+                Err(ScanError::new(mark,
+                        "while parsing a block collection, did not find expected '-' indicator"))
+            }
+        }
+    }
+
+    fn flow_sequence_entry_mapping_key(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(mark, TokenType::Value)
+            | Token(mark, TokenType::FlowEntry)
+            | Token(mark, TokenType::FlowSequenceEnd) => {
+                self.skip();
+                self.state = State::FlowSequenceEntryMappingValue;
+                Ok((Event::empty_scalar(), mark))
+            },
+            _ => {
+                self.push_state(State::FlowSequenceEntryMappingValue);
+                self.parse_node(false, false)
+            }
+        }
+    }
+
+    fn flow_sequence_entry_mapping_value(&mut self) -> ParseResult {
+        match *try!(self.peek_token()) {
+            Token(_, TokenType::Value) => {
+                    self.skip();
+                    self.state = State::FlowSequenceEntryMappingValue;
+                    match *try!(self.peek_token()) {
+                        Token(mark, TokenType::FlowEntry)
+                        | Token(mark, TokenType::FlowSequenceEnd) => {
+                            self.state = State::FlowSequenceEntryMappingEnd;
+                            Ok((Event::empty_scalar(), mark))
+                        },
+                        _ => {
+                            self.push_state(State::FlowSequenceEntryMappingEnd);
+                            self.parse_node(false, false)
+                        }
+                    }
+            },
+            Token(mark, _) => {
+                self.state = State::FlowSequenceEntryMappingEnd;
+                Ok((Event::empty_scalar(), mark))
+            }
+        }
+    }
+
+    fn flow_sequence_entry_mapping_end(&mut self) -> ParseResult {
+        self.state = State::FlowSequenceEntry;
+        Ok((Event::MappingEnd, self.scanner.mark()))
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::{Event, Parser};
+
+    #[test]
+    fn test_peek_eq_parse() {
+        let s = "
+a0 bb: val
+a1: &x
+    b1: 4
+    b2: d
+a2: 4
+a3: [1, 2, 3]
+a4:
+    - [a1, a2]
+    - 2
+a5: *x
+";
+        let mut p = Parser::new(s.chars());
+        while {
+            let event_peek = p.peek().unwrap().clone();
+            let event = p.next().unwrap();
+            assert_eq!(event, event_peek);
+            event.0 != Event::StreamEnd
+        } {}
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/src/scanner.rs
@@ -0,0 +1,2003 @@
+use std::collections::VecDeque;
+use std::{char, fmt};
+use std::error::Error;
+
+#[derive(Clone, Copy, PartialEq, Debug, Eq)]
+pub enum TEncoding {
+    Utf8
+}
+
+#[derive(Clone, Copy, PartialEq, Debug, Eq)]
+pub enum TScalarStyle {
+    Any,
+    Plain,
+    SingleQuoted,
+    DoubleQuoted,
+
+    Literal,
+    Foled
+}
+
+#[derive(Clone, Copy, PartialEq, Debug, Eq)]
+pub struct Marker {
+    index: usize,
+    line: usize,
+    col: usize,
+}
+
+impl Marker {
+    fn new(index: usize, line: usize, col: usize) -> Marker {
+        Marker {
+            index: index,
+            line: line,
+            col: col
+        }
+    }
+
+    pub fn index(&self) -> usize {
+        self.index
+    }
+
+    pub fn line(&self) -> usize {
+        self.line
+    }
+
+    pub fn col(&self) -> usize {
+        self.col
+    }
+}
+
+#[derive(Clone, PartialEq, Debug, Eq)]
+pub struct ScanError {
+    mark: Marker,
+    info: String,
+}
+
+impl ScanError {
+    pub fn new(loc: Marker, info: &str) -> ScanError {
+        ScanError {
+            mark: loc,
+            info: info.to_owned()
+        }
+    }
+
+    pub fn marker(&self) -> &Marker {
+        &self.mark
+    }
+}
+
+impl Error for ScanError {
+    fn description(&self) -> &str {
+        self.info.as_ref()
+    }
+
+    fn cause(&self) -> Option<&Error> {
+        None
+    }
+}
+
+impl fmt::Display for ScanError {
+    // col starts from 0
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        write!(formatter, "{} at line {} column {}", self.info,
+               self.mark.line, self.mark.col + 1)
+    }
+}
+
+#[derive(Clone, PartialEq, Debug, Eq)]
+pub enum TokenType {
+    NoToken,
+    StreamStart(TEncoding),
+    StreamEnd,
+    /// major, minor
+    VersionDirective(u32, u32),
+    /// handle, prefix
+    TagDirective(String, String),
+    DocumentStart,
+    DocumentEnd,
+    BlockSequenceStart,
+    BlockMappingStart,
+    BlockEnd,
+    FlowSequenceStart,
+    FlowSequenceEnd,
+    FlowMappingStart,
+    FlowMappingEnd,
+    BlockEntry,
+    FlowEntry,
+    Key,
+    Value,
+    Alias(String),
+    Anchor(String),
+    /// handle, suffix
+    Tag(String, String),
+    Scalar(TScalarStyle, String)
+}
+
+#[derive(Clone, PartialEq, Debug, Eq)]
+pub struct Token(pub Marker, pub TokenType);
+
+#[derive(Clone, PartialEq, Debug, Eq)]
+struct SimpleKey {
+    possible: bool,
+    required: bool,
+    token_number: usize,
+    mark: Marker,
+}
+
+impl SimpleKey {
+    fn new(mark: Marker) -> SimpleKey {
+        SimpleKey {
+            possible: false,
+            required: false,
+            token_number: 0,
+            mark: mark,
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct Scanner<T> {
+    rdr: T,
+    mark: Marker,
+    tokens: VecDeque<Token>,
+    buffer: VecDeque<char>,
+    error: Option<ScanError>,
+
+    stream_start_produced: bool,
+    stream_end_produced: bool,
+    simple_key_allowed: bool,
+    simple_keys: Vec<SimpleKey>,
+    indent: isize,
+    indents: Vec<isize>,
+    flow_level: usize,
+    tokens_parsed: usize,
+    token_available: bool,
+}
+
+impl<T: Iterator<Item=char>> Iterator for Scanner<T> {
+    type Item = Token;
+    fn next(&mut self) -> Option<Token> {
+        if self.error.is_some() {
+            return None;
+        }
+        match self.next_token() {
+            Ok(tok) => tok,
+            Err(e) => {
+                self.error = Some(e);
+                None
+            }
+        }
+    }
+}
+
+#[inline]
+fn is_z(c: char) -> bool {
+    c == '\0'
+}
+#[inline]
+fn is_break(c: char) -> bool {
+    c == '\n' || c == '\r'
+}
+#[inline]
+fn is_breakz(c: char) -> bool {
+    is_break(c) || is_z(c)
+}
+#[inline]
+fn is_blank(c: char) -> bool {
+    c == ' ' || c == '\t'
+}
+#[inline]
+fn is_blankz(c: char) -> bool {
+    is_blank(c) || is_breakz(c)
+}
+#[inline]
+fn is_digit(c: char) -> bool {
+    c >= '0' && c <= '9'
+}
+#[inline]
+fn is_alpha(c: char) -> bool {
+    match c {
+        '0'...'9' | 'a'...'z' | 'A'...'Z' => true,
+        '_' | '-' => true,
+        _ => false
+    }
+}
+#[inline]
+fn is_hex(c: char) -> bool {
+    (c >= '0' && c <= '9')
+        || (c >= 'a' && c <= 'f')
+        || (c >= 'A' && c <= 'F')
+}
+#[inline]
+fn as_hex(c: char) -> u32 {
+    match c {
+        '0'...'9' => (c as u32) - ('0' as u32),
+        'a'...'f' => (c as u32) - ('a' as u32) + 10,
+        'A'...'F' => (c as u32) - ('A' as u32) + 10,
+        _ => unreachable!()
+    }
+}
+
+pub type ScanResult = Result<(), ScanError>;
+
+impl<T: Iterator<Item=char>> Scanner<T> {
+    /// Creates the YAML tokenizer.
+    pub fn new(rdr: T) -> Scanner<T> {
+        Scanner {
+            rdr: rdr,
+            buffer: VecDeque::new(),
+            mark: Marker::new(0, 1, 0),
+            tokens: VecDeque::new(),
+            error: None,
+
+            stream_start_produced: false,
+            stream_end_produced: false,
+            simple_key_allowed: true,
+            simple_keys: Vec::new(),
+            indent: -1,
+            indents: Vec::new(),
+            flow_level: 0,
+            tokens_parsed: 0,
+            token_available: false,
+        }
+    }
+    #[inline]
+    pub fn get_error(&self) -> Option<ScanError> {
+        match self.error {
+            None => None,
+            Some(ref e) => Some(e.clone()),
+        }
+    }
+
+    #[inline]
+    fn lookahead(&mut self, count: usize) {
+        if self.buffer.len() >= count {
+            return;
+        }
+        for _ in 0..(count - self.buffer.len()) {
+            self.buffer.push_back(self.rdr.next().unwrap_or('\0'));
+        }
+    }
+    #[inline]
+    fn skip(&mut self) {
+        let c = self.buffer.pop_front().unwrap();
+
+        self.mark.index += 1;
+        if c == '\n' {
+            self.mark.line += 1;
+            self.mark.col = 0;
+        } else {
+            self.mark.col += 1;
+        }
+    }
+    #[inline]
+    fn skip_line(&mut self) {
+        if self.buffer[0] == '\r' && self.buffer[1] == '\n' {
+            self.skip();
+            self.skip();
+        } else if is_break(self.buffer[0]) {
+            self.skip();
+        }
+    }
+    #[inline]
+    fn ch(&self) -> char {
+        self.buffer[0]
+    }
+    #[inline]
+    fn ch_is(&self, c: char) -> bool {
+        self.buffer[0] == c
+    }
+    #[allow(dead_code)]
+    #[inline]
+    fn eof(&self) -> bool {
+        self.ch_is('\0')
+    }
+    #[inline]
+    pub fn stream_started(&self) -> bool {
+        self.stream_start_produced
+    }
+    #[inline]
+    pub fn stream_ended(&self) -> bool {
+        self.stream_end_produced
+    }
+    #[inline]
+    pub fn mark(&self) -> Marker {
+        self.mark
+    }
+    #[inline]
+    fn read_break(&mut self, s: &mut String) {
+        if self.buffer[0] == '\r' && self.buffer[1] == '\n' {
+            s.push('\n');
+            self.skip();
+            self.skip();
+        } else if self.buffer[0] == '\r' || self.buffer[0] == '\n' {
+            s.push('\n');
+            self.skip();
+        } else {
+            unreachable!();
+        }
+    }
+    fn insert_token(&mut self, pos: usize, tok: Token) {
+        let old_len = self.tokens.len();
+        assert!(pos <= old_len);
+        self.tokens.push_back(tok);
+        for i in 0..old_len - pos {
+            self.tokens.swap(old_len - i, old_len - i - 1);
+        }
+    }
+    fn allow_simple_key(&mut self) {
+            self.simple_key_allowed = true;
+    }
+    fn disallow_simple_key(&mut self) {
+            self.simple_key_allowed = false;
+    }
+
+    pub fn fetch_next_token(&mut self) -> ScanResult {
+        self.lookahead(1);
+        // println!("--> fetch_next_token Cur {:?} {:?}", self.mark, self.ch());
+
+        if !self.stream_start_produced {
+            self.fetch_stream_start();
+            return Ok(());
+        }
+        self.skip_to_next_token();
+
+        try!(self.stale_simple_keys());
+
+        let mark = self.mark;
+        self.unroll_indent(mark.col as isize);
+
+        self.lookahead(4);
+
+        if is_z(self.ch()) {
+            try!(self.fetch_stream_end());
+            return Ok(());
+        }
+
+        // Is it a directive?
+        if self.mark.col == 0 && self.ch_is('%') {
+            return self.fetch_directive();
+        }
+
+        if self.mark.col == 0
+            && self.buffer[0] == '-'
+            && self.buffer[1] == '-'
+            && self.buffer[2] == '-'
+            && is_blankz(self.buffer[3]) {
+            try!(self.fetch_document_indicator(TokenType::DocumentStart));
+            return Ok(());
+        }
+
+        if self.mark.col == 0
+            && self.buffer[0] == '.'
+            && self.buffer[1] == '.'
+            && self.buffer[2] == '.'
+            && is_blankz(self.buffer[3]) {
+            try!(self.fetch_document_indicator(TokenType::DocumentEnd));
+            return Ok(());
+        }
+
+        let c = self.buffer[0];
+        let nc = self.buffer[1];
+        match c {
+            '[' => self.fetch_flow_collection_start(TokenType::FlowSequenceStart),
+            '{' => self.fetch_flow_collection_start(TokenType::FlowMappingStart),
+            ']' => self.fetch_flow_collection_end(TokenType::FlowSequenceEnd),
+            '}' => self.fetch_flow_collection_end(TokenType::FlowMappingEnd),
+            ',' => self.fetch_flow_entry(),
+            '-' if is_blankz(nc) => self.fetch_block_entry(),
+            '?' if self.flow_level > 0 || is_blankz(nc) => self.fetch_key(),
+            ':' if self.flow_level > 0 || is_blankz(nc) => self.fetch_value(),
+            // Is it an alias?
+            '*' => self.fetch_anchor(true),
+            // Is it an anchor?
+            '&' => self.fetch_anchor(false),
+            '!' => self.fetch_tag(),
+            // Is it a literal scalar?
+            '|' if self.flow_level == 0 => self.fetch_block_scalar(true),
+            // Is it a folded scalar?
+            '>' if self.flow_level == 0 => self.fetch_block_scalar(false),
+            '\'' => self.fetch_flow_scalar(true),
+            '"' => self.fetch_flow_scalar(false),
+            // plain scalar
+            '-' if !is_blankz(nc) => self.fetch_plain_scalar(),
+            ':' | '?' if !is_blankz(nc) && self.flow_level == 0 => self.fetch_plain_scalar(),
+            '%' | '@' | '`' => Err(ScanError::new(self.mark,
+                    &format!("unexpected character: `{}'", c))),
+            _ => self.fetch_plain_scalar(),
+        }
+    }
+
+    pub fn next_token(&mut self) -> Result<Option<Token>, ScanError> {
+        if self.stream_end_produced {
+            return Ok(None);
+        }
+
+        if !self.token_available {
+            try!(self.fetch_more_tokens());
+        }
+        let t = self.tokens.pop_front().unwrap();
+        self.token_available = false;
+        self.tokens_parsed += 1;
+
+        if let TokenType::StreamEnd = t.1 {
+            self.stream_end_produced = true;
+        }
+        Ok(Some(t))
+    }
+
+    pub fn fetch_more_tokens(&mut self) -> ScanResult {
+        let mut need_more;
+        loop {
+            need_more = false;
+            if self.tokens.is_empty() {
+                need_more = true;
+            } else {
+                try!(self.stale_simple_keys());
+                for sk in &self.simple_keys {
+                    if sk.possible && sk.token_number == self.tokens_parsed {
+                        need_more = true;
+                        break;
+                    }
+                }
+            }
+
+            if !need_more { break; }
+            try!(self.fetch_next_token());
+        }
+        self.token_available = true;
+
+        Ok(())
+    }
+
+    fn stale_simple_keys(&mut self) -> ScanResult {
+        for sk in &mut self.simple_keys {
+            if sk.possible && (sk.mark.line < self.mark.line
+                || sk.mark.index + 1024 < self.mark.index) {
+                    if sk.required {
+                        return Err(ScanError::new(self.mark, "simple key expect ':'"));
+                    }
+                    sk.possible = false;
+                }
+        }
+        Ok(())
+    }
+
+    fn skip_to_next_token(&mut self) {
+        loop {
+            self.lookahead(1);
+            // TODO(chenyh) BOM
+            match self.ch() {
+                ' ' => self.skip(),
+                '\t' if self.flow_level > 0 || !self.simple_key_allowed => self.skip(),
+                '\n' | '\r' => {
+                    self.lookahead(2);
+                    self.skip_line();
+                    if self.flow_level == 0 {
+                        self.allow_simple_key();
+                    }
+                },
+                '#' => while !is_breakz(self.ch()) { self.skip(); self.lookahead(1); },
+                _ => break
+            }
+        }
+    }
+
+    fn fetch_stream_start(&mut self) {
+        let mark = self.mark;
+        self.indent = -1;
+        self.stream_start_produced = true;
+        self.allow_simple_key();
+        self.tokens.push_back(Token(mark, TokenType::StreamStart(TEncoding::Utf8)));
+        self.simple_keys.push(SimpleKey::new(Marker::new(0,0,0)));
+    }
+
+    fn fetch_stream_end(&mut self) -> ScanResult {
+        // force new line
+        if self.mark.col != 0 {
+            self.mark.col = 0;
+            self.mark.line += 1;
+        }
+
+        self.unroll_indent(-1);
+        try!(self.remove_simple_key());
+        self.disallow_simple_key();
+
+        self.tokens.push_back(Token(self.mark, TokenType::StreamEnd));
+        Ok(())
+    }
+
+    fn fetch_directive(&mut self) -> ScanResult {
+        self.unroll_indent(-1);
+        try!(self.remove_simple_key());
+
+        self.disallow_simple_key();
+
+        let tok = try!(self.scan_directive());
+
+        self.tokens.push_back(tok);
+
+        Ok(())
+    }
+
+    fn scan_directive(&mut self) -> Result<Token, ScanError> {
+        let start_mark = self.mark;
+        self.skip();
+
+        let name = try!(self.scan_directive_name());
+        let tok = match name.as_ref() {
+            "YAML" => {
+                try!(self.scan_version_directive_value(&start_mark))
+            },
+            "TAG" => {
+                try!(self.scan_tag_directive_value(&start_mark))
+            },
+            // XXX This should be a warning instead of an error
+            _ => {
+                // skip current line
+                self.lookahead(1);
+                while !is_breakz(self.ch()) {
+                    self.skip();
+                    self.lookahead(1);
+                }
+                // XXX return an empty TagDirective token
+                Token(start_mark, TokenType::TagDirective(String::new(), String::new()))
+                // return Err(ScanError::new(start_mark,
+                //     "while scanning a directive, found unknown directive name"))
+            }
+        };
+        self.lookahead(1);
+
+        while is_blank(self.ch()) {
+            self.skip();
+            self.lookahead(1);
+        }
+
+        if self.ch() == '#' {
+            while !is_breakz(self.ch()) {
+                self.skip();
+                self.lookahead(1);
+            }
+        }
+
+        if !is_breakz(self.ch()) {
+            return Err(ScanError::new(start_mark,
+                "while scanning a directive, did not find expected comment or line break"));
+        }
+
+        // Eat a line break
+        if is_break(self.ch()) {
+            self.lookahead(2);
+            self.skip_line();
+        }
+
+        Ok(tok)
+    }
+
+    fn scan_version_directive_value(&mut self, mark: &Marker) -> Result<Token, ScanError> {
+        self.lookahead(1);
+
+        while is_blank(self.ch()) {
+            self.skip();
+            self.lookahead(1);
+        }
+
+        let major = try!(self.scan_version_directive_number(mark));
+
+        if self.ch() != '.' {
+            return Err(ScanError::new(*mark,
+                "while scanning a YAML directive, did not find expected digit or '.' character"));
+        }
+
+        self.skip();
+
+        let minor = try!(self.scan_version_directive_number(mark));
+
+        Ok(Token(*mark, TokenType::VersionDirective(major, minor)))
+    }
+
+    fn scan_directive_name(&mut self) -> Result<String, ScanError> {
+        let start_mark = self.mark;
+        let mut string = String::new();
+        self.lookahead(1);
+        while is_alpha(self.ch()) {
+            string.push(self.ch());
+            self.skip();
+            self.lookahead(1);
+        }
+
+        if string.is_empty() {
+            return Err(ScanError::new(start_mark,
+                    "while scanning a directive, could not find expected directive name"));
+        }
+
+        if !is_blankz(self.ch()) {
+            return Err(ScanError::new(start_mark,
+                    "while scanning a directive, found unexpected non-alphabetical character"));
+        }
+
+        Ok(string)
+    }
+
+    fn scan_version_directive_number(&mut self, mark: &Marker) -> Result<u32, ScanError> {
+        let mut val = 0u32;
+        let mut length = 0usize;
+        self.lookahead(1);
+        while is_digit(self.ch()) {
+            if length + 1 > 9 {
+                return Err(ScanError::new(*mark,
+                    "while scanning a YAML directive, found extremely long version number"));
+            }
+            length += 1;
+            val = val * 10 + ((self.ch() as u32) - ('0' as u32));
+            self.skip();
+            self.lookahead(1);
+        }
+
+        if length == 0 {
+                return Err(ScanError::new(*mark,
+                    "while scanning a YAML directive, did not find expected version number"));
+        }
+
+        Ok(val)
+    }
+
+    fn scan_tag_directive_value(&mut self, mark: &Marker) -> Result<Token, ScanError> {
+        self.lookahead(1);
+        /* Eat whitespaces. */
+        while is_blank(self.ch()) {
+            self.skip();
+            self.lookahead(1);
+        }
+        let handle = try!(self.scan_tag_handle(true, mark));
+
+        self.lookahead(1);
+        /* Eat whitespaces. */
+        while is_blank(self.ch()) {
+            self.skip();
+            self.lookahead(1);
+        }
+
+        let is_secondary = handle == "!!";
+        let prefix = try!(self.scan_tag_uri(true, is_secondary, &String::new(), mark));
+
+        self.lookahead(1);
+
+        if is_blankz(self.ch()) {
+            Ok(Token(*mark, TokenType::TagDirective(handle, prefix)))
+        } else {
+            Err(ScanError::new(*mark,
+                "while scanning TAG, did not find expected whitespace or line break"))
+        }
+    }
+
+    fn fetch_tag(&mut self) -> ScanResult {
+        try!(self.save_simple_key());
+        self.disallow_simple_key();
+
+        let tok = try!(self.scan_tag());
+        self.tokens.push_back(tok);
+        Ok(())
+    }
+
+    fn scan_tag(&mut self) -> Result<Token, ScanError> {
+        let start_mark = self.mark;
+        let mut handle = String::new();
+        let mut suffix;
+        let mut secondary = false;
+
+        // Check if the tag is in the canonical form (verbatim).
+        self.lookahead(2);
+
+        if self.buffer[1] == '<' {
+            // Eat '!<'
+            self.skip();
+            self.skip();
+            suffix = try!(self.scan_tag_uri(false, false, &String::new(), &start_mark));
+
+            if self.ch() != '>' {
+                return Err(ScanError::new(start_mark,
+                    "while scanning a tag, did not find the expected '>'"));
+            }
+
+            self.skip();
+        } else {
+            // The tag has either the '!suffix' or the '!handle!suffix'
+            handle = try!(self.scan_tag_handle(false, &start_mark));
+            // Check if it is, indeed, handle.
+            if handle.len() >= 2 && handle.starts_with('!') && handle.ends_with('!') {
+                if handle == "!!" {
+                    secondary = true;
+                }
+                suffix = try!(self.scan_tag_uri(false, secondary, &String::new(), &start_mark));
+            } else {
+                suffix = try!(self.scan_tag_uri(false, false, &handle, &start_mark));
+                handle = "!".to_owned();
+                // A special case: the '!' tag.  Set the handle to '' and the
+                // suffix to '!'.
+                if suffix.is_empty() {
+                    handle.clear();
+                    suffix = "!".to_owned();
+                }
+            }
+        }
+
+        self.lookahead(1);
+        if is_blankz(self.ch()) {
+            // XXX: ex 7.2, an empty scalar can follow a secondary tag
+            Ok(Token(start_mark, TokenType::Tag(handle, suffix)))
+        } else {
+            Err(ScanError::new(start_mark,
+                "while scanning a tag, did not find expected whitespace or line break"))
+        }
+    }
+
+    fn scan_tag_handle(&mut self, directive: bool, mark: &Marker) -> Result<String, ScanError> {
+        let mut string = String::new();
+        self.lookahead(1);
+        if self.ch() != '!' {
+            return Err(ScanError::new(*mark,
+                "while scanning a tag, did not find expected '!'"));
+        }
+
+        string.push(self.ch());
+        self.skip();
+
+        self.lookahead(1);
+        while is_alpha(self.ch()) {
+            string.push(self.ch());
+            self.skip();
+            self.lookahead(1);
+        }
+
+        // Check if the trailing character is '!' and copy it.
+        if self.ch() == '!' {
+            string.push(self.ch());
+            self.skip();
+        } else if directive && string != "!" {
+            // It's either the '!' tag or not really a tag handle.  If it's a %TAG
+            // directive, it's an error.  If it's a tag token, it must be a part of
+            // URI.
+            return Err(ScanError::new(*mark,
+                "while parsing a tag directive, did not find expected '!'"));
+        }
+        Ok(string)
+    }
+
+    fn scan_tag_uri(&mut self, directive: bool, _is_secondary: bool,
+                head: &str, mark: &Marker) -> Result<String, ScanError> {
+        let mut length = head.len();
+        let mut string = String::new();
+
+        // Copy the head if needed.
+        // Note that we don't copy the leading '!' character.
+        if length > 1 {
+            string.extend(head.chars().skip(1));
+        }
+
+        self.lookahead(1);
+        /*
+         * The set of characters that may appear in URI is as follows:
+         *
+         *      '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+         *      '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+         *      '%'.
+         */
+        while match self.ch() {
+            ';' | '/' | '?' | ':' | '@' | '&' => true,
+            '=' | '+' | '$' | ',' | '.' | '!' | '~' | '*' | '\'' | '(' | ')' | '[' | ']' => true,
+            '%' => true,
+            c if is_alpha(c) => true,
+            _ => false
+        } {
+            // Check if it is a URI-escape sequence.
+            if self.ch() == '%' {
+                string.push(try!(self.scan_uri_escapes(directive, mark)));
+            } else {
+                string.push(self.ch());
+                self.skip();
+            }
+
+            length += 1;
+            self.lookahead(1);
+        }
+
+        if length == 0 {
+            return Err(ScanError::new(*mark,
+                "while parsing a tag, did not find expected tag URI"));
+        }
+
+        Ok(string)
+    }
+
+    fn scan_uri_escapes(&mut self, _directive: bool, mark: &Marker)
+        -> Result<char, ScanError> {
+        let mut width = 0usize;
+        let mut code = 0u32;
+        loop {
+            self.lookahead(3);
+
+            if !(self.ch() == '%'
+                 && is_hex(self.buffer[1])
+                 && is_hex(self.buffer[2])) {
+                return Err(ScanError::new(*mark,
+                    "while parsing a tag, did not find URI escaped octet"));
+            }
+
+            let octet = (as_hex(self.buffer[1]) << 4) + as_hex(self.buffer[2]);
+            if width == 0 {
+                width = match octet {
+                    _ if octet & 0x80 == 0x00 => 1,
+                    _ if octet & 0xE0 == 0xC0 => 2,
+                    _ if octet & 0xF0 == 0xE0 => 3,
+                    _ if octet & 0xF8 == 0xF0 => 4,
+                    _ => {
+                        return Err(ScanError::new(*mark,
+                            "while parsing a tag, found an incorrect leading UTF-8 octet"));
+                    }
+                };
+                code = octet;
+            } else {
+                if octet & 0xc0 != 0x80 {
+                        return Err(ScanError::new(*mark,
+                            "while parsing a tag, found an incorrect trailing UTF-8 octet"));
+                }
+                code = (code << 8) + octet;
+            }
+
+            self.skip();
+            self.skip();
+            self.skip();
+
+            width -= 1;
+            if width == 0 {
+                break;
+            }
+        }
+
+        match char::from_u32(code) {
+            Some(ch) => Ok(ch),
+            None => Err(ScanError::new(*mark,
+                "while parsing a tag, found an invalid UTF-8 codepoint"))
+        }
+    }
+
+    fn fetch_anchor(&mut self, alias: bool) -> ScanResult {
+        try!(self.save_simple_key());
+        self.disallow_simple_key();
+
+        let tok = try!(self.scan_anchor(alias));
+
+        self.tokens.push_back(tok);
+
+        Ok(())
+    }
+
+    fn scan_anchor(&mut self, alias: bool)
+        -> Result<Token, ScanError> {
+        let mut string = String::new();
+        let start_mark = self.mark;
+
+        self.skip();
+        self.lookahead(1);
+        while is_alpha(self.ch()) {
+            string.push(self.ch());
+            self.skip();
+            self.lookahead(1);
+        }
+
+        if string.is_empty()
+            || match self.ch() {
+                c if is_blankz(c) => false,
+                '?' | ':' | ',' | ']' | '}' | '%' | '@' | '`' => false,
+                _ => true
+            } {
+            return Err(ScanError::new(start_mark, "while scanning an anchor or alias, did not find expected alphabetic or numeric character"));
+        }
+
+        if alias {
+            Ok(Token(start_mark, TokenType::Alias(string)))
+        } else {
+            Ok(Token(start_mark, TokenType::Anchor(string)))
+        }
+    }
+
+    fn fetch_flow_collection_start(&mut self, tok :TokenType) -> ScanResult {
+        // The indicators '[' and '{' may start a simple key.
+        try!(self.save_simple_key());
+
+        self.increase_flow_level();
+
+        self.allow_simple_key();
+
+        let start_mark = self.mark;
+        self.skip();
+
+        self.tokens.push_back(Token(start_mark, tok));
+        Ok(())
+    }
+
+    fn fetch_flow_collection_end(&mut self, tok :TokenType) -> ScanResult {
+        try!(self.remove_simple_key());
+        self.decrease_flow_level();
+
+        self.disallow_simple_key();
+
+        let start_mark = self.mark;
+        self.skip();
+
+        self.tokens.push_back(Token(start_mark, tok));
+        Ok(())
+    }
+
+    fn fetch_flow_entry(&mut self) -> ScanResult {
+        try!(self.remove_simple_key());
+        self.allow_simple_key();
+
+        let start_mark = self.mark;
+        self.skip();
+
+        self.tokens.push_back(Token(start_mark, TokenType::FlowEntry));
+        Ok(())
+    }
+
+    fn increase_flow_level(&mut self) {
+        self.simple_keys.push(SimpleKey::new(Marker::new(0,0,0)));
+        self.flow_level += 1;
+    }
+    fn decrease_flow_level(&mut self) {
+        if self.flow_level > 0 {
+            self.flow_level -= 1;
+            self.simple_keys.pop().unwrap();
+        }
+    }
+
+    fn fetch_block_entry(&mut self) -> ScanResult {
+        if self.flow_level == 0 {
+            // Check if we are allowed to start a new entry.
+            if !self.simple_key_allowed {
+                return Err(ScanError::new(self.mark,
+                        "block sequence entries are not allowed in this context"));
+            }
+
+            let mark = self.mark;
+            // generate BLOCK-SEQUENCE-START if indented
+            self.roll_indent(mark.col, None, TokenType::BlockSequenceStart, mark);
+        } else {
+            // - * only allowed in block
+            return Err(ScanError::new(self.mark, r#""-" is only valid inside a block"#))
+        }
+        try!(self.remove_simple_key());
+        self.allow_simple_key();
+
+        let start_mark = self.mark;
+        self.skip();
+
+        self.tokens.push_back(Token(start_mark, TokenType::BlockEntry));
+        Ok(())
+    }
+
+    fn fetch_document_indicator(&mut self, t: TokenType) -> ScanResult {
+        self.unroll_indent(-1);
+        try!(self.remove_simple_key());
+        self.disallow_simple_key();
+
+        let mark = self.mark;
+
+        self.skip();
+        self.skip();
+        self.skip();
+
+        self.tokens.push_back(Token(mark, t));
+        Ok(())
+    }
+
+    fn fetch_block_scalar(&mut self, literal: bool) -> ScanResult {
+        try!(self.save_simple_key());
+        self.allow_simple_key();
+        let tok = try!(self.scan_block_scalar(literal));
+
+        self.tokens.push_back(tok);
+        Ok(())
+    }
+
+    fn scan_block_scalar(&mut self, literal: bool) -> Result<Token, ScanError> {
+        let start_mark = self.mark;
+        let mut chomping: i32 = 0;
+        let mut increment: usize = 0;
+        let mut indent: usize = 0;
+        let mut trailing_blank: bool;
+        let mut leading_blank: bool = false;
+
+        let mut string = String::new();
+        let mut leading_break = String::new();
+        let mut trailing_breaks = String::new();
+
+        // skip '|' or '>'
+        self.skip();
+        self.lookahead(1);
+
+        if self.ch() == '+' || self.ch() == '-' {
+            if self.ch() == '+' {
+                chomping = 1;
+            } else {
+                chomping = -1;
+            }
+            self.skip();
+            self.lookahead(1);
+            if is_digit(self.ch()) {
+                if self.ch() == '0' {
+                    return Err(ScanError::new(start_mark,
+                            "while scanning a block scalar, found an intendation indicator equal to 0"));
+                }
+                increment = (self.ch() as usize) - ('0' as usize);
+                self.skip();
+            }
+        } else if is_digit(self.ch()) {
+            if self.ch() == '0' {
+                return Err(ScanError::new(start_mark,
+                         "while scanning a block scalar, found an intendation indicator equal to 0"));
+            }
+
+            increment = (self.ch() as usize) - ('0' as usize);
+            self.skip();
+            self.lookahead(1);
+            if self.ch() == '+' || self.ch() == '-' {
+                if self.ch() == '+' {
+                    chomping = 1;
+                } else {
+                    chomping = -1;
+                }
+                self.skip();
+            }
+        }
+
+        // Eat whitespaces and comments to the end of the line.
+        self.lookahead(1);
+
+        while is_blank(self.ch()) {
+            self.skip();
+            self.lookahead(1);
+        }
+
+        if self.ch() == '#' {
+            while !is_breakz(self.ch()) {
+                self.skip();
+                self.lookahead(1);
+            }
+        }
+
+        // Check if we are at the end of the line.
+        if !is_breakz(self.ch()) {
+            return Err(ScanError::new(start_mark,
+                    "while scanning a block scalar, did not find expected comment or line break"));
+        }
+
+        if is_break(self.ch()) {
+            self.lookahead(2);
+            self.skip_line();
+        }
+
+        if increment > 0 {
+            indent = if self.indent >= 0 { (self.indent + increment as isize) as usize } else { increment }
+        }
+        // Scan the leading line breaks and determine the indentation level if needed.
+        try!(self.block_scalar_breaks(&mut indent, &mut trailing_breaks));
+
+        self.lookahead(1);
+
+        let start_mark = self.mark;
+
+        while self.mark.col == indent && !is_z(self.ch()) {
+            // We are at the beginning of a non-empty line.
+            trailing_blank = is_blank(self.ch());
+            if !literal && !leading_break.is_empty()
+                && !leading_blank && !trailing_blank {
+                    if trailing_breaks.is_empty() {
+                        string.push(' ');
+                    }
+                    leading_break.clear();
+            } else {
+                string.push_str(&leading_break);
+                leading_break.clear();
+            }
+
+            string.push_str(&trailing_breaks);
+            trailing_breaks.clear();
+
+            leading_blank = is_blank(self.ch());
+
+            while !is_breakz(self.ch()) {
+                string.push(self.ch());
+                self.skip();
+                self.lookahead(1);
+            }
+            // break on EOF
+            if is_z(self.ch()) { break; }
+
+            self.lookahead(2);
+            self.read_break(&mut leading_break);
+
+            // Eat the following intendation spaces and line breaks.
+            try!(self.block_scalar_breaks(&mut indent, &mut trailing_breaks));
+        }
+
+        // Chomp the tail.
+        if chomping != -1 {
+            string.push_str(&leading_break);
+        }
+
+        if chomping == 1 {
+            string.push_str(&trailing_breaks);
+        }
+
+        if literal {
+            Ok(Token(start_mark, TokenType::Scalar(TScalarStyle::Literal, string)))
+        } else {
+            Ok(Token(start_mark, TokenType::Scalar(TScalarStyle::Foled, string)))
+        }
+    }
+
+    fn block_scalar_breaks(&mut self, indent: &mut usize, breaks: &mut String) -> ScanResult {
+        let mut max_indent = 0;
+        loop {
+            self.lookahead(1);
+            while (*indent == 0 || self.mark.col < *indent)
+                && self.buffer[0] == ' ' {
+                    self.skip();
+                    self.lookahead(1);
+            }
+
+            if self.mark.col > max_indent {
+                max_indent = self.mark.col;
+            }
+
+            // Check for a tab character messing the intendation.
+            if (*indent == 0 || self.mark.col < *indent)
+                && self.buffer[0] == '\t' {
+                return Err(ScanError::new(self.mark,
+                        "while scanning a block scalar, found a tab character where an intendation space is expected"));
+            }
+
+            if !is_break(self.ch()) {
+                break;
+            }
+
+            self.lookahead(2);
+            // Consume the line break.
+            self.read_break(breaks);
+        }
+
+        if *indent == 0 {
+            *indent = max_indent;
+            if *indent < (self.indent + 1) as usize {
+                *indent = (self.indent + 1) as usize;
+            }
+            if *indent < 1 {
+                *indent = 1;
+            }
+        }
+        Ok(())
+    }
+
+    fn fetch_flow_scalar(&mut self, single: bool) -> ScanResult {
+        try!(self.save_simple_key());
+        self.disallow_simple_key();
+
+        let tok = try!(self.scan_flow_scalar(single));
+
+        self.tokens.push_back(tok);
+        Ok(())
+    }
+
+    fn scan_flow_scalar(&mut self, single: bool) -> Result<Token, ScanError> {
+        let start_mark = self.mark;
+
+        let mut string = String::new();
+        let mut leading_break = String::new();
+        let mut trailing_breaks = String::new();
+        let mut whitespaces = String::new();
+        let mut leading_blanks;
+
+        /* Eat the left quote. */
+        self.skip();
+
+        loop {
+            /* Check for a document indicator. */
+            self.lookahead(4);
+
+            if self.mark.col == 0 &&
+                (((self.buffer[0] == '-') &&
+                (self.buffer[1] == '-') &&
+                (self.buffer[2] == '-')) ||
+                ((self.buffer[0] == '.') &&
+                (self.buffer[1] == '.') &&
+                (self.buffer[2] == '.'))) &&
+                is_blankz(self.buffer[3]) {
+                    return Err(ScanError::new(start_mark,
+                        "while scanning a quoted scalar, found unexpected document indicator"));
+                }
+
+            if is_z(self.ch()) {
+                    return Err(ScanError::new(start_mark,
+                        "while scanning a quoted scalar, found unexpected end of stream"));
+            }
+
+            self.lookahead(2);
+
+            leading_blanks = false;
+            // Consume non-blank characters.
+
+            while !is_blankz(self.ch()) {
+                match self.ch() {
+                    // Check for an escaped single quote.
+                    '\'' if self.buffer[1] == '\'' && single => {
+                        string.push('\'');
+                        self.skip();
+                        self.skip();
+                    },
+                    // Check for the right quote.
+                    '\'' if single => { break; },
+                    '"' if !single => { break; },
+                    // Check for an escaped line break.
+                    '\\' if !single && is_break(self.buffer[1]) => {
+                        self.lookahead(3);
+                        self.skip();
+                        self.skip_line();
+                        leading_blanks = true;
+                        break;
+                    }
+                    // Check for an escape sequence.
+                    '\\' if !single => {
+                        let mut code_length = 0usize;
+                        match self.buffer[1] {
+                            '0' => string.push('\0'),
+                            'a' => string.push('\x07'),
+                            'b' => string.push('\x08'),
+                            't' | '\t' => string.push('\t'),
+                            'n' => string.push('\n'),
+                            'v' => string.push('\x0b'),
+                            'f' => string.push('\x0c'),
+                            'r' => string.push('\x0d'),
+                            'e' => string.push('\x1b'),
+                            ' ' => string.push('\x20'),
+                            '"' => string.push('"'),
+                            '\'' => string.push('\''),
+                            '\\' => string.push('\\'),
+                            // NEL (#x85)
+                            'N' => string.push(char::from_u32(0x85).unwrap()),
+                            // #xA0
+                            '_' => string.push(char::from_u32(0xA0).unwrap()),
+                            // LS (#x2028)
+                            'L' => string.push(char::from_u32(0x2028).unwrap()),
+                            // PS (#x2029)
+                            'P' => string.push(char::from_u32(0x2029).unwrap()),
+                            'x' => code_length = 2,
+                            'u' => code_length = 4,
+                            'U' => code_length = 8,
+                            _ => return Err(ScanError::new(start_mark,
+                                    "while parsing a quoted scalar, found unknown escape character"))
+                        }
+                        self.skip();
+                        self.skip();
+                        // Consume an arbitrary escape code.
+                        if code_length > 0 {
+                            self.lookahead(code_length);
+                            let mut value = 0u32;
+                            for i in 0..code_length {
+                                if !is_hex(self.buffer[i]) {
+                                    return Err(ScanError::new(start_mark,
+                                        "while parsing a quoted scalar, did not find expected hexdecimal number"));
+                                }
+                                value = (value << 4) + as_hex(self.buffer[i]);
+                            }
+
+                            let ch = match char::from_u32(value) {
+                                Some(v) => v,
+                                None => {
+                                    return Err(ScanError::new(start_mark,
+                                        "while parsing a quoted scalar, found invalid Unicode character escape code"));
+                                }
+                            };
+                            string.push(ch);
+
+                            for _ in 0..code_length {
+                                self.skip();
+                            }
+                        }
+                    },
+                    c => { string.push(c); self.skip(); }
+                }
+                self.lookahead(2);
+            }
+            self.lookahead(1);
+            match self.ch() {
+                '\'' if single => { break; },
+                '"' if !single => { break; },
+                _ => {}
+            }
+
+            // Consume blank characters.
+            while is_blank(self.ch()) || is_break(self.ch()) {
+                if is_blank(self.ch()) {
+                    // Consume a space or a tab character.
+                    if leading_blanks {
+                        self.skip();
+                    } else {
+                        whitespaces.push(self.ch());
+                        self.skip();
+                    }
+                } else {
+                    self.lookahead(2);
+                    // Check if it is a first line break.
+                    if leading_blanks {
+                        self.read_break(&mut trailing_breaks);
+                    } else {
+                        whitespaces.clear();
+                        self.read_break(&mut leading_break);
+                        leading_blanks = true;
+                    }
+                }
+                self.lookahead(1);
+            }
+            // Join the whitespaces or fold line breaks.
+            if leading_blanks {
+                if leading_break.is_empty() {
+                    string.push_str(&leading_break);
+                    string.push_str(&trailing_breaks);
+                    trailing_breaks.clear();
+                    leading_break.clear();
+                } else {
+                    if trailing_breaks.is_empty() {
+                        string.push(' ');
+                    } else {
+                        string.push_str(&trailing_breaks);
+                        trailing_breaks.clear();
+                    }
+                    leading_break.clear();
+                }
+            } else {
+                string.push_str(&whitespaces);
+                whitespaces.clear();
+            }
+        } // loop
+
+        // Eat the right quote.
+        self.skip();
+
+        if single {
+            Ok(Token(start_mark, TokenType::Scalar(TScalarStyle::SingleQuoted, string)))
+        } else {
+            Ok(Token(start_mark, TokenType::Scalar(TScalarStyle::DoubleQuoted, string)))
+        }
+    }
+
+    fn fetch_plain_scalar(&mut self) -> ScanResult {
+        try!(self.save_simple_key());
+        self.disallow_simple_key();
+
+        let tok = try!(self.scan_plain_scalar());
+
+        self.tokens.push_back(tok);
+        Ok(())
+    }
+
+    fn scan_plain_scalar(&mut self) -> Result<Token, ScanError> {
+        let indent = self.indent + 1;
+        let start_mark = self.mark;
+
+        let mut string = String::new();
+        let mut leading_break = String::new();
+        let mut trailing_breaks = String::new();
+        let mut whitespaces = String::new();
+        let mut leading_blanks = false;
+
+        loop {
+            /* Check for a document indicator. */
+            self.lookahead(4);
+
+            if self.mark.col == 0 &&
+                (((self.buffer[0] == '-') &&
+                 (self.buffer[1] == '-') &&
+                 (self.buffer[2] == '-')) ||
+                    ((self.buffer[0] == '.') &&
+                     (self.buffer[1] == '.') &&
+                     (self.buffer[2] == '.'))) &&
+                    is_blankz(self.buffer[3]) {
+                        break;
+                    }
+
+            if self.ch() == '#' { break; }
+            while !is_blankz(self.ch()) {
+                if self.flow_level > 0 && self.ch() == ':'
+                    && is_blankz(self.ch()) {
+                        return Err(ScanError::new(start_mark,
+                                                  "while scanning a plain scalar, found unexpected ':'"));
+                    }
+                // indicators ends a plain scalar
+                match self.ch() {
+                    ':' if is_blankz(self.buffer[1]) => break,
+                    ',' | ':' | '?' | '[' | ']' |'{' |'}' if self.flow_level > 0 => break,
+                    _ => {}
+                }
+
+                if leading_blanks || !whitespaces.is_empty() {
+                    if leading_blanks {
+                        if leading_break.is_empty() {
+                            string.push_str(&leading_break);
+                            string.push_str(&trailing_breaks);
+                            trailing_breaks.clear();
+                            leading_break.clear();
+                        } else {
+                            if trailing_breaks.is_empty() {
+                                string.push(' ');
+                            } else {
+                                string.push_str(&trailing_breaks);
+                                trailing_breaks.clear();
+                            }
+                            leading_break.clear();
+
+                        }
+                        leading_blanks = false;
+                    } else {
+                        string.push_str(&whitespaces);
+                        whitespaces.clear();
+                    }
+                }
+
+                string.push(self.ch());
+                self.skip();
+                self.lookahead(2);
+            }
+            // is the end?
+            if !(is_blank(self.ch()) || is_break(self.ch())) { break; }
+            self.lookahead(1);
+
+            while is_blank(self.ch()) || is_break(self.ch()) {
+                if is_blank(self.ch()) {
+                    if leading_blanks && (self.mark.col as isize) < indent
+                        && self.ch() == '\t' {
+                            return Err(ScanError::new(start_mark,
+                                "while scanning a plain scalar, found a tab"));
+                    }
+
+                    if leading_blanks {
+                        self.skip();
+                    } else {
+                        whitespaces.push(self.ch());
+                        self.skip();
+                    }
+                } else {
+                    self.lookahead(2);
+                    // Check if it is a first line break
+                    if leading_blanks {
+                        self.read_break(&mut trailing_breaks);
+                    } else {
+                        whitespaces.clear();
+                        self.read_break(&mut leading_break);
+                        leading_blanks = true;
+                    }
+                }
+                self.lookahead(1);
+            }
+
+            // check intendation level
+            if self.flow_level == 0 && (self.mark.col as isize) < indent {
+                break;
+            }
+        }
+
+        if leading_blanks {
+            self.allow_simple_key();
+        }
+
+        Ok(Token(start_mark, TokenType::Scalar(TScalarStyle::Plain, string)))
+    }
+
+    fn fetch_key(&mut self) -> ScanResult {
+        let start_mark = self.mark;
+        if self.flow_level == 0 {
+            // Check if we are allowed to start a new key (not nessesary simple).
+            if !self.simple_key_allowed {
+                return Err(ScanError::new(self.mark, "mapping keys are not allowed in this context"));
+            }
+            self.roll_indent(start_mark.col, None,
+                TokenType::BlockMappingStart, start_mark);
+        }
+
+        try!(self.remove_simple_key());
+
+        if self.flow_level == 0 {
+            self.allow_simple_key();
+        } else {
+            self.disallow_simple_key();
+        }
+
+        self.skip();
+        self.tokens.push_back(Token(start_mark, TokenType::Key));
+        Ok(())
+    }
+
+    fn fetch_value(&mut self) -> ScanResult {
+        let sk = self.simple_keys.last().unwrap().clone();
+        let start_mark = self.mark;
+        if sk.possible {
+            // insert simple key
+            let tok = Token(sk.mark, TokenType::Key);
+            let tokens_parsed = self.tokens_parsed;
+            self.insert_token(sk.token_number - tokens_parsed, tok);
+
+            // Add the BLOCK-MAPPING-START token if needed.
+            self.roll_indent(sk.mark.col, Some(sk.token_number),
+                TokenType::BlockMappingStart, start_mark);
+
+            self.simple_keys.last_mut().unwrap().possible = false;
+            self.disallow_simple_key();
+        } else {
+            // The ':' indicator follows a complex key.
+            if self.flow_level == 0 {
+                if !self.simple_key_allowed {
+                    return Err(ScanError::new(start_mark,
+                        "mapping values are not allowed in this context"));
+                }
+
+                self.roll_indent(start_mark.col, None,
+                    TokenType::BlockMappingStart, start_mark);
+            }
+
+            if self.flow_level == 0 {
+                self.allow_simple_key();
+            } else {
+                self.disallow_simple_key();
+            }
+        }
+        self.skip();
+        self.tokens.push_back(Token(start_mark, TokenType::Value));
+
+        Ok(())
+    }
+
+    fn roll_indent(&mut self, col: usize, number: Option<usize>,
+                   tok: TokenType, mark: Marker) {
+        if self.flow_level > 0 {
+            return;
+        }
+
+        if self.indent < col as isize {
+            self.indents.push(self.indent);
+            self.indent = col as isize;
+            let tokens_parsed = self.tokens_parsed;
+            match number {
+                Some(n) => self.insert_token(n - tokens_parsed, Token(mark, tok)),
+                None => self.tokens.push_back(Token(mark, tok))
+            }
+        }
+    }
+
+    fn unroll_indent(&mut self, col: isize) {
+        if self.flow_level > 0 {
+            return;
+        }
+        while self.indent > col {
+            self.tokens.push_back(Token(self.mark, TokenType::BlockEnd));
+            self.indent = self.indents.pop().unwrap();
+        }
+    }
+
+    fn save_simple_key(&mut self) -> Result<(), ScanError> {
+        let required = self.flow_level > 0 && self.indent == (self.mark.col as isize);
+        if self.simple_key_allowed {
+            let mut sk = SimpleKey::new(self.mark);
+            sk.possible = true;
+            sk.required = required;
+            sk.token_number = self.tokens_parsed + self.tokens.len();
+
+            try!(self.remove_simple_key());
+
+            self.simple_keys.pop();
+            self.simple_keys.push(sk);
+        }
+        Ok(())
+    }
+
+    fn remove_simple_key(&mut self) -> ScanResult {
+        let last = self.simple_keys.last_mut().unwrap();
+        if last.possible && last.required {
+            return Err(ScanError::new(self.mark, "simple key expected"));
+        }
+
+        last.possible = false;
+        Ok(())
+    }
+
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use super::TokenType::*;
+
+macro_rules! next {
+    ($p:ident, $tk:pat) => {{
+        let tok = $p.next().unwrap();
+        match tok.1 {
+            $tk => {},
+            _ => { panic!("unexpected token: {:?}",
+                    tok) }
+        }
+    }}
+}
+
+macro_rules! next_scalar {
+    ($p:ident, $tk:expr, $v:expr) => {{
+        let tok = $p.next().unwrap();
+        match tok.1 {
+            Scalar(style, ref v) => {
+                assert_eq!(style, $tk);
+                assert_eq!(v, $v);
+            },
+            _ => { panic!("unexpected token: {:?}",
+                    tok) }
+        }
+    }}
+}
+
+macro_rules! end {
+    ($p:ident) => {{
+        assert_eq!($p.next(), None);
+    }}
+}
+    /// test cases in libyaml scanner.c
+    #[test]
+    fn test_empty() {
+        let s = "";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_scalar() {
+        let s = "a scalar";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_explicit_scalar() {
+        let s =
+"---
+'a scalar'
+...
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, DocumentStart);
+        next!(p, Scalar(TScalarStyle::SingleQuoted, _));
+        next!(p, DocumentEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_multiple_documents() {
+        let s =
+"
+'a scalar'
+---
+'a scalar'
+---
+'a scalar'
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, Scalar(TScalarStyle::SingleQuoted, _));
+        next!(p, DocumentStart);
+        next!(p, Scalar(TScalarStyle::SingleQuoted, _));
+        next!(p, DocumentStart);
+        next!(p, Scalar(TScalarStyle::SingleQuoted, _));
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_a_flow_sequence() {
+        let s = "[item 1, item 2, item 3]";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, FlowSequenceStart);
+        next_scalar!(p, TScalarStyle::Plain, "item 1");
+        next!(p, FlowEntry);
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, FlowEntry);
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, FlowSequenceEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_a_flow_mapping() {
+        let s =
+"
+{
+    a simple key: a value, # Note that the KEY token is produced.
+    ? a complex key: another value,
+}
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, FlowMappingStart);
+        next!(p, Key);
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, Value);
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, FlowEntry);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "a complex key");
+        next!(p, Value);
+        next!(p, Scalar(TScalarStyle::Plain, _));
+        next!(p, FlowEntry);
+        next!(p, FlowMappingEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_block_sequences() {
+        let s =
+"
+- item 1
+- item 2
+-
+  - item 3.1
+  - item 3.2
+-
+  key 1: value 1
+  key 2: value 2
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 2");
+        next!(p, BlockEntry);
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 3.1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 3.2");
+        next!(p, BlockEnd);
+        next!(p, BlockEntry);
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 1");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 1");
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 2");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 2");
+        next!(p, BlockEnd);
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_block_mappings() {
+        let s =
+"
+a simple key: a value   # The KEY token is produced here.
+? a complex key
+: another value
+a mapping:
+  key 1: value 1
+  key 2: value 2
+a sequence:
+  - item 1
+  - item 2
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value);
+        next!(p, Scalar(_, _));
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value);
+        next!(p, Scalar(_, _));
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value); // libyaml comment seems to be wrong
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value);
+        next!(p, Scalar(_, _));
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value);
+        next!(p, Scalar(_, _));
+        next!(p, BlockEnd);
+        next!(p, Key);
+        next!(p, Scalar(_, _));
+        next!(p, Value);
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next!(p, Scalar(_, _));
+        next!(p, BlockEntry);
+        next!(p, Scalar(_, _));
+        next!(p, BlockEnd);
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+
+    }
+
+    #[test]
+    fn test_no_block_sequence_start() {
+        let s =
+"
+key:
+- item 1
+- item 2
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key");
+        next!(p, Value);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 2");
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_collections_in_sequence() {
+        let s =
+"
+- - item 1
+  - item 2
+- key 1: value 1
+  key 2: value 2
+- ? complex key
+  : complex value
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 2");
+        next!(p, BlockEnd);
+        next!(p, BlockEntry);
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 1");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 1");
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 2");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 2");
+        next!(p, BlockEnd);
+        next!(p, BlockEntry);
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "complex key");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "complex value");
+        next!(p, BlockEnd);
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_collections_in_mapping() {
+        let s =
+"
+? a sequence
+: - item 1
+  - item 2
+? a mapping
+: key 1: value 1
+  key 2: value 2
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "a sequence");
+        next!(p, Value);
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "item 2");
+        next!(p, BlockEnd);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "a mapping");
+        next!(p, Value);
+        next!(p, BlockMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 1");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 1");
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "key 2");
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "value 2");
+        next!(p, BlockEnd);
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_spec_ex7_3() {
+        let s =
+"
+{
+    ? foo :,
+    : bar,
+}
+";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, FlowMappingStart);
+        next!(p, Key);
+        next_scalar!(p, TScalarStyle::Plain, "foo");
+        next!(p, Value);
+        next!(p, FlowEntry);
+        next!(p, Value);
+        next_scalar!(p, TScalarStyle::Plain, "bar");
+        next!(p, FlowEntry);
+        next!(p, FlowMappingEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_scanner_cr() {
+        let s = "---\r\n- tok1\r\n- tok2";
+        let mut p = Scanner::new(s.chars());
+        next!(p, StreamStart(..));
+        next!(p, DocumentStart);
+        next!(p, BlockSequenceStart);
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "tok1");
+        next!(p, BlockEntry);
+        next_scalar!(p, TScalarStyle::Plain, "tok2");
+        next!(p, BlockEnd);
+        next!(p, StreamEnd);
+        end!(p);
+    }
+
+    #[test]
+    fn test_uri() {
+        // TODO
+    }
+
+    #[test]
+    fn test_uri_escapes() {
+        // TODO
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/src/yaml.rs
@@ -0,0 +1,641 @@
+use std::collections::BTreeMap;
+use std::ops::Index;
+use std::string;
+use std::i64;
+use std::f64;
+use std::mem;
+use std::vec;
+use parser::*;
+use scanner::{TScalarStyle, ScanError, TokenType, Marker};
+use linked_hash_map::LinkedHashMap;
+
+/// A YAML node is stored as this `Yaml` enumeration, which provides an easy way to
+/// access your YAML document.
+///
+/// # Examples
+///
+/// ```
+/// use yaml_rust::Yaml;
+/// let foo = Yaml::from_str("-123"); // convert the string to the appropriate YAML type
+/// assert_eq!(foo.as_i64().unwrap(), -123);
+///
+/// // iterate over an Array
+/// let vec = Yaml::Array(vec![Yaml::Integer(1), Yaml::Integer(2)]);
+/// for v in vec.as_vec().unwrap() {
+///     assert!(v.as_i64().is_some());
+/// }
+/// ```
+#[derive(Clone, PartialEq, PartialOrd, Debug, Eq, Ord, Hash)]
+pub enum Yaml {
+    /// Float types are stored as String and parsed on demand.
+    /// Note that f64 does NOT implement Eq trait and can NOT be stored in BTreeMap.
+    Real(string::String),
+    /// YAML int is stored as i64.
+    Integer(i64),
+    /// YAML scalar.
+    String(string::String),
+    /// YAML bool, e.g. `true` or `false`.
+    Boolean(bool),
+    /// YAML array, can be accessed as a `Vec`.
+    Array(self::Array),
+    /// YAML hash, can be accessed as a `LinkedHashMap`.
+    ///
+    /// Itertion order will match the order of insertion into the map.
+    Hash(self::Hash),
+    /// Alias, not fully supported yet.
+    Alias(usize),
+    /// YAML null, e.g. `null` or `~`.
+    Null,
+    /// Accessing a nonexistent node via the Index trait returns `BadValue`. This
+    /// simplifies error handling in the calling code. Invalid type conversion also
+    /// returns `BadValue`.
+    BadValue,
+}
+
+pub type Array = Vec<Yaml>;
+pub type Hash = LinkedHashMap<Yaml, Yaml>;
+
+// parse f64 as Core schema
+// See: https://github.com/chyh1990/yaml-rust/issues/51
+fn parse_f64(v: &str) -> Option<f64> {
+    match v {
+        ".inf" | ".Inf" | ".INF" | "+.inf" | "+.Inf" | "+.INF" => Some(f64::INFINITY),
+        "-.inf" | "-.Inf" | "-.INF" => Some(f64::NEG_INFINITY),
+        ".nan" | "NaN" | ".NAN" => Some(f64::NAN),
+        _ => v.parse::<f64>().ok()
+    }
+}
+
+pub struct YamlLoader {
+    docs: Vec<Yaml>,
+    // states
+    // (current node, anchor_id) tuple
+    doc_stack: Vec<(Yaml, usize)>,
+    key_stack: Vec<Yaml>,
+    anchor_map: BTreeMap<usize, Yaml>,
+}
+
+impl MarkedEventReceiver for YamlLoader {
+    fn on_event(&mut self, ev: Event, _: Marker) {
+        // println!("EV {:?}", ev);
+        match ev {
+            Event::DocumentStart => {
+                // do nothing
+            },
+            Event::DocumentEnd => {
+                match self.doc_stack.len() {
+                    // empty document
+                    0 => self.docs.push(Yaml::BadValue),
+                    1 => self.docs.push(self.doc_stack.pop().unwrap().0),
+                    _ => unreachable!()
+                }
+            },
+            Event::SequenceStart(aid) => {
+                self.doc_stack.push((Yaml::Array(Vec::new()), aid));
+            },
+            Event::SequenceEnd => {
+                let node = self.doc_stack.pop().unwrap();
+                self.insert_new_node(node);
+            },
+            Event::MappingStart(aid) => {
+                self.doc_stack.push((Yaml::Hash(Hash::new()), aid));
+                self.key_stack.push(Yaml::BadValue);
+            },
+            Event::MappingEnd => {
+                self.key_stack.pop().unwrap();
+                let node = self.doc_stack.pop().unwrap();
+                self.insert_new_node(node);
+            },
+            Event::Scalar(v, style, aid, tag) => {
+                let node = if style != TScalarStyle::Plain {
+                    Yaml::String(v)
+                } else if let Some(TokenType::Tag(ref handle, ref suffix)) = tag {
+                    // XXX tag:yaml.org,2002:
+                    if handle == "!!" {
+                        match suffix.as_ref() {
+                            "bool" => {
+                                // "true" or "false"
+                                match v.parse::<bool>() {
+                                    Err(_) => Yaml::BadValue,
+                                    Ok(v) => Yaml::Boolean(v)
+                                }
+                            },
+                            "int" => {
+                                match v.parse::<i64>() {
+                                    Err(_) => Yaml::BadValue,
+                                    Ok(v) => Yaml::Integer(v)
+                                }
+                            },
+                            "float" => {
+                                match parse_f64(&v) {
+                                    Some(_) => Yaml::Real(v),
+                                    None => Yaml::BadValue,
+                                }
+                            },
+                            "null" => {
+                                match v.as_ref() {
+                                    "~" | "null" => Yaml::Null,
+                                    _ => Yaml::BadValue,
+                                }
+                            }
+                            _  => Yaml::String(v),
+                        }
+                    } else {
+                        Yaml::String(v)
+                    }
+                } else {
+                    // Datatype is not specified, or unrecognized
+                    Yaml::from_str(&v)
+                };
+
+                self.insert_new_node((node, aid));
+            },
+            Event::Alias(id) => {
+                let n = match self.anchor_map.get(&id) {
+                    Some(v) => v.clone(),
+                    None => Yaml::BadValue,
+                };
+                self.insert_new_node((n, 0));
+            }
+            _ => { /* ignore */ }
+        }
+        // println!("DOC {:?}", self.doc_stack);
+    }
+}
+
+impl YamlLoader {
+    fn insert_new_node(&mut self, node: (Yaml, usize)) {
+        // valid anchor id starts from 1
+        if node.1 > 0 {
+            self.anchor_map.insert(node.1, node.0.clone());
+        }
+        if self.doc_stack.is_empty() {
+            self.doc_stack.push(node);
+        } else {
+            let parent = self.doc_stack.last_mut().unwrap();
+            match *parent {
+                (Yaml::Array(ref mut v), _) => v.push(node.0),
+                (Yaml::Hash(ref mut h), _) => {
+                    let mut cur_key = self.key_stack.last_mut().unwrap();
+                    // current node is a key
+                    if cur_key.is_badvalue() {
+                        *cur_key = node.0;
+                    // current node is a value
+                    } else {
+                        let mut newkey = Yaml::BadValue;
+                        mem::swap(&mut newkey, cur_key);
+                        h.insert(newkey, node.0);
+                    }
+                },
+                _ => unreachable!(),
+            }
+        }
+    }
+
+    pub fn load_from_str(source: &str) -> Result<Vec<Yaml>, ScanError>{
+        let mut loader = YamlLoader {
+            docs: Vec::new(),
+            doc_stack: Vec::new(),
+            key_stack: Vec::new(),
+            anchor_map: BTreeMap::new(),
+        };
+        let mut parser = Parser::new(source.chars());
+        try!(parser.load(&mut loader, true));
+        Ok(loader.docs)
+    }
+}
+
+macro_rules! define_as (
+    ($name:ident, $t:ident, $yt:ident) => (
+pub fn $name(&self) -> Option<$t> {
+    match *self {
+        Yaml::$yt(v) => Some(v),
+        _ => None
+    }
+}
+    );
+);
+
+macro_rules! define_as_ref (
+    ($name:ident, $t:ty, $yt:ident) => (
+pub fn $name(&self) -> Option<$t> {
+    match *self {
+        Yaml::$yt(ref v) => Some(v),
+        _ => None
+    }
+}
+    );
+);
+
+macro_rules! define_into (
+    ($name:ident, $t:ty, $yt:ident) => (
+pub fn $name(self) -> Option<$t> {
+    match self {
+        Yaml::$yt(v) => Some(v),
+        _ => None
+    }
+}
+    );
+);
+
+impl Yaml {
+    define_as!(as_bool, bool, Boolean);
+    define_as!(as_i64, i64, Integer);
+
+    define_as_ref!(as_str, &str, String);
+    define_as_ref!(as_hash, &Hash, Hash);
+    define_as_ref!(as_vec, &Array, Array);
+
+    define_into!(into_bool, bool, Boolean);
+    define_into!(into_i64, i64, Integer);
+    define_into!(into_string, String, String);
+    define_into!(into_hash, Hash, Hash);
+    define_into!(into_vec, Array, Array);
+
+    pub fn is_null(&self) -> bool {
+        match *self {
+            Yaml::Null => true,
+            _ => false
+        }
+    }
+
+    pub fn is_badvalue(&self) -> bool {
+        match *self {
+            Yaml::BadValue => true,
+            _ => false
+        }
+    }
+
+    pub fn is_array(&self) -> bool {
+        match *self {
+            Yaml::Array(_) => true,
+            _ => false
+        }
+    }
+
+    pub fn as_f64(&self) -> Option<f64> {
+        match *self {
+            Yaml::Real(ref v) => parse_f64(v),
+            _ => None
+        }
+    }
+
+    pub fn into_f64(self) -> Option<f64> {
+        match self {
+            Yaml::Real(ref v) => parse_f64(v),
+            _ => None
+        }
+    }
+}
+
+#[cfg_attr(feature = "cargo-clippy", allow(should_implement_trait))]
+impl Yaml {
+    // Not implementing FromStr because there is no possibility of Error.
+    // This function falls back to Yaml::String if nothing else matches.
+    pub fn from_str(v: &str) -> Yaml {
+        if v.starts_with("0x") {
+            let n = i64::from_str_radix(&v[2..], 16);
+            if n.is_ok() {
+                return Yaml::Integer(n.unwrap());
+            }
+        }
+        if v.starts_with("0o") {
+            let n = i64::from_str_radix(&v[2..], 8);
+            if n.is_ok() {
+                return Yaml::Integer(n.unwrap());
+            }
+        }
+        if v.starts_with('+') && v[1..].parse::<i64>().is_ok() {
+            return Yaml::Integer(v[1..].parse::<i64>().unwrap());
+        }
+        match v {
+            "~" | "null" => Yaml::Null,
+            "true" => Yaml::Boolean(true),
+            "false" => Yaml::Boolean(false),
+            _ if v.parse::<i64>().is_ok() => Yaml::Integer(v.parse::<i64>().unwrap()),
+            // try parsing as f64
+            _ if parse_f64(v).is_some() => Yaml::Real(v.to_owned()),
+            _ => Yaml::String(v.to_owned())
+        }
+    }
+}
+
+static BAD_VALUE: Yaml = Yaml::BadValue;
+impl<'a> Index<&'a str> for Yaml {
+    type Output = Yaml;
+
+    fn index(&self, idx: &'a str) -> &Yaml {
+        let key = Yaml::String(idx.to_owned());
+        match self.as_hash() {
+            Some(h) => h.get(&key).unwrap_or(&BAD_VALUE),
+            None => &BAD_VALUE
+        }
+    }
+}
+
+impl Index<usize> for Yaml {
+    type Output = Yaml;
+
+    fn index(&self, idx: usize) -> &Yaml {
+        if let Some(v) = self.as_vec() {
+            v.get(idx).unwrap_or(&BAD_VALUE)
+        } else if let Some(v) = self.as_hash() {
+            let key = Yaml::Integer(idx as i64);
+            v.get(&key).unwrap_or(&BAD_VALUE)
+        } else {
+            &BAD_VALUE
+        }
+    }
+}
+
+impl IntoIterator for Yaml {
+    type Item = Yaml;
+    type IntoIter = YamlIter;
+
+    fn into_iter(self) -> Self::IntoIter {
+        YamlIter {
+            yaml: self.into_vec()
+                .unwrap_or_else(Vec::new).into_iter()
+        }
+    }
+}
+
+pub struct YamlIter {
+    yaml: vec::IntoIter<Yaml>,
+}
+
+impl Iterator for YamlIter {
+    type Item = Yaml;
+
+    fn next(&mut self) -> Option<Yaml> {
+        self.yaml.next()
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use yaml::*;
+    use std::f64;
+    #[test]
+    fn test_coerce() {
+        let s = "---
+a: 1
+b: 2.2
+c: [1, 2]
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+        assert_eq!(doc["a"].as_i64().unwrap(), 1i64);
+        assert_eq!(doc["b"].as_f64().unwrap(), 2.2f64);
+        assert_eq!(doc["c"][1].as_i64().unwrap(), 2i64);
+        assert!(doc["d"][0].is_badvalue());
+    }
+
+    #[test]
+    fn test_empty_doc() {
+        let s: String = "".to_owned();
+        YamlLoader::load_from_str(&s).unwrap();
+        let s: String = "---".to_owned();
+        assert_eq!(YamlLoader::load_from_str(&s).unwrap()[0], Yaml::Null);
+    }
+
+    #[test]
+    fn test_parser() {
+        let s: String = "
+# comment
+a0 bb: val
+a1:
+    b1: 4
+    b2: d
+a2: 4 # i'm comment
+a3: [1, 2, 3]
+a4:
+    - - a1
+      - a2
+    - 2
+a5: 'single_quoted'
+a6: \"double_quoted\"
+a7: 你好
+".to_owned();
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+        assert_eq!(doc["a7"].as_str().unwrap(), "你好");
+    }
+
+    #[test]
+    fn test_multi_doc() {
+        let s =
+"
+'a scalar'
+---
+'a scalar'
+---
+'a scalar'
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        assert_eq!(out.len(), 3);
+    }
+
+    #[test]
+    fn test_anchor() {
+        let s =
+"
+a1: &DEFAULT
+    b1: 4
+    b2: d
+a2: *DEFAULT
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+        assert_eq!(doc["a2"]["b1"].as_i64().unwrap(), 4);
+    }
+
+    #[test]
+    fn test_bad_anchor() {
+        let s =
+"
+a1: &DEFAULT
+    b1: 4
+    b2: *DEFAULT
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+        assert_eq!(doc["a1"]["b2"], Yaml::BadValue);
+
+    }
+
+    #[test]
+    fn test_github_27() {
+        // https://github.com/chyh1990/yaml-rust/issues/27
+        let s = "&a";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+        assert_eq!(doc.as_str().unwrap(), "");
+    }
+
+    #[test]
+    fn test_plain_datatype() {
+        let s =
+"
+- 'string'
+- \"string\"
+- string
+- 123
+- -321
+- 1.23
+- -1e4
+- ~
+- null
+- true
+- false
+- !!str 0
+- !!int 100
+- !!float 2
+- !!null ~
+- !!bool true
+- !!bool false
+- 0xFF
+# bad values
+- !!int string
+- !!float string
+- !!bool null
+- !!null val
+- 0o77
+- [ 0xF, 0xF ]
+- +12345
+- [ true, false ]
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let doc = &out[0];
+
+        assert_eq!(doc[0].as_str().unwrap(), "string");
+        assert_eq!(doc[1].as_str().unwrap(), "string");
+        assert_eq!(doc[2].as_str().unwrap(), "string");
+        assert_eq!(doc[3].as_i64().unwrap(), 123);
+        assert_eq!(doc[4].as_i64().unwrap(), -321);
+        assert_eq!(doc[5].as_f64().unwrap(), 1.23);
+        assert_eq!(doc[6].as_f64().unwrap(), -1e4);
+        assert!(doc[7].is_null());
+        assert!(doc[8].is_null());
+        assert_eq!(doc[9].as_bool().unwrap(), true);
+        assert_eq!(doc[10].as_bool().unwrap(), false);
+        assert_eq!(doc[11].as_str().unwrap(), "0");
+        assert_eq!(doc[12].as_i64().unwrap(), 100);
+        assert_eq!(doc[13].as_f64().unwrap(), 2.0);
+        assert!(doc[14].is_null());
+        assert_eq!(doc[15].as_bool().unwrap(), true);
+        assert_eq!(doc[16].as_bool().unwrap(), false);
+        assert_eq!(doc[17].as_i64().unwrap(), 255);
+        assert!(doc[18].is_badvalue());
+        assert!(doc[19].is_badvalue());
+        assert!(doc[20].is_badvalue());
+        assert!(doc[21].is_badvalue());
+        assert_eq!(doc[22].as_i64().unwrap(), 63);
+        assert_eq!(doc[23][0].as_i64().unwrap(), 15);
+        assert_eq!(doc[23][1].as_i64().unwrap(), 15);
+        assert_eq!(doc[24].as_i64().unwrap(), 12345);
+        assert!(doc[25][0].as_bool().unwrap());
+        assert!(!doc[25][1].as_bool().unwrap());
+    }
+
+    #[test]
+    fn test_bad_hypen() {
+        // See: https://github.com/chyh1990/yaml-rust/issues/23
+        let s = "{-";
+        assert!(YamlLoader::load_from_str(&s).is_err());
+    }
+
+    #[test]
+    fn test_issue_65() {
+        // See: https://github.com/chyh1990/yaml-rust/issues/65
+        let b = "\n\"ll\\\"ll\\\r\n\"ll\\\"ll\\\r\r\r\rU\r\r\rU";
+        assert!(YamlLoader::load_from_str(&b).is_err());
+    }
+
+    #[test]
+    fn test_bad_docstart() {
+        assert!(YamlLoader::load_from_str("---This used to cause an infinite loop").is_ok());
+        assert_eq!(YamlLoader::load_from_str("----"), Ok(vec![Yaml::String(String::from("----"))]));
+        assert_eq!(YamlLoader::load_from_str("--- #here goes a comment"), Ok(vec![Yaml::Null]));
+        assert_eq!(YamlLoader::load_from_str("---- #here goes a comment"), Ok(vec![Yaml::String(String::from("----"))]));
+    }
+
+    #[test]
+    fn test_plain_datatype_with_into_methods() {
+        let s =
+"
+- 'string'
+- \"string\"
+- string
+- 123
+- -321
+- 1.23
+- -1e4
+- true
+- false
+- !!str 0
+- !!int 100
+- !!float 2
+- !!bool true
+- !!bool false
+- 0xFF
+- 0o77
+- +12345
+- -.INF
+- .NAN
+- !!float .INF
+";
+        let mut out = YamlLoader::load_from_str(&s).unwrap().into_iter();
+        let mut doc = out.next().unwrap().into_iter();
+
+        assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
+        assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
+        assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), 123);
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), -321);
+        assert_eq!(doc.next().unwrap().into_f64().unwrap(), 1.23);
+        assert_eq!(doc.next().unwrap().into_f64().unwrap(), -1e4);
+        assert_eq!(doc.next().unwrap().into_bool().unwrap(), true);
+        assert_eq!(doc.next().unwrap().into_bool().unwrap(), false);
+        assert_eq!(doc.next().unwrap().into_string().unwrap(), "0");
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), 100);
+        assert_eq!(doc.next().unwrap().into_f64().unwrap(), 2.0);
+        assert_eq!(doc.next().unwrap().into_bool().unwrap(), true);
+        assert_eq!(doc.next().unwrap().into_bool().unwrap(), false);
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), 255);
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), 63);
+        assert_eq!(doc.next().unwrap().into_i64().unwrap(), 12345);
+        assert_eq!(doc.next().unwrap().into_f64().unwrap(), f64::NEG_INFINITY);
+        assert!(doc.next().unwrap().into_f64().is_some());
+        assert_eq!(doc.next().unwrap().into_f64().unwrap(), f64::INFINITY);
+    }
+
+    #[test]
+    fn test_hash_order() {
+        let s = "---
+b: ~
+a: ~
+c: ~
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let first = out.into_iter().next().unwrap();
+        let mut iter = first.into_hash().unwrap().into_iter();
+        assert_eq!(Some((Yaml::String("b".to_owned()), Yaml::Null)), iter.next());
+        assert_eq!(Some((Yaml::String("a".to_owned()), Yaml::Null)), iter.next());
+        assert_eq!(Some((Yaml::String("c".to_owned()), Yaml::Null)), iter.next());
+        assert_eq!(None, iter.next());
+    }
+
+    #[test]
+    fn test_integer_key() {
+        let s = "
+0:
+    important: true
+1:
+    important: false
+";
+        let out = YamlLoader::load_from_str(&s).unwrap();
+        let first = out.into_iter().next().unwrap();
+        assert_eq!(first[0]["important"].as_bool().unwrap(), true);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/quickcheck.rs
@@ -0,0 +1,21 @@
+extern crate yaml_rust;
+#[macro_use]
+extern crate quickcheck;
+
+use quickcheck::TestResult;
+use yaml_rust::{Yaml, YamlLoader, YamlEmitter};
+use std::error::Error;
+
+quickcheck! {
+    fn test_check_weird_keys(xs: Vec<String>) -> TestResult {
+        let mut out_str = String::new();
+        {
+            let mut emitter = YamlEmitter::new(&mut out_str);
+            emitter.dump(&Yaml::Array(xs.into_iter().map(Yaml::String).collect())).unwrap();
+        }
+        if let Err(err) = YamlLoader::load_from_str(&out_str) {
+            return TestResult::error(err.description());
+        }
+        TestResult::passed()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/spec_test.rs
@@ -0,0 +1,141 @@
+#![allow(dead_code)]
+#![allow(non_upper_case_globals)]
+extern crate yaml_rust;
+
+use yaml_rust::parser::{Parser, EventReceiver, Event};
+use yaml_rust::scanner::TScalarStyle;
+
+// These names match the names used in the C++ test suite.
+#[cfg_attr(feature = "cargo-clippy", allow(enum_variant_names))]
+#[derive(Clone, PartialEq, PartialOrd, Debug)]
+enum TestEvent {
+    OnDocumentStart,
+    OnDocumentEnd,
+    OnSequenceStart,
+    OnSequenceEnd,
+    OnMapStart,
+    OnMapEnd,
+    OnScalar,
+    OnAlias,
+    OnNull,
+}
+
+struct YamlChecker {
+    pub evs: Vec<TestEvent>
+}
+
+impl EventReceiver for YamlChecker {
+    fn on_event(&mut self, ev: Event) {
+        let tev = match ev {
+            Event::DocumentStart => TestEvent::OnDocumentStart,
+            Event::DocumentEnd => TestEvent::OnDocumentEnd,
+            Event::SequenceStart(..) => TestEvent::OnSequenceStart,
+            Event::SequenceEnd => TestEvent::OnSequenceEnd,
+            Event::MappingStart(..) => TestEvent::OnMapStart,
+            Event::MappingEnd => TestEvent::OnMapEnd,
+            Event::Scalar(ref v, style, _, _)=> {
+                if v == "~" && style == TScalarStyle::Plain {
+                    TestEvent::OnNull
+                } else {
+                    TestEvent::OnScalar
+                }
+            },
+            Event::Alias(_) => TestEvent::OnAlias,
+            _ => { return } // ignore other events
+        };
+        self.evs.push(tev);
+    }
+}
+
+fn str_to_test_events(docs: &str) -> Vec<TestEvent> {
+    let mut p = YamlChecker {
+        evs: Vec::new()
+    };
+    let mut parser = Parser::new(docs.chars());
+    parser.load(&mut p, true).unwrap();
+    p.evs
+}
+
+macro_rules! assert_next {
+    ($v:expr, $p:pat) => (
+        match $v.next().unwrap() {
+            $p => {},
+            e => { panic!("unexpected event: {:?}", e); }
+        }
+    )
+}
+
+// auto generated from handler_spec_test.cpp
+include!("specexamples.rs.inc");
+include!("spec_test.rs.inc");
+
+// hand-crafted tests
+//#[test]
+//fn test_hc_alias() {
+//}
+
+#[test]
+fn test_mapvec_legal() {
+  use yaml_rust::yaml::{Array, Hash, Yaml};
+  use yaml_rust::{YamlLoader, YamlEmitter};
+
+  // Emitting a `map<map<seq<_>>, _>` should result in legal yaml that
+  // we can parse.
+
+  let mut key = Array::new();
+  key.push(Yaml::Integer(1));
+  key.push(Yaml::Integer(2));
+  key.push(Yaml::Integer(3));
+
+  let mut keyhash = Hash::new();
+  keyhash.insert(Yaml::String("key".into()), Yaml::Array(key));
+
+  let mut val = Array::new();
+  val.push(Yaml::Integer(4));
+  val.push(Yaml::Integer(5));
+  val.push(Yaml::Integer(6));
+
+  let mut hash = Hash::new();
+  hash.insert(Yaml::Hash(keyhash), Yaml::Array(val));
+
+  let mut out_str = String::new();
+  {
+    let mut emitter = YamlEmitter::new(&mut out_str);
+    emitter.dump(&Yaml::Hash(hash)).unwrap();
+  }
+
+  // At this point, we are tempted to naively render like this:
+  //
+  //  ```yaml
+  //  ---
+  //  {key:
+  //      - 1
+  //      - 2
+  //      - 3}:
+  //    - 4
+  //    - 5
+  //    - 6
+  //  ```
+  //
+  // However, this doesn't work, because the key sequence [1, 2, 3] is
+  // rendered in block mode, which is not legal (as far as I can tell)
+  // inside the flow mode of the key. We need to either fully render
+  // everything that's in a key in flow mode (which may make for some
+  // long lines), or use the explicit map identifier '?': 
+  //
+  //  ```yaml
+  //  ---
+  //  ?
+  //    key:
+  //      - 1
+  //      - 2
+  //      - 3
+  //  :
+  //    - 4
+  //    - 5
+  //    - 6
+  //  ```
+
+  YamlLoader::load_from_str(&out_str).unwrap();
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/spec_test.rs.inc
@@ -0,0 +1,1513 @@
+#[test]
+fn test_ex2_1_seq_scalars() {
+    let mut v = str_to_test_events(EX2_1).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_2_mapping_scalars_to_scalars() {
+    let mut v = str_to_test_events(EX2_2).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_3_mapping_scalars_to_sequences() {
+    let mut v = str_to_test_events(EX2_3).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_4_sequence_of_mappings() {
+    let mut v = str_to_test_events(EX2_4).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_5_sequence_of_sequences() {
+    let mut v = str_to_test_events(EX2_5).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_6_mapping_of_mappings() {
+    let mut v = str_to_test_events(EX2_6).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_7_two_documents_in_a_stream() {
+    let mut v = str_to_test_events(EX2_7).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_8_play_by_play_feed() {
+    let mut v = str_to_test_events(EX2_8).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_9_single_document_with_two_comments() {
+    let mut v = str_to_test_events(EX2_9).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_10_simple_anchor() {
+    let mut v = str_to_test_events(EX2_10).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_11_mapping_between_sequences() {
+    let mut v = str_to_test_events(EX2_11).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_12_compact_nested_mapping() {
+    let mut v = str_to_test_events(EX2_12).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_13_in_literals_newlines_are_preserved() {
+    let mut v = str_to_test_events(EX2_13).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_14_in_folded_scalars_newlines_become_spaces() {
+    let mut v = str_to_test_events(EX2_14).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_15_folded_newlines_are_preserved_for_more_indented_and_blank_lines() {
+    let mut v = str_to_test_events(EX2_15).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_16_indentation_determines_scope() {
+    let mut v = str_to_test_events(EX2_16).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_17_quoted_scalars() {
+    let mut v = str_to_test_events(EX2_17).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_18_multi_line_flow_scalars() {
+    let mut v = str_to_test_events(EX2_18).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_23_various_explicit_tags() {
+    let mut v = str_to_test_events(EX2_23).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_24_global_tags() {
+    let mut v = str_to_test_events(EX2_24).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_25_unordered_sets() {
+    let mut v = str_to_test_events(EX2_25).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_26_ordered_mappings() {
+    let mut v = str_to_test_events(EX2_26).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_27_invoice() {
+    let mut v = str_to_test_events(EX2_27).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex2_28_log_file() {
+    let mut v = str_to_test_events(EX2_28).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_3_block_structure_indicators() {
+    let mut v = str_to_test_events(EX5_3).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_4_flow_structure_indicators() {
+    let mut v = str_to_test_events(EX5_4).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_6_node_property_indicators() {
+    let mut v = str_to_test_events(EX5_6).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_7_block_scalar_indicators() {
+    let mut v = str_to_test_events(EX5_7).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_8_quoted_scalar_indicators() {
+    let mut v = str_to_test_events(EX5_8).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_11_line_break_characters() {
+    let mut v = str_to_test_events(EX5_11).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_12_tabs_and_spaces() {
+    let mut v = str_to_test_events(EX5_12).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex5_13_escaped_characters() {
+    let mut v = str_to_test_events(EX5_13).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_1_indentation_spaces() {
+    let mut v = str_to_test_events(EX6_1).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_2_indentation_indicators() {
+    let mut v = str_to_test_events(EX6_2).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_3_separation_spaces() {
+    let mut v = str_to_test_events(EX6_3).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_4_line_prefixes() {
+    let mut v = str_to_test_events(EX6_4).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_5_empty_lines() {
+    let mut v = str_to_test_events(EX6_5).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_6_line_folding() {
+    let mut v = str_to_test_events(EX6_6).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_7_block_folding() {
+    let mut v = str_to_test_events(EX6_7).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_8_flow_folding() {
+    let mut v = str_to_test_events(EX6_8).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_9_separated_comment() {
+    let mut v = str_to_test_events(EX6_9).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_12_separation_spaces_ii() {
+    let mut v = str_to_test_events(EX6_12).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_13_reserved_directives() {
+    let mut v = str_to_test_events(EX6_13).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_14_yaml_directive() {
+    let mut v = str_to_test_events(EX6_14).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_16_tag_directive() {
+    let mut v = str_to_test_events(EX6_16).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_18_primary_tag_handle() {
+    let mut v = str_to_test_events(EX6_18).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_19_secondary_tag_handle() {
+    let mut v = str_to_test_events(EX6_19).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_20_tag_handles() {
+    let mut v = str_to_test_events(EX6_20).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_21_local_tag_prefix() {
+    let mut v = str_to_test_events(EX6_21).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_22_global_tag_prefix() {
+    let mut v = str_to_test_events(EX6_22).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_23_node_properties() {
+    let mut v = str_to_test_events(EX6_23).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_24_verbatim_tags() {
+    let mut v = str_to_test_events(EX6_24).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_26_tag_shorthands() {
+    let mut v = str_to_test_events(EX6_26).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_28_non_specific_tags() {
+    let mut v = str_to_test_events(EX6_28).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex6_29_node_anchors() {
+    let mut v = str_to_test_events(EX6_29).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_1_alias_nodes() {
+    let mut v = str_to_test_events(EX7_1).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[allow(dead_code)]
+fn test_ex7_2_empty_nodes() {
+    let mut v = str_to_test_events(EX7_2).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_3_completely_empty_nodes() {
+    let mut v = str_to_test_events(EX7_3).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_4_double_quoted_implicit_keys() {
+    let mut v = str_to_test_events(EX7_4).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_5_double_quoted_line_breaks() {
+    let mut v = str_to_test_events(EX7_5).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_6_double_quoted_lines() {
+    let mut v = str_to_test_events(EX7_6).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_7_single_quoted_characters() {
+    let mut v = str_to_test_events(EX7_7).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_8_single_quoted_implicit_keys() {
+    let mut v = str_to_test_events(EX7_8).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_9_single_quoted_lines() {
+    let mut v = str_to_test_events(EX7_9).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[allow(dead_code)]
+fn test_ex7_10_plain_characters() {
+    let mut v = str_to_test_events(EX7_10).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_11_plain_implicit_keys() {
+    let mut v = str_to_test_events(EX7_11).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_12_plain_lines() {
+    let mut v = str_to_test_events(EX7_12).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_13_flow_sequence() {
+    let mut v = str_to_test_events(EX7_13).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_14_flow_sequence_entries() {
+    let mut v = str_to_test_events(EX7_14).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_15_flow_mappings() {
+    let mut v = str_to_test_events(EX7_15).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_16_flow_mapping_entries() {
+    let mut v = str_to_test_events(EX7_16).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[allow(dead_code)]
+fn test_ex7_17_flow_mapping_separate_values() {
+    let mut v = str_to_test_events(EX7_17).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_18_flow_mapping_adjacent_values() {
+    let mut v = str_to_test_events(EX7_18).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_19_single_pair_flow_mappings() {
+    let mut v = str_to_test_events(EX7_19).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_20_single_pair_explicit_entry() {
+    let mut v = str_to_test_events(EX7_20).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[allow(dead_code)]
+fn test_ex7_21_single_pair_implicit_entries() {
+    let mut v = str_to_test_events(EX7_21).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_23_flow_content() {
+    let mut v = str_to_test_events(EX7_23).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex7_24_flow_nodes() {
+    let mut v = str_to_test_events(EX7_24).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnAlias);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_1_block_scalar_header() {
+    let mut v = str_to_test_events(EX8_1).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[allow(dead_code)]
+fn test_ex8_2_block_indentation_header() {
+    let mut v = str_to_test_events(EX8_2).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_4_chomping_final_line_break() {
+    let mut v = str_to_test_events(EX8_4).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_6_empty_scalar_chomping() {
+    let mut v = str_to_test_events(EX8_6).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_7_literal_scalar() {
+    let mut v = str_to_test_events(EX8_7).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_8_literal_content() {
+    let mut v = str_to_test_events(EX8_8).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_9_folded_scalar() {
+    let mut v = str_to_test_events(EX8_9).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_10_folded_lines() {
+    let mut v = str_to_test_events(EX8_10).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_11_more_indented_lines() {
+    let mut v = str_to_test_events(EX8_11).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_12_empty_separation_lines() {
+    let mut v = str_to_test_events(EX8_12).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_13_final_empty_lines() {
+    let mut v = str_to_test_events(EX8_13).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_14_block_sequence() {
+    let mut v = str_to_test_events(EX8_14).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_15_block_sequence_entry_types() {
+    let mut v = str_to_test_events(EX8_15).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_16_block_mappings() {
+    let mut v = str_to_test_events(EX8_16).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_17_explicit_block_mapping_entries() {
+    let mut v = str_to_test_events(EX8_17).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_18_implicit_block_mapping_entries() {
+    let mut v = str_to_test_events(EX8_18).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnNull);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_19_compact_block_mappings() {
+    let mut v = str_to_test_events(EX8_19).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_20_block_node_types() {
+    let mut v = str_to_test_events(EX8_20).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
+#[test]
+fn test_ex8_22_block_collection_nodes() {
+    let mut v = str_to_test_events(EX8_22).into_iter();
+    assert_next!(v, TestEvent::OnDocumentStart);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnSequenceEnd);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapStart);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnScalar);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnMapEnd);
+    assert_next!(v, TestEvent::OnDocumentEnd);
+}
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specexamples.rs.inc
@@ -0,0 +1,337 @@
+const EX2_1 : &'static str =
+    "- Mark McGwire\n- Sammy Sosa\n- Ken Griffey";
+
+const EX2_2 : &'static str =
+    "hr:  65    # Home runs\navg: 0.278 # Batting average\nrbi: 147   # Runs Batted In";
+
+const EX2_3 : &'static str =
+    "american:\n- Boston Red Sox\n- Detroit Tigers\n- New York Yankees\nnational:\n- New York Mets\n- Chicago Cubs\n- Atlanta Braves";
+
+const EX2_4 : &'static str =
+    "-\n  name: Mark McGwire\n  hr:   65\n  avg:  0.278\n-\n  name: Sammy Sosa\n  hr:   63\n  avg:  0.288";
+
+const EX2_5 : &'static str =
+    "- [name        , hr, avg  ]\n- [Mark McGwire, 65, 0.278]\n- [Sammy Sosa  , 63, 0.288]";
+
+const EX2_6 : &'static str =
+    "Mark McGwire: {hr: 65, avg: 0.278}\nSammy Sosa: {\n    hr: 63,\n    avg: 0.288\n  }";
+
+const EX2_7 : &'static str =
+    "# Ranking of 1998 home runs\n---\n- Mark McGwire\n- Sammy Sosa\n- Ken Griffey\n\n# Team ranking\n---\n- Chicago Cubs\n- St Louis Cardinals";
+
+const EX2_8 : &'static str =
+    "---\ntime: 20:03:20\nplayer: Sammy Sosa\naction: strike (miss)\n...\n---\ntime: 20:03:47\nplayer: Sammy Sosa\naction: grand slam\n...";
+
+const EX2_9 : &'static str =
+    "---\nhr: # 1998 hr ranking\n  - Mark McGwire\n  - Sammy Sosa\nrbi:\n  # 1998 rbi ranking\n  - Sammy Sosa\n  - Ken Griffey";
+
+const EX2_10 : &'static str =
+    "---\nhr:\n  - Mark McGwire\n  # Following node labeled SS\n  - &SS Sammy Sosa\nrbi:\n  - *SS # Subsequent occurrence\n  - Ken Griffey";
+
+const EX2_11 : &'static str =
+    "? - Detroit Tigers\n  - Chicago cubs\n:\n  - 2001-07-23\n\n? [ New York Yankees,\n    Atlanta Braves ]\n: [ 2001-07-02, 2001-08-12,\n    2001-08-14 ]";
+
+const EX2_12 : &'static str =
+    "---\n# Products purchased\n- item    : Super Hoop\n  quantity: 1\n- item    : Basketball\n  quantity: 4\n- item    : Big Shoes\n  quantity: 1";
+
+const EX2_13 : &'static str =
+    "# ASCII Art\n--- |\n  \\//||\\/||\n  // ||  ||__";
+
+const EX2_14 : &'static str =
+    "--- >\n  Mark McGwire's\n  year was crippled\n  by a knee injury.";
+
+const EX2_15 : &'static str =
+    ">\n Sammy Sosa completed another\n fine season with great stats.\n \n   63 Home Runs\n   0.288 Batting Average\n \n What a year!";
+
+const EX2_16 : &'static str =
+    "name: Mark McGwire\naccomplishment: >\n  Mark set a major league\n  home run record in 1998.\nstats: |\n  65 Home Runs\n  0.278 Batting Average\n";
+
+const EX2_17 : &'static str =
+    "unicode: \"Sosa did fine.\\u263A\"\ncontrol: \"\\b1998\\t1999\\t2000\\n\"\nhex esc: \"\\x0d\\x0a is \\r\\n\"\n\nsingle: '\"Howdy!\" he cried.'\nquoted: ' # Not a ''comment''.'\ntie-fighter: '|\\-*-/|'";
+
+const EX2_18 : &'static str =
+    "plain:\n  This unquoted scalar\n  spans many lines.\n\nquoted: \"So does this\n  quoted scalar.\\n\"";
+
+// TODO: 2.19 - 2.22 schema tags
+
+const EX2_23 : &'static str =
+    "---\nnot-date: !!str 2002-04-28\n\npicture: !!binary |\n R0lGODlhDAAMAIQAAP//9/X\n 17unp5WZmZgAAAOfn515eXv\n Pz7Y6OjuDg4J+fn5OTk6enp\n 56enmleECcgggoBADs=\n\napplication specific tag: !something |\n The semantics of the tag\n above may be different for\n different documents.";
+
+const EX2_24 : &'static str =
+    "%TAG ! tag:clarkevans.com,2002:\n--- !shape\n  # Use the ! handle for presenting\n  # tag:clarkevans.com,2002:circle\n- !circle\n  center: &ORIGIN {x: 73, y: 129}\n  radius: 7\n- !line\n  start: *ORIGIN\n  finish: { x: 89, y: 102 }\n- !label\n  start: *ORIGIN\n  color: 0xFFEEBB\n  text: Pretty vector drawing.";
+
+const EX2_25 : &'static str =
+    "# Sets are represented as a\n# Mapping where each key is\n# associated with a null value\n--- !!set\n? Mark McGwire\n? Sammy Sosa\n? Ken Griffey";
+
+const EX2_26 : &'static str =
+    "# Ordered maps are represented as\n# A sequence of mappings, with\n# each mapping having one key\n--- !!omap\n- Mark McGwire: 65\n- Sammy Sosa: 63\n- Ken Griffey: 58";
+
+const EX2_27 : &'static str =
+    "--- !<tag:clarkevans.com,2002:invoice>\ninvoice: 34843\ndate   : 2001-01-23\nbill-to: &id001\n    given  : Chris\n    family : Dumars\n    address:\n        lines: |\n            458 Walkman Dr.\n            Suite #292\n        city    : Royal Oak\n        state   : MI\n        postal  : 48046\nship-to: *id001\nproduct:\n    - sku         : BL394D\n      quantity    : 4\n      description : Basketball\n      price       : 450.00\n    - sku         : BL4438H\n      quantity    : 1\n      description : Super Hoop\n      price       : 2392.00\ntax  : 251.42\ntotal: 4443.52\ncomments:\n    Late afternoon is best.\n    Backup contact is Nancy\n    Billsmer @ 338-4338.";
+
+const EX2_28 : &'static str =
+    "---\nTime: 2001-11-23 15:01:42 -5\nUser: ed\nWarning:\n  This is an error message\n  for the log file\n---\nTime: 2001-11-23 15:02:31 -5\nUser: ed\nWarning:\n  A slightly different error\n  message.\n---\nDate: 2001-11-23 15:03:17 -5\nUser: ed\nFatal:\n  Unknown variable \"bar\"\nStack:\n  - file: TopClass.py\n    line: 23\n    code: |\n      x = MoreObject(\"345\\n\")\n  - file: MoreClass.py\n    line: 58\n    code: |-\n      foo = bar";
+
+// TODO: 5.1 - 5.2 BOM
+
+const EX5_3 : &'static str =
+    "sequence:\n- one\n- two\nmapping:\n  ? sky\n  : blue\n  sea : green";
+
+const EX5_4 : &'static str =
+    "sequence: [ one, two, ]\nmapping: { sky: blue, sea: green }";
+
+const EX5_5 : &'static str = "# Comment only.";
+
+const EX5_6 : &'static str =
+    "anchored: !local &anchor value\nalias: *anchor";
+
+const EX5_7 : &'static str =
+    "literal: |\n  some\n  text\nfolded: >\n  some\n  text\n";
+
+const EX5_8 : &'static str =
+    "single: 'text'\ndouble: \"text\"";
+
+// TODO: 5.9 directive
+// TODO: 5.10 reserved indicator
+
+const EX5_11 : &'static str =
+    "|\n  Line break (no glyph)\n  Line break (glyphed)\n";
+
+const EX5_12 : &'static str =
+    "# Tabs and spaces\nquoted: \"Quoted\t\"\nblock:	|\n  void main() {\n  \tprintf(\"Hello, world!\\n\");\n  }";
+
+const EX5_13 : &'static str =
+    "\"Fun with \\\\\n\\\" \\a \\b \\e \\f \\\n\\n \\r \\t \\v \\0 \\\n\\  \\_ \\N \\L \\P \\\n\\x41 \\u0041 \\U00000041\"";
+
+const EX5_14 : &'static str =
+    "Bad escapes:\n  \"\\c\n  \\xq-\"";
+
+const EX6_1 : &'static str =
+    "  # Leading comment line spaces are\n   # neither content nor indentation.\n    \nNot indented:\n By one space: |\n    By four\n      spaces\n Flow style: [    # Leading spaces\n   By two,        # in flow style\n  Also by two,    # are neither\n  \tStill by two   # content nor\n    ]             # indentation.";
+
+const EX6_2 : &'static str =
+    "? a\n: -\tb\n  -  -\tc\n     - d";
+
+const EX6_3 : &'static str =
+    "- foo:\t bar\n- - baz\n  -\tbaz";
+
+const EX6_4 : &'static str =
+    "plain: text\n  lines\nquoted: \"text\n  \tlines\"\nblock: |\n  text\n   \tlines\n";
+
+const EX6_5 : &'static str =
+    "Folding:\n  \"Empty line\n   \t\n  as a line feed\"\nChomping: |\n  Clipped empty lines\n ";
+
+const EX6_6 : &'static str =
+    ">-\n  trimmed\n  \n \n\n  as\n  space";
+
+const EX6_7 : &'static str =
+    ">\n  foo \n \n  \t bar\n\n  baz\n";
+
+const EX6_8 : &'static str =
+    "\"\n  foo \n \n  \t bar\n\n  baz\n\"";
+
+const EX6_9 : &'static str =
+    "key:    # Comment\n  value";
+
+const EX6_10 : &'static str =
+    "  # Comment\n   \n\n";
+
+const EX6_11 : &'static str =
+    "key:    # Comment\n        # lines\n  value\n\n";
+
+const EX6_12 : &'static str =
+    "{ first: Sammy, last: Sosa }:\n# Statistics:\n  hr:  # Home runs\n     65\n  avg: # Average\n   0.278";
+
+const EX6_13 : &'static str =
+    "%FOO  bar baz # Should be ignored\n               # with a warning.\n--- \"foo\"";
+
+const EX6_14 : &'static str =
+    "%YAML 1.3 # Attempt parsing\n           # with a warning\n---\n\"foo\"";
+
+const EX6_15 : &'static str =
+    "%YAML 1.2\n%YAML 1.1\nfoo";
+
+const EX6_16 : &'static str =
+    "%TAG !yaml! tag:yaml.org,2002:\n---\n!yaml!str \"foo\"";
+
+const EX6_17 : &'static str =
+    "%TAG ! !foo\n%TAG ! !foo\nbar";
+
+const EX6_18 : &'static str =
+    "# Private\n!foo \"bar\"\n...\n# Global\n%TAG ! tag:example.com,2000:app/\n---\n!foo \"bar\"";
+
+const EX6_19 : &'static str =
+    "%TAG !! tag:example.com,2000:app/\n---\n!!int 1 - 3 # Interval, not integer";
+
+const EX6_20 : &'static str =
+    "%TAG !e! tag:example.com,2000:app/\n---\n!e!foo \"bar\"";
+
+const EX6_21 : &'static str =
+    "%TAG !m! !my-\n--- # Bulb here\n!m!light fluorescent\n...\n%TAG !m! !my-\n--- # Color here\n!m!light green";
+
+const EX6_22 : &'static str =
+    "%TAG !e! tag:example.com,2000:app/\n---\n- !e!foo \"bar\"";
+
+const EX6_23 : &'static str =
+    "!!str &a1 \"foo\":\n  !!str bar\n&a2 baz : *a1";
+
+const EX6_24 : &'static str =
+    "!<tag:yaml.org,2002:str> foo :\n  !<!bar> baz";
+
+const EX6_25 : &'static str =
+    "- !<!> foo\n- !<$:?> bar\n";
+
+const EX6_26 : &'static str =
+    "%TAG !e! tag:example.com,2000:app/\n---\n- !local foo\n- !!str bar\n- !e!tag%21 baz\n";
+
+const EX6_27a : &'static str =
+    "%TAG !e! tag:example,2000:app/\n---\n- !e! foo";
+
+const EX6_27b : &'static str =
+    "%TAG !e! tag:example,2000:app/\n---\n- !h!bar baz";
+
+const EX6_28 : &'static str =
+    "# Assuming conventional resolution:\n- \"12\"\n- 12\n- ! 12";
+
+const EX6_29 : &'static str =
+    "First occurrence: &anchor Value\nSecond occurrence: *anchor";
+
+const EX7_1 : &'static str =
+    "First occurrence: &anchor Foo\nSecond occurrence: *anchor\nOverride anchor: &anchor Bar\nReuse anchor: *anchor";
+
+const EX7_2 : &'static str =
+    "{\n  foo : !!str,\n  !!str : bar,\n}";
+
+const EX7_3 : &'static str =
+    "{\n  ? foo :,\n  : bar,\n}\n";
+
+const EX7_4 : &'static str =
+    "\"implicit block key\" : [\n  \"implicit flow key\" : value,\n ]";
+
+const EX7_5 : &'static str =
+    "\"folded \nto a space,\t\n \nto a line feed, or \t\\\n \\ \tnon-content\"";
+
+const EX7_6 : &'static str =
+    "\" 1st non-empty\n\n 2nd non-empty \n\t3rd non-empty \"";
+
+const EX7_7 : &'static str = " 'here''s to \"quotes\"'";
+
+const EX7_8 : &'static str =
+    "'implicit block key' : [\n  'implicit flow key' : value,\n ]";
+
+const EX7_9 : &'static str =
+    "' 1st non-empty\n\n 2nd non-empty \n\t3rd non-empty '";
+
+const EX7_10 : &'static str =
+    "# Outside flow collection:\n- ::vector\n- \": - ()\"\n- Up, up, and away!\n- -123\n- http://example.com/foo#bar\n# Inside flow collection:\n- [ ::vector,\n  \": - ()\",\n  \"Up, up, and away!\",\n  -123,\n  http://example.com/foo#bar ]";
+
+const EX7_11 : &'static str =
+    "implicit block key : [\n  implicit flow key : value,\n ]";
+
+const EX7_12 : &'static str =
+    "1st non-empty\n\n 2nd non-empty \n\t3rd non-empty";
+
+const EX7_13 : &'static str =
+    "- [ one, two, ]\n- [three ,four]";
+
+const EX7_14 : &'static str =
+    "[\n\"double\n quoted\", 'single\n           quoted',\nplain\n text, [ nested ],\nsingle: pair,\n]";
+
+const EX7_15 : &'static str =
+    "- { one : two , three: four , }\n- {five: six,seven : eight}";
+
+const EX7_16 : &'static str =
+    "{\n? explicit: entry,\nimplicit: entry,\n?\n}";
+
+const EX7_17 : &'static str =
+    "{\nunquoted : \"separate\",\nhttp://foo.com,\nomitted value:,\n: omitted key,\n}";
+
+const EX7_18 : &'static str =
+    "{\n\"adjacent\":value,\n\"readable\":value,\n\"empty\":\n}";
+
+const EX7_19 : &'static str =
+    "[\nfoo: bar\n]";
+
+const EX7_20 : &'static str =
+    "[\n? foo\n bar : baz\n]";
+
+const EX7_21 : &'static str =
+    "- [ YAML : separate ]\n- [ : empty key entry ]\n- [ {JSON: like}:adjacent ]";
+
+const EX7_22 : &'static str =
+    "[ foo\n bar: invalid,";  // Note: we don't check (on purpose) the >1K chars for an
+                       // implicit key
+
+const EX7_23 : &'static str =
+    "- [ a, b ]\n- { a: b }\n- \"a\"\n- 'b'\n- c";
+
+const EX7_24 : &'static str =
+    "- !!str \"a\"\n- 'b'\n- &anchor \"c\"\n- *anchor\n- !!str";
+
+const EX8_1 : &'static str =
+    "- | # Empty header\n literal\n- >1 # Indentation indicator\n  folded\n- |+ # Chomping indicator\n keep\n\n- >1- # Both indicators\n  strip\n";
+
+const EX8_2 : &'static str =
+    "- |\n detected\n- >\n \n  \n  # detected\n- |1\n  explicit\n- >\n \t\n detected\n";
+
+const EX8_3a : &'static str =
+    "- |\n  \n text";
+
+const EX8_3b : &'static str =
+    "- >\n  text\n text";
+
+const EX8_3c : &'static str =
+    "- |2\n text";
+
+const EX8_4 : &'static str =
+    "strip: |-\n  text\nclip: |\n  text\nkeep: |+\n  text\n";
+
+const EX8_5 : &'static str =
+    " # Strip\n  # Comments:\nstrip: |-\n  # text\n  \n # Clip\n  # comments:\n\nclip: |\n  # text\n \n # Keep\n  # comments:\n\nkeep: |+\n  # text\n\n # Trail\n  # Comments\n";
+
+const EX8_6 : &'static str =
+    "strip: >-\n\nclip: >\n\nkeep: |+\n\n";
+
+const EX8_7 : &'static str =
+    "|\n literal\n \ttext\n\n";
+
+const EX8_8 : &'static str =
+    "|\n \n  \n  literal\n   \n  \n  text\n\n # Comment\n";
+
+const EX8_9 : &'static str =
+    ">\n folded\n text\n\n";
+
+const EX8_10 : &'static str =
+    ">\n\n folded\n line\n\n next\n line\n   * bullet\n\n   * list\n   * lines\n\n last\n line\n\n# Comment\n";
+
+const EX8_11 : &'static str = EX8_10;
+const EX8_12 : &'static str = EX8_10;
+const EX8_13 : &'static str = EX8_10;
+
+const EX8_14 : &'static str =
+    "block sequence:\n  - one\n  - two : three\n";
+
+const EX8_15 : &'static str =
+    "- # Empty\n- |\n block node\n- - one # Compact\n  - two # sequence\n- one: two # Compact mapping\n";
+
+const EX8_16 : &'static str =
+    "block mapping:\n key: value\n";
+
+const EX8_17 : &'static str =
+    "? explicit key # Empty value\n? |\n  block key\n: - one # Explicit compact\n  - two # block value\n";
+
+// XXX libyaml failed this test
+const EX8_18 : &'static str =
+    "plain key: in-line value\n:  # Both empty\n\"quoted key\":\n- entry\n";
+
+const EX8_19 : &'static str =
+    "- sun: yellow\n- ? earth: blue\n  : moon: white\n";
+
+const EX8_20 : &'static str =
+    "-\n  \"flow in block\"\n- >\n Block scalar\n- !!map # Block collection\n  foo : bar\n";
+
+const EX8_21 : &'static str =
+    "literal: |2\n  value\nfolded:\n   !foo\n  >1\n value\n";
+
+const EX8_22 : &'static str =
+    "sequence: !!seq\n- entry\n- !!seq\n - nested\nmapping: !!map\n foo: bar\n";
new file mode 100755
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/cpp2rust.rb
@@ -0,0 +1,78 @@
+#!/usr/bin/env ruby
+
+TEST_REGEX = /TEST_F\([a-zA-Z0-9_]+,\s+([a-zA-Z0-9_]+)\)/
+
+DISABLED_TESTS = %w(
+	test_ex7_10_plain_characters
+	test_ex7_17_flow_mapping_separate_values
+	test_ex7_21_single_pair_implicit_entries
+	test_ex7_2_empty_nodes
+	test_ex8_2_block_indentation_header
+)
+
+class Context
+	attr_accessor :name, :ev, :src
+	def initialize
+		@name = ""
+		@src = ""
+		@ev = []
+	end
+end
+
+class String
+	def snakecase
+		self
+		.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
+		.gsub(/([a-z\d])([A-Z])/, '\1_\2')
+		.tr('-', '_')
+		.gsub(/\s/, '_')
+		.gsub(/__+/, '_')
+		.downcase
+	end
+end
+
+ctx = nil
+
+tests = []
+IO.foreach(ARGV[0]) do |line|
+	line.strip!
+	if ctx
+		fail "unexpected TEST_F" if line =~ TEST_REGEX
+		if line =~ /^}/
+			tests << ctx
+			ctx = nil
+		end
+		if line =~ /^EXPECT_CALL/
+			fail 'not end with ;' unless line[-1] == ';'
+			v = line.gsub('(', ' ').gsub(')', ' ').split
+			ctx.ev << v[2]
+		end
+	else
+		next unless line =~ TEST_REGEX
+		name = $1
+		next unless name =~ /^(Ex\d+_\d+)/
+		str = $1.upcase
+		$stderr.puts "found #{name}"
+		ctx = Context.new
+		ctx.name = "test_#{name.snakecase}"
+		ctx.src = str
+	end
+end
+
+# code gen
+tests.each do |t|
+	next if t.ev.size == 0
+	if DISABLED_TESTS.include? t.name
+		puts "#[allow(dead_code)]"
+	else
+		puts "#[test]"
+	end
+	puts "fn #{t.name}() {"
+	puts "    let mut v = str_to_test_events(#{t.src}).into_iter();"
+	t.ev.each do |e|
+		puts "    assert_next!(v, TestEvent::#{e});"
+	end
+	puts "}"
+	puts
+end
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/handler_spec_test.cpp
@@ -0,0 +1,1532 @@
+#include "handler_test.h"
+#include "specexamples.h"   // IWYU pragma: keep
+#include "yaml-cpp/yaml.h"  // IWYU pragma: keep
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using ::testing::_;
+
+#define EXPECT_THROW_PARSER_EXCEPTION(statement, message) \
+  ASSERT_THROW(statement, ParserException);               \
+  try {                                                   \
+    statement;                                            \
+  } catch (const ParserException& e) {                    \
+    EXPECT_EQ(e.msg, message);                            \
+  }
+
+namespace YAML {
+namespace {
+
+typedef HandlerTest HandlerSpecTest;
+
+TEST_F(HandlerSpecTest, Ex2_1_SeqScalars) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_1);
+}
+
+TEST_F(HandlerSpecTest, Ex2_2_MappingScalarsToScalars) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.278"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "rbi"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "147"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_2);
+}
+
+TEST_F(HandlerSpecTest, Ex2_3_MappingScalarsToSequences) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "american"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Boston Red Sox"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Detroit Tigers"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "New York Yankees"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "national"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "New York Mets"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chicago Cubs"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Atlanta Braves"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_3);
+}
+
+TEST_F(HandlerSpecTest, Ex2_4_SequenceOfMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "name"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.278"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "name"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "63"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.288"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_4);
+}
+
+TEST_F(HandlerSpecTest, Ex2_5_SequenceOfSequences) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "name"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.278"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "63"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.288"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_5);
+}
+
+TEST_F(HandlerSpecTest, Ex2_6_MappingOfMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.278"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "63"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.288"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_6);
+}
+
+TEST_F(HandlerSpecTest, Ex2_7_TwoDocumentsInAStream) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chicago Cubs"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "St Louis Cardinals"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_7);
+}
+
+TEST_F(HandlerSpecTest, Ex2_8_PlayByPlayFeed) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "time"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "20:03:20"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "player"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "action"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "strike (miss)"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "time"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "20:03:47"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "player"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "action"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "grand slam"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_8);
+}
+
+TEST_F(HandlerSpecTest, Ex2_9_SingleDocumentWithTwoComments) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "rbi"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_9);
+}
+
+TEST_F(HandlerSpecTest, Ex2_10_SimpleAnchor) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 1, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "rbi"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_10);
+}
+
+TEST_F(HandlerSpecTest, Ex2_11_MappingBetweenSequences) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Detroit Tigers"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chicago cubs"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-07-23"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "New York Yankees"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Atlanta Braves"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-07-02"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-08-12"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-08-14"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_11);
+}
+
+TEST_F(HandlerSpecTest, Ex2_12_CompactNestedMapping) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "item"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Super Hoop"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quantity"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "1"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "item"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Basketball"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quantity"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "4"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "item"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Big Shoes"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quantity"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "1"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_12);
+}
+
+TEST_F(HandlerSpecTest, Ex2_13_InLiteralsNewlinesArePreserved) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0,                                "\\//||\\/||\n// ||  ||__"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_13);
+}
+
+TEST_F(HandlerSpecTest, Ex2_14_InFoldedScalarsNewlinesBecomeSpaces) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "Mark McGwire's year was crippled by a knee injury."));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_14);
+}
+
+TEST_F(HandlerSpecTest,       Ex2_15_FoldedNewlinesArePreservedForMoreIndentedAndBlankLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,      OnScalar(_, "!", 0,               "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_15);
+}
+
+TEST_F(HandlerSpecTest, Ex2_16_IndentationDeterminesScope) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "name"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "accomplishment"));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "Mark set a major league home run record in 1998.\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "stats"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0,                                "65 Home Runs\n0.278 Batting Average\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_16);
+}
+
+TEST_F(HandlerSpecTest, Ex2_17_QuotedScalars) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "unicode"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Sosa did fine.\xE2\x98\xBA"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "control"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\b1998\t1999\t2000\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hex esc"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\x0d\x0a is \r\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "single"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\"Howdy!\" he cried."));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, " # Not a 'comment'."));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "tie-fighter"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "|\\-*-/|"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_17);
+}
+
+TEST_F(HandlerSpecTest, Ex2_18_MultiLineFlowScalars) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "plain"));
+  EXPECT_CALL(handler,              OnScalar(_, "?", 0, "This unquoted scalar spans many lines."));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "So does this quoted scalar.\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_18);
+}
+
+// TODO: 2.19 - 2.22 schema tags
+
+TEST_F(HandlerSpecTest, Ex2_23_VariousExplicitTags) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "not-date"));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "2002-04-28"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "picture"));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:binary", 0,                                "R0lGODlhDAAMAIQAAP//9/X\n17unp5WZmZgAAAOfn515eXv\nPz7Y6OjuDg4J+fn5OTk6enp\n56enmleECcgggoBADs=\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "application specific tag"));
+  EXPECT_CALL(handler, OnScalar(_, "!something", 0,                                "The semantics of the tag\nabove may be different for\ndifferent documents."));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_23);
+}
+
+TEST_F(HandlerSpecTest, Ex2_24_GlobalTags) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "tag:clarkevans.com,2002:shape", 0,                                       EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "tag:clarkevans.com,2002:circle", 0,                                  EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "center"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 1, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "x"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "73"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "y"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "129"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "radius"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "7"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "tag:clarkevans.com,2002:line", 0,                                  EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "start"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "finish"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "x"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "89"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "y"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "102"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "tag:clarkevans.com,2002:label", 0,                                  EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "start"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "color"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0xFFEEBB"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "text"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Pretty vector drawing."));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_24);
+}
+
+TEST_F(HandlerSpecTest, Ex2_25_UnorderedSets) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnMapStart(_, "tag:yaml.org,2002:set", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_25);
+}
+
+TEST_F(HandlerSpecTest, Ex2_26_OrderedMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "tag:yaml.org,2002:omap", 0,                                       EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy Sosa"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "63"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Ken Griffey"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "58"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_26);
+}
+
+TEST_F(HandlerSpecTest, Ex2_27_Invoice) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "tag:clarkevans.com,2002:invoice", 0,                                  EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "invoice"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "34843"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "date"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-01-23"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bill-to"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 1, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "given"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chris"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "family"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Dumars"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "address"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "lines"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0,                                "458 Walkman Dr.\nSuite #292\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "city"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Royal Oak"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "state"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "MI"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "postal"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "48046"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "ship-to"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "product"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sku"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "BL394D"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quantity"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "4"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "description"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Basketball"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "price"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "450.00"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sku"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "BL4438H"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quantity"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "1"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "description"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Super Hoop"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "price"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2392.00"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "tax"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "251.42"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "total"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "4443.52"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "comments"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0,                                "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338."));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_27);
+}
+
+TEST_F(HandlerSpecTest, Ex2_28_LogFile) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Time"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-11-23 15:01:42 -5"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "User"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "ed"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Warning"));
+  EXPECT_CALL(handler,              OnScalar(_, "?", 0, "This is an error message for the log file"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Time"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-11-23 15:02:31 -5"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "User"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "ed"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Warning"));
+  EXPECT_CALL(handler,              OnScalar(_, "?", 0, "A slightly different error message."));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Date"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-11-23 15:03:17 -5"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "User"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "ed"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Fatal"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Unknown variable \"bar\""));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Stack"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "file"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "TopClass.py"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "line"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "23"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "code"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "x = MoreObject(\"345\\n\")\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "file"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "MoreClass.py"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "line"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "58"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "code"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "foo = bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex2_28);
+}
+
+// TODO: 5.1 - 5.2 BOM
+
+TEST_F(HandlerSpecTest, Ex5_3_BlockStructureIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sequence"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "mapping"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sky"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "blue"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sea"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "green"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_3);
+}
+
+TEST_F(HandlerSpecTest, Ex5_4_FlowStructureIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sequence"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "mapping"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sky"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "blue"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sea"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "green"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_4);
+}
+
+
+TEST_F(HandlerSpecTest, Ex5_6_NodePropertyIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "anchored"));
+  EXPECT_CALL(handler, OnScalar(_, "!local", 1, "value"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "alias"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_6);
+}
+
+TEST_F(HandlerSpecTest, Ex5_7_BlockScalarIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "literal"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "some\ntext\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "folded"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "some text\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_7);
+}
+
+TEST_F(HandlerSpecTest, Ex5_8_QuotedScalarIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "single"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "double"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_8);
+}
+
+// TODO: 5.9 directive
+// TODO: 5.10 reserved indicator
+
+TEST_F(HandlerSpecTest, Ex5_11_LineBreakCharacters) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0,                                "Line break (no glyph)\nLine break (glyphed)\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_11);
+}
+
+TEST_F(HandlerSpecTest, Ex5_12_TabsAndSpaces) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Quoted\t"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "block"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0,                                "void main() {\n\tprintf(\"Hello, world!\\n\");\n}"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_12);
+}
+
+TEST_F(HandlerSpecTest, Ex5_13_EscapedCharacters) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,      OnScalar(_, "!", 0,               "Fun with \x5C \x22 \x07 \x08 \x1B \x0C \x0A \x0D \x09 \x0B \x00 \x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9 A A A"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex5_13);
+}
+
+TEST_F(HandlerSpecTest, Ex5_14_InvalidEscapedCharacters) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex5_14),                                std::string(ErrorMsg::INVALID_ESCAPE) + "c");
+}
+
+TEST_F(HandlerSpecTest, Ex6_1_IndentationSpaces) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Not indented"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "By one space"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "By four\n  spaces\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Flow style"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "By two"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Also by two"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Still by two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_1);
+}
+
+TEST_F(HandlerSpecTest, Ex6_2_IndentationIndicators) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "a"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "b"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "c"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "d"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_2);
+}
+
+TEST_F(HandlerSpecTest, Ex6_3_SeparationSpaces) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "baz"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "baz"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_3);
+}
+
+TEST_F(HandlerSpecTest, Ex6_4_LinePrefixes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "plain"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "text lines"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text lines"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "block"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text\n \tlines\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_4);
+}
+
+TEST_F(HandlerSpecTest, Ex6_5_EmptyLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Folding"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Empty line\nas a line feed"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chomping"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Clipped empty lines\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_5);
+}
+
+TEST_F(HandlerSpecTest, Ex6_6_LineFolding) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "trimmed\n\n\nas space"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_6);
+}
+
+TEST_F(HandlerSpecTest, Ex6_7_BlockFolding) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "foo \n\n\t bar\n\nbaz\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_7);
+}
+
+TEST_F(HandlerSpecTest, Ex6_8_FlowFolding) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, " foo\nbar\nbaz "));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_8);
+}
+
+TEST_F(HandlerSpecTest, Ex6_9_SeparatedComment) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_9);
+}
+
+
+TEST_F(HandlerSpecTest, _MultiLineComments) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_11);
+}
+
+TEST_F(HandlerSpecTest, Ex6_12_SeparationSpacesII) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "first"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sammy"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "last"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Sosa"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "65"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "avg"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "0.278"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_12);
+}
+
+TEST_F(HandlerSpecTest, Ex6_13_ReservedDirectives) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "foo"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_13);
+}
+
+TEST_F(HandlerSpecTest, Ex6_14_YAMLDirective) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "foo"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_14);
+}
+
+TEST_F(HandlerSpecTest, Ex6_15_InvalidRepeatedYAMLDirective) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex6_15),                                ErrorMsg::REPEATED_YAML_DIRECTIVE);
+}
+
+TEST_F(HandlerSpecTest, Ex6_16_TagDirective) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "foo"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_16);
+}
+
+TEST_F(HandlerSpecTest, Ex6_17_InvalidRepeatedTagDirective) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex6_17),                                ErrorMsg::REPEATED_TAG_DIRECTIVE);
+}
+
+TEST_F(HandlerSpecTest, Ex6_18_PrimaryTagHandle) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!foo", 0, "bar"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "tag:example.com,2000:app/foo", 0, "bar"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_18);
+}
+
+TEST_F(HandlerSpecTest, Ex6_19_SecondaryTagHandle) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "tag:example.com,2000:app/int", 0, "1 - 3"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_19);
+}
+
+TEST_F(HandlerSpecTest, Ex6_20_TagHandles) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "tag:example.com,2000:app/foo", 0, "bar"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_20);
+}
+
+TEST_F(HandlerSpecTest, Ex6_21_LocalTagPrefix) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!my-light", 0, "fluorescent"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!my-light", 0, "green"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_21);
+}
+
+TEST_F(HandlerSpecTest, Ex6_22_GlobalTagPrefix) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "tag:example.com,2000:app/foo", 0, "bar"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_22);
+}
+
+TEST_F(HandlerSpecTest, Ex6_23_NodeProperties) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 1, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "bar"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 2, "baz"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_23);
+}
+
+TEST_F(HandlerSpecTest, Ex6_24_VerbatimTags) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "!bar", 0, "baz"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_24);
+}
+
+// TODO: Implement
+TEST_F(HandlerSpecTest, DISABLED_Ex6_25_InvalidVerbatimTags) {
+  Parse(ex6_25);
+  FAIL() << "not implemented yet";
+}
+
+TEST_F(HandlerSpecTest, Ex6_26_TagShorthands) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!local", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "bar"));
+  EXPECT_CALL(handler,              OnScalar(_, "tag:example.com,2000:app/tag%21", 0, "baz"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_26);
+}
+
+TEST_F(HandlerSpecTest, Ex6_27a_InvalidTagShorthands) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex6_27a),                                ErrorMsg::TAG_WITH_NO_SUFFIX);
+}
+
+// TODO: should we reject this one (since !h! is not declared)?
+TEST_F(HandlerSpecTest, DISABLED_Ex6_27b_InvalidTagShorthands) {
+  Parse(ex6_27b);
+  FAIL() << "not implemented yet";
+}
+
+TEST_F(HandlerSpecTest, Ex6_28_NonSpecificTags) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "12"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "12"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "12"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_28);
+}
+
+TEST_F(HandlerSpecTest, Ex6_29_NodeAnchors) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "First occurrence"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 1, "Value"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Second occurrence"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex6_29);
+}
+
+TEST_F(HandlerSpecTest, Ex7_1_AliasNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "First occurrence"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 1, "Foo"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Second occurrence"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Override anchor"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 2, "Bar"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Reuse anchor"));
+  EXPECT_CALL(handler, OnAlias(_, 2));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_1);
+}
+
+TEST_F(HandlerSpecTest, Ex7_2_EmptyNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, ""));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, ""));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_2);
+}
+
+TEST_F(HandlerSpecTest, Ex7_3_CompletelyEmptyNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_3);
+}
+
+TEST_F(HandlerSpecTest, Ex7_4_DoubleQuotedImplicitKeys) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "implicit block key"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "implicit flow key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_4);
+}
+
+TEST_F(HandlerSpecTest, Ex7_5_DoubleQuotedLineBreaks) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,      OnScalar(_, "!", 0,               "folded to a space,\nto a line feed, or \t \tnon-content"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_5);
+}
+
+TEST_F(HandlerSpecTest, Ex7_6_DoubleQuotedLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,      OnScalar(_, "!", 0, " 1st non-empty\n2nd non-empty 3rd non-empty "));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_6);
+}
+
+TEST_F(HandlerSpecTest, Ex7_7_SingleQuotedCharacters) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "here's to \"quotes\""));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_7);
+}
+
+TEST_F(HandlerSpecTest, Ex7_8_SingleQuotedImplicitKeys) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "implicit block key"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "implicit flow key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_8);
+}
+
+TEST_F(HandlerSpecTest, Ex7_9_SingleQuotedLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,      OnScalar(_, "!", 0, " 1st non-empty\n2nd non-empty 3rd non-empty "));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_9);
+}
+
+TEST_F(HandlerSpecTest, Ex7_10_PlainCharacters) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "::vector"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, ": - ()"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "Up, up, and away!"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "-123"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "http://example.com/foo#bar"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "::vector"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, ": - ()"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Up, up, and away!"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "-123"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "http://example.com/foo#bar"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_10);
+}
+
+TEST_F(HandlerSpecTest, Ex7_11_PlainImplicitKeys) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "implicit block key"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "implicit flow key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_11);
+}
+
+TEST_F(HandlerSpecTest, Ex7_12_PlainLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0,                                "1st non-empty\n2nd non-empty 3rd non-empty"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_12);
+}
+
+TEST_F(HandlerSpecTest, Ex7_13_FlowSequence) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "three"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "four"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_13);
+}
+
+TEST_F(HandlerSpecTest, Ex7_14_FlowSequenceEntries) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "double quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "single quoted"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "plain text"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "nested"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "single"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "pair"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_14);
+}
+
+TEST_F(HandlerSpecTest, Ex7_15_FlowMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "three"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "four"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "five"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "six"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "seven"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "eight"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_15);
+}
+
+TEST_F(HandlerSpecTest, Ex7_16_FlowMappingEntries) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "explicit"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "entry"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "implicit"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "entry"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_16);
+}
+
+TEST_F(HandlerSpecTest, Ex7_17_FlowMappingSeparateValues) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "unquoted"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "separate"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "http://foo.com"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "omitted value"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "omitted key"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_17);
+}
+
+TEST_F(HandlerSpecTest, Ex7_18_FlowMappingAdjacentValues) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "adjacent"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "readable"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "empty"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_18);
+}
+
+TEST_F(HandlerSpecTest, Ex7_19_SinglePairFlowMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_19);
+}
+
+TEST_F(HandlerSpecTest, Ex7_20_SinglePairExplicitEntry) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo bar"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "baz"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_20);
+}
+
+TEST_F(HandlerSpecTest, Ex7_21_SinglePairImplicitEntries) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "YAML"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "separate"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Default));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "empty key entry"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "JSON"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "like"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "adjacent"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_21);
+}
+
+TEST_F(HandlerSpecTest, Ex7_22_InvalidImplicitKeys) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex7_22), ErrorMsg::END_OF_SEQ_FLOW);
+}
+
+TEST_F(HandlerSpecTest, Ex7_23_FlowContent) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "a"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "b"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Flow));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "a"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "b"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "a"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "b"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "c"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_23);
+}
+
+TEST_F(HandlerSpecTest, Ex7_24_FlowNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "a"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "b"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 1, "c"));
+  EXPECT_CALL(handler, OnAlias(_, 1));
+  EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, ""));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex7_24);
+}
+
+TEST_F(HandlerSpecTest, Ex8_1_BlockScalarHeader) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "literal\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, " folded\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "keep\n\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, " strip"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_1);
+}
+
+TEST_F(HandlerSpecTest, Ex8_2_BlockIndentationHeader) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "detected\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\n\n# detected\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, " explicit\n"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\t\ndetected\n"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_2);
+}
+
+TEST_F(HandlerSpecTest, Ex8_3a_InvalidBlockScalarIndentationIndicators) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex8_3a), ErrorMsg::END_OF_SEQ);
+}
+
+TEST_F(HandlerSpecTest, Ex8_3b_InvalidBlockScalarIndentationIndicators) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex8_3b), ErrorMsg::END_OF_SEQ);
+}
+
+TEST_F(HandlerSpecTest, Ex8_3c_InvalidBlockScalarIndentationIndicators) {
+  EXPECT_THROW_PARSER_EXCEPTION(IgnoreParse(ex8_3c), ErrorMsg::END_OF_SEQ);
+}
+
+TEST_F(HandlerSpecTest, Ex8_4_ChompingFinalLineBreak) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "strip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "clip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "keep"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "text\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_4);
+}
+
+TEST_F(HandlerSpecTest, DISABLED_Ex8_5_ChompingTrailingLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "strip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "# text"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "clip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "# text\n"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "keep"));
+  // NOTE: I believe this is a bug in the YAML spec -
+  // it should be "# text\n\n"
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "# text\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_5);
+}
+
+TEST_F(HandlerSpecTest, Ex8_6_EmptyScalarChomping) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "strip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, ""));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "clip"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, ""));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "keep"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\n"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_6);
+}
+
+TEST_F(HandlerSpecTest, Ex8_7_LiteralScalar) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "literal\n\ttext\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_7);
+}
+
+TEST_F(HandlerSpecTest, Ex8_8_LiteralContent) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "\n\nliteral\n \n\ntext\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_8);
+}
+
+TEST_F(HandlerSpecTest, Ex8_9_FoldedScalar) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "folded text\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_9);
+}
+
+TEST_F(HandlerSpecTest, Ex8_10_FoldedLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_10);
+}
+
+TEST_F(HandlerSpecTest, Ex8_11_MoreIndentedLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_11);
+}
+
+TEST_F(HandlerSpecTest, Ex8_12_EmptySeparationLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_12);
+}
+
+TEST_F(HandlerSpecTest, Ex8_13_FinalEmptyLines) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler,              OnScalar(_, "!", 0,                       "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n"));
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_13);
+}
+
+TEST_F(HandlerSpecTest, Ex8_14_BlockSequence) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "block sequence"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "three"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_14);
+}
+
+TEST_F(HandlerSpecTest, Ex8_15_BlockSequenceEntryTypes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "block node\n"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_15);
+}
+
+TEST_F(HandlerSpecTest, Ex8_16_BlockMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "block mapping"));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_16);
+}
+
+TEST_F(HandlerSpecTest, Ex8_17_ExplicitBlockMappingEntries) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "explicit key"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "block key\n"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "one"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "two"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_17);
+}
+
+TEST_F(HandlerSpecTest, Ex8_18_ImplicitBlockMappingEntries) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "plain key"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "in-line value"));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnNull(_, 0));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "quoted key"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "entry"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_18);
+}
+
+TEST_F(HandlerSpecTest, Ex8_19_CompactBlockMappings) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sun"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "yellow"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "earth"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "blue"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "moon"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "white"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_19);
+}
+
+TEST_F(HandlerSpecTest, Ex8_20_BlockNodeTypes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "flow in block"));
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "Block scalar\n"));
+  EXPECT_CALL(handler,              OnMapStart(_, "tag:yaml.org,2002:map", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_20);
+}
+
+TEST_F(HandlerSpecTest, DISABLED_Ex8_21_BlockScalarNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "literal"));
+  // NOTE: I believe this is a bug in the YAML spec
+  // - it should be "value\n"
+  EXPECT_CALL(handler, OnScalar(_, "!", 0, "value"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "folded"));
+  EXPECT_CALL(handler, OnScalar(_, "!foo", 0, "value"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_21);
+}
+
+TEST_F(HandlerSpecTest, Ex8_22_BlockCollectionNodes) {
+  EXPECT_CALL(handler, OnDocumentStart(_));
+  EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "sequence"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "tag:yaml.org,2002:seq", 0,                                       EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "entry"));
+  EXPECT_CALL(handler, OnSequenceStart(_, "tag:yaml.org,2002:seq", 0,                                       EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "nested"));
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnSequenceEnd());
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "mapping"));
+  EXPECT_CALL(handler,              OnMapStart(_, "tag:yaml.org,2002:map", 0, EmitterStyle::Block));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "foo"));
+  EXPECT_CALL(handler, OnScalar(_, "?", 0, "bar"));
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnMapEnd());
+  EXPECT_CALL(handler, OnDocumentEnd());
+  Parse(ex8_22);
+}
+}
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/libyaml_fail-01.yaml
@@ -0,0 +1,6 @@
+# Ex 8.18
+plain key: in-line value
+:    # Both empty
+"quoted key":
+- entry
+
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/libyaml_fail-02.yaml
@@ -0,0 +1,7 @@
+# Ex 7.17
+{
+unqoted : "separate",
+http://foo.com,
+omitted value:,
+: omitted key,
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/libyaml_fail-03.yaml
@@ -0,0 +1,5 @@
+# ex 7.2
+{
+        foo : !!str,
+        !!str : bar,
+}